Skip to content

Commit

Permalink
Fix unnecessarily creating list, getNames return of IdentifiedObject …
Browse files Browse the repository at this point in the history
…and tests update.

Signed-off-by: Jimmy Tung <[email protected]>
  • Loading branch information
Esaotuelr committed Dec 12, 2023
1 parent ffa71bc commit 20c643b
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
*/
package com.zepben.evolve.cim.iec61970.base.core

import com.zepben.evolve.services.common.extensions.asUnmodifiable
import java.util.*

/**
Expand Down Expand Up @@ -46,7 +45,7 @@ abstract class IdentifiedObject(mRID: String = "") {
/**
* The names for this identified object. The returned collection is read only.
*/
val names: Collection<Name> get() = _names.asUnmodifiable()
val names: Collection<Name> get() = _names?.toSet() ?: emptySet()

/**
* Get the number of entries in the [Name] collection.
Expand Down Expand Up @@ -77,15 +76,15 @@ abstract class IdentifiedObject(mRID: String = "") {
* @param type the required [NameType]
* @return List of [Name] with the specified [type] if it exists, otherwise null
*/
fun getNames(type: NameType): List<Name>? = _names?.filter { it.type == type }
fun getNames(type: NameType): List<Name>? = if (_names?.any { it.type == type } == true) _names?.filter { it.type == type } else null

/**
* All name information of the identified object given the name of a [NameType].
*
* @param type the name of the required [NameType]
* @return List of [Name] with the specified [type] if it exists, otherwise null
*/
fun getNames(type: String): List<Name>? = _names?.filter { it.type.name == type }
fun getNames(type: String): List<Name>? = if (_names?.any { it.type.name == type } == true) _names?.filter { it.type.name == type } else null

/**
* Add a [Name] to the [IdentifiedObject]
Expand All @@ -110,8 +109,8 @@ abstract class IdentifiedObject(mRID: String = "") {
*/
fun removeName(name: Name?): Boolean {
val ret = _names?.remove(name) == true
// Remove names from nameType
if (ret) name?.type?.removeName(name)
// Remove names from nameType if nameType contains the name
if (ret && name!!.type.hasName(name.name)) name.type.removeName(name)
if (_names.isNullOrEmpty()) _names = null
return ret
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class NameType(val name: String) {
/**
* All names of this type.
*/
val names: Sequence<Name> get() = namesMultiIndex.flatMap { it.value.values }.asSequence() + namesIndex.values.asSequence()
val names: Sequence<Name> get() = namesMultiIndex.asSequence().flatMap { it.value.values } + namesIndex.values.asSequence()

/**
* Check if the [NameType] contains a [Name].
Expand All @@ -48,7 +48,6 @@ class NameType(val name: String) {
*/
fun getNames(obj: IdentifiedObject): List<Name> =
namesIndex.values
.toList()
.filter { name -> name.identifiedObject == obj } +
namesMultiIndex
.flatMap { it.value.values }
Expand Down Expand Up @@ -85,13 +84,10 @@ class NameType(val name: String) {

namesMultiIndex.containsKey(name) -> {
val names = namesMultiIndex[name]!!
var nameObj = names[identifiedObject]
if (nameObj == null) {
nameObj = Name(name, this, identifiedObject)
names[identifiedObject] = nameObj
names[identifiedObject] ?: Name(name, this, identifiedObject).also {
names[identifiedObject] = it
identifiedObject.addName(this, name)
}
nameObj
}

else -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,10 +106,12 @@ internal class IdentifiedObjectTest {
val (identifiedObject: IdentifiedObject, nameType: NameType) = createMultipleBaseNames()

val nameType2 = NameType("type2")
val nameType3 = NameType("type3")
identifiedObject.addName(nameType2, "1")

assertThat(identifiedObject.getNames(nameType)?.size, equalTo(3))
assertThat(identifiedObject.getNames(nameType2)?.size, equalTo(1))
assertThat(identifiedObject.getNames(nameType3), equalTo(null))
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,13 +107,18 @@ internal class NameTypeTest {
val n1b = nt.getOrAddName("n1", j2)
val n2 = nt.getOrAddName("n2", j2)

assertThat(j1.numNames(), equalTo(1))
assertThat(j2.numNames(), equalTo(2))
assertThat(nt.names.toList(), containsInAnyOrder(n1a, n1b, n2))

assertThat("n1 successfully removed from nt", nt.removeNames("n1"))
assertThat(nt.names.toList(), containsInAnyOrder(n2))
assertThat(j1.numNames(), equalTo(0))
assertThat(j2.numNames(), equalTo(1))

assertThat("n2 successfully removed from nt", nt.removeNames("n2"))
assertThat(nt.names.toList(), empty())
assertThat(j2.numNames(), equalTo(0))

assertThat("n1 can not be removed from nt", !nt.removeNames("n1"))
}
Expand Down Expand Up @@ -152,12 +157,18 @@ internal class NameTypeTest {
assertThat(nt.names.toList(), containsInAnyOrder(n1a, n1b, n2))

assertThat("n1b successfully removed from nt", nt.removeName(n1b))
assertThat(j1.numNames(), equalTo(1))
assertThat(j2.numNames(), equalTo(1))
assertThat(nt.names.toList(), containsInAnyOrder(n1a, n2))

assertThat("n1a successfully removed from nt", nt.removeName(n1a))
assertThat(j1.numNames(), equalTo(0))
assertThat(j2.numNames(), equalTo(1))
assertThat(nt.names.toList(), containsInAnyOrder(n2))

assertThat("n2 successfully removed from nt", nt.removeName(n2))
assertThat(j1.numNames(), equalTo(0))
assertThat(j2.numNames(), equalTo(0))
assertThat(nt.names.toList(), empty())

assertThat("n1a can not be removed from nt", !nt.removeName(n1a))
Expand All @@ -169,16 +180,20 @@ internal class NameTypeTest {
val nt = NameType("nt")

val j1 = Junction()
val j2 = Junction()

val n1 = nt.getOrAddName("n1", j1)
val n2 = nt.getOrAddName("n2", j1)
val n1b = nt.getOrAddName("n1", j2)

assertThat(nt.names.toList(), containsInAnyOrder(n1, n2))
assertThat(nt.names.toList(), containsInAnyOrder(n1, n2, n1b))
assertThat(j1.numNames(), equalTo(2))
assertThat(j2.numNames(), equalTo(1))

nt.clearNames()
assertThat(nt.names.toList(), empty())
assertThat(j1.numNames(), equalTo(0))
assertThat(j2.numNames(), equalTo(0))
}

}

0 comments on commit 20c643b

Please sign in to comment.