From 7bf8264e899f5901aa93f2b35b07ed2dfa40fcbf Mon Sep 17 00:00:00 2001 From: Jakub Amanowicz Date: Tue, 3 Sep 2024 12:29:52 +0200 Subject: [PATCH] CASL-391 fix for geo population --- .../kotlin/naksha/psql/PgStorage.kt | 19 ++++--- .../commonTest/kotlin/naksha/psql/TestPsql.kt | 54 +++++++++++++++++++ .../assertions/AnyObjectFluidAsserions.kt | 5 ++ 3 files changed, 71 insertions(+), 7 deletions(-) diff --git a/here-naksha-lib-psql/src/commonMain/kotlin/naksha/psql/PgStorage.kt b/here-naksha-lib-psql/src/commonMain/kotlin/naksha/psql/PgStorage.kt index aff38b2d8..2df2174a2 100644 --- a/here-naksha-lib-psql/src/commonMain/kotlin/naksha/psql/PgStorage.kt +++ b/here-naksha-lib-psql/src/commonMain/kotlin/naksha/psql/PgStorage.kt @@ -374,15 +374,20 @@ WHERE relname IN ('$NAKSHA_TXN_SEQ', '$NAKSHA_MAP_SEQ') AND relnamespace=${defau override fun tupleToFeature(tuple: Tuple): NakshaFeature { return if (tuple.feature != null) { - // TODO: FIXME, we need the XYZ namespace val feature = PgUtil.decodeFeature(tuple.feature, tuple.meta.flags, JbDictManager()) - feature?.properties?.xyz = xyzFrom(tuple.meta, decodedTags = null) // TODOL: tag list - return feature ?: throw NakshaException( - NakshaError( - NakshaError.EXCEPTION, - "Could not deserialize feature for tuple number: ${tuple.tupleNumber}" + if(feature == null){ + throw NakshaException( + NakshaError( + NakshaError.EXCEPTION, + "Could not deserialize feature for tuple number: ${tuple.tupleNumber}" + ) ) - ) + } + feature.properties.xyz = xyzFrom(tuple.meta, decodedTags = null) // TODO: tag list + tuple.geo?.let { geoBytes -> + feature.geometry = PgUtil.decodeGeometry(geoBytes, tuple.meta.flags) + } + return feature } else { TODO("We will always have at least the id, which is formally enough to generate an empty feature!") } diff --git a/here-naksha-lib-psql/src/commonTest/kotlin/naksha/psql/TestPsql.kt b/here-naksha-lib-psql/src/commonTest/kotlin/naksha/psql/TestPsql.kt index c166bdd18..82b499e6d 100644 --- a/here-naksha-lib-psql/src/commonTest/kotlin/naksha/psql/TestPsql.kt +++ b/here-naksha-lib-psql/src/commonTest/kotlin/naksha/psql/TestPsql.kt @@ -2,6 +2,8 @@ package naksha.psql import naksha.base.* import naksha.base.PlatformUtil.PlatformUtilCompanion.randomString +import naksha.geo.PointCoord +import naksha.geo.SpPoint import naksha.model.Action import naksha.model.IReadSession import naksha.model.IWriteSession @@ -14,6 +16,8 @@ import naksha.model.objects.NakshaProperties import naksha.model.request.* import naksha.psql.PgTest.PgTest_C.TEST_APP_AUTHOR import naksha.psql.PgTest.PgTest_C.TEST_APP_ID +import naksha.psql.assertions.AnyObjectFluidAssertions +import naksha.psql.assertions.AnyObjectFluidAssertions.Companion.assertThatAnyObject import naksha.psql.assertions.NakshaFeatureFluidAssertions.Companion.assertThatFeature import kotlin.test.* @@ -175,6 +179,56 @@ class TestPsql { } } } + } + + @Test + fun returns_saved_geometry() { + // Given: Create collection request + val col = NakshaCollection("test_${randomString().lowercase()}") + val writeCollectionRequest = WriteRequest() + writeCollectionRequest.writes += Write().createCollection(null, col) + + // And: create feature with geo + val writeFeaturesReq = WriteRequest() + val feature = NakshaFeature().apply { + id = "test_feature" + geometry = SpPoint(PointCoord(1.0,2.0, 0.0)) + } + writeFeaturesReq.add( + Write().createFeature(null, col.id, feature) + ) + // When: executing collection write request + env.storage.newWriteSession().use { session: IWriteSession -> + val response = session.execute(writeCollectionRequest) + assertIs(response) + session.commit() + } + + // And: executing feature write request + env.storage.newWriteSession().use { session: IWriteSession -> + val response = session.execute(writeFeaturesReq) + assertIs(response) + session.commit() + } + + // Then: feature is retrievable from the collection + val retrievedFeature = env.storage.newReadSession().use { session: IReadSession -> + val response = session.execute( + ReadFeatures().apply { + collectionIds += col.id + featureIds += feature.id + } + ) + assertIs(response) + val features = response.features + assertEquals(1, features.size) + features[0]!! + } + + // And: + assertNotNull(retrievedFeature.geometry) + assertThatAnyObject(retrievedFeature.geometry!!) + .isIdenticalTo(feature.geometry!!) } } \ No newline at end of file diff --git a/here-naksha-lib-psql/src/commonTest/kotlin/naksha/psql/assertions/AnyObjectFluidAsserions.kt b/here-naksha-lib-psql/src/commonTest/kotlin/naksha/psql/assertions/AnyObjectFluidAsserions.kt index e1ef4fe7e..d144c910f 100644 --- a/here-naksha-lib-psql/src/commonTest/kotlin/naksha/psql/assertions/AnyObjectFluidAsserions.kt +++ b/here-naksha-lib-psql/src/commonTest/kotlin/naksha/psql/assertions/AnyObjectFluidAsserions.kt @@ -1,11 +1,16 @@ package naksha.psql.assertions import naksha.base.AnyObject +import naksha.psql.assertions.CommonProxyAssertions.assertAnyObjectsEqual import kotlin.test.assertEquals import kotlin.test.assertTrue class AnyObjectFluidAssertions private constructor(val subject: AnyObject) { + fun isIdenticalTo(other: AnyObject){ + assertAnyObjectsEqual(subject, other) + } + fun hasProperty(key: String, value: Any): AnyObjectFluidAssertions = apply { assertTrue(subject.contains(key), "Missing property: $key")