From 20c643b31e8a37d6780a35210edf132632863c2d Mon Sep 17 00:00:00 2001 From: Jimmy Tung Date: Tue, 12 Dec 2023 15:09:43 +1100 Subject: [PATCH] Fix unnecessarily creating list, getNames return of IdentifiedObject and tests update. Signed-off-by: Jimmy Tung --- .../cim/iec61970/base/core/IdentifiedObject.kt | 11 +++++------ .../evolve/cim/iec61970/base/core/NameType.kt | 10 +++------- .../iec61970/base/core/IdentifiedObjectTest.kt | 2 ++ .../cim/iec61970/base/core/NameTypeTest.kt | 17 ++++++++++++++++- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/main/kotlin/com/zepben/evolve/cim/iec61970/base/core/IdentifiedObject.kt b/src/main/kotlin/com/zepben/evolve/cim/iec61970/base/core/IdentifiedObject.kt index 78ff08436..098574426 100644 --- a/src/main/kotlin/com/zepben/evolve/cim/iec61970/base/core/IdentifiedObject.kt +++ b/src/main/kotlin/com/zepben/evolve/cim/iec61970/base/core/IdentifiedObject.kt @@ -7,7 +7,6 @@ */ package com.zepben.evolve.cim.iec61970.base.core -import com.zepben.evolve.services.common.extensions.asUnmodifiable import java.util.* /** @@ -46,7 +45,7 @@ abstract class IdentifiedObject(mRID: String = "") { /** * The names for this identified object. The returned collection is read only. */ - val names: Collection get() = _names.asUnmodifiable() + val names: Collection get() = _names?.toSet() ?: emptySet() /** * Get the number of entries in the [Name] collection. @@ -77,7 +76,7 @@ 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? = _names?.filter { it.type == type } + fun getNames(type: NameType): List? = 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]. @@ -85,7 +84,7 @@ abstract class IdentifiedObject(mRID: String = "") { * @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? = _names?.filter { it.type.name == type } + fun getNames(type: String): List? = if (_names?.any { it.type.name == type } == true) _names?.filter { it.type.name == type } else null /** * Add a [Name] to the [IdentifiedObject] @@ -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 } diff --git a/src/main/kotlin/com/zepben/evolve/cim/iec61970/base/core/NameType.kt b/src/main/kotlin/com/zepben/evolve/cim/iec61970/base/core/NameType.kt index bdb71c9f0..d8a00b822 100644 --- a/src/main/kotlin/com/zepben/evolve/cim/iec61970/base/core/NameType.kt +++ b/src/main/kotlin/com/zepben/evolve/cim/iec61970/base/core/NameType.kt @@ -30,7 +30,7 @@ class NameType(val name: String) { /** * All names of this type. */ - val names: Sequence get() = namesMultiIndex.flatMap { it.value.values }.asSequence() + namesIndex.values.asSequence() + val names: Sequence get() = namesMultiIndex.asSequence().flatMap { it.value.values } + namesIndex.values.asSequence() /** * Check if the [NameType] contains a [Name]. @@ -48,7 +48,6 @@ class NameType(val name: String) { */ fun getNames(obj: IdentifiedObject): List = namesIndex.values - .toList() .filter { name -> name.identifiedObject == obj } + namesMultiIndex .flatMap { it.value.values } @@ -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 -> { diff --git a/src/test/kotlin/com/zepben/evolve/cim/iec61970/base/core/IdentifiedObjectTest.kt b/src/test/kotlin/com/zepben/evolve/cim/iec61970/base/core/IdentifiedObjectTest.kt index fdf9a7737..305ab7922 100644 --- a/src/test/kotlin/com/zepben/evolve/cim/iec61970/base/core/IdentifiedObjectTest.kt +++ b/src/test/kotlin/com/zepben/evolve/cim/iec61970/base/core/IdentifiedObjectTest.kt @@ -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 diff --git a/src/test/kotlin/com/zepben/evolve/cim/iec61970/base/core/NameTypeTest.kt b/src/test/kotlin/com/zepben/evolve/cim/iec61970/base/core/NameTypeTest.kt index fee0751a3..5348d04cc 100644 --- a/src/test/kotlin/com/zepben/evolve/cim/iec61970/base/core/NameTypeTest.kt +++ b/src/test/kotlin/com/zepben/evolve/cim/iec61970/base/core/NameTypeTest.kt @@ -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")) } @@ -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)) @@ -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)) } }