Skip to content

Commit b46c6ac

Browse files
Apply indexed schema emission to Synapse as well (#336)
1 parent 836b2f8 commit b46c6ac

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

src/main/scala/models/cdm/SimpleCdmModel.scala

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.sneaksanddata.arcane.framework
22
package models.cdm
33

44
import models.*
5-
import models.schemas.*
5+
import models.schemas.{given_CanAdd_ArcaneSchema, *}
66

77
import upickle.default.*
88

@@ -49,6 +49,8 @@ case class SimpleCdmEntity(
4949
case class SimpleCdmModel(name: String, description: String, version: String, entities: Seq[SimpleCdmEntity])
5050
derives ReadWriter
5151

52+
type IndexedSimpleCdmAttribute = (SimpleCdmAttribute, Int)
53+
5254
given Conversion[SimpleCdmAttribute, ArcaneSchemaField] with
5355
override def apply(entity: SimpleCdmAttribute): ArcaneSchemaField = entity.dataType match
5456
case "guid" => Field(name = entity.name, fieldType = ArcaneType.StringType)
@@ -60,8 +62,21 @@ given Conversion[SimpleCdmAttribute, ArcaneSchemaField] with
6062
case "boolean" => Field(name = entity.name, fieldType = ArcaneType.BooleanType)
6163
case _ => Field(name = entity.name, fieldType = ArcaneType.StringType)
6264

65+
given Conversion[IndexedSimpleCdmAttribute, IndexedField] with
66+
override def apply(indexedAttribute: (SimpleCdmAttribute, Int)): IndexedField =
67+
val field: ArcaneSchemaField = indexedAttribute._1
68+
IndexedField(name = field.name, fieldType = field.fieldType, fieldId = indexedAttribute._2)
69+
6370
given Conversion[SimpleCdmEntity, ArcaneSchema] with
64-
override def apply(entity: SimpleCdmEntity): ArcaneSchema = entity.attributes.map(implicitly) :+ MergeKeyField
71+
override def apply(entity: SimpleCdmEntity): ArcaneSchema =
72+
val baseSchema = entity.attributes
73+
.foldLeft((ArcaneSchema.empty(), 0)) { case ((agg, fieldIndex), attribute) =>
74+
val indexedAttr: IndexedField = (attribute, fieldIndex)
75+
(agg.addIndexedField(indexedAttr.name, indexedAttr.fieldType, indexedAttr.fieldId), fieldIndex + 1)
76+
}
77+
._1
78+
79+
baseSchema.addIndexedField(MergeKeyField.name, MergeKeyField.fieldType, baseSchema.length)
6580

6681
object SimpleCdmModel:
6782
// number of fields in the schema of each entity which do not originate from CDM

src/test/scala/tests/models/SimpleCdmModelTests.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ package com.sneaksanddata.arcane.framework
22
package tests.models
33

44
import models.cdm.{SimpleCdmModel, given_Conversion_SimpleCdmEntity_ArcaneSchema}
5-
import models.schemas.ArcaneSchema
5+
import models.schemas.{ArcaneSchema, IndexedMergeKeyField}
66

7+
import org.scalatest.Inspectors.forAll
78
import org.scalatest.flatspec.AnyFlatSpec
89
import org.scalatest.matchers.must.Matchers
910
import org.scalatest.matchers.should.Matchers.should
@@ -36,5 +37,6 @@ class SimpleCdmModelTests extends AnyFlatSpec with Matchers {
3637
val result: Seq[ArcaneSchema] = read[SimpleCdmModel](serialized).entities.map(implicitly)
3738

3839
noException should be thrownBy result.map(schema => schema.mergeKey).toList
40+
forAll(result.map(schema => schema.mergeKey.asInstanceOf[IndexedMergeKeyField].fieldId == schema.length))
3941
}
4042
}

0 commit comments

Comments
 (0)