Skip to content

Commit

Permalink
finos#1167 move buildQueryEntity to ignite-plugin for better reuse
Browse files Browse the repository at this point in the history
- invloves related refactoring and clean-ups in apache-ignite example.
  • Loading branch information
junaidzm13 committed Mar 17, 2024
1 parent 2c9dd77 commit 44b5f6d
Show file tree
Hide file tree
Showing 10 changed files with 50 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import org.apache.ignite.spi.discovery.tcp.ipfinder.kubernetes.TcpDiscoveryKuber
import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder
import org.apache.ignite.spi.metric.opencensus.OpenCensusMetricExporterSpi
import org.finos.vuu.example.ignite.IgniteLocalConfig._
import org.finos.vuu.example.ignite.schema.ChildOrderEntityObject
import org.finos.vuu.example.ignite.schema.ChildOrderSchema
import org.slf4j.LoggerFactory

import java.util.concurrent.TimeUnit
Expand Down Expand Up @@ -99,7 +99,7 @@ class IgniteLocalConfig(private val clientMode: Boolean,
private def createChildOrderCacheConfig(): CacheConfiguration[?, ?] = {
val cacheConfiguration = new CacheConfiguration()

val queryEntity = ChildOrderEntityObject.buildQueryEntity
val queryEntity = ChildOrderSchema.queryEntity
cacheConfiguration.setQueryEntities(List(queryEntity).asJavaCollection)
cacheConfiguration.setName(childOrderCacheName)
cacheConfiguration.setBackups(backupCount)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import org.apache.ignite.cache.query._
import org.apache.ignite.cluster.ClusterState
import org.apache.ignite.{IgniteCache, Ignition}
import org.finos.vuu.core.module.simul.model.{ChildOrder, OrderStore, ParentOrder}
import org.finos.vuu.example.ignite.schema.ChildOrderEntityObject
import org.finos.vuu.example.ignite.utils.getListToObjectConverter

import java.util
import scala.collection.mutable
Expand Down Expand Up @@ -136,7 +136,7 @@ class IgniteOrderStore(private val parentOrderCache: IgniteCache[Int, ParentOrde
.map(x => x.getValue)
}

private def toChildOrder = ChildOrderEntityObject.getListToChildOrder
private def toChildOrder = getListToObjectConverter[ChildOrder](ChildOrder)

private def mapToString(results: FieldsQueryCursor[util.List[_]]): (Int, ListBuffer[String]) = {
var counter = 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import org.finos.vuu.example.ignite.IgniteOrderStore
import org.finos.vuu.example.ignite.module.IgniteOrderDataModule
import org.finos.vuu.example.ignite.provider.IgniteOrderDataProvider.columnNameByExternalField
import org.finos.vuu.example.ignite.query.IndexCalculator
import org.finos.vuu.example.ignite.schema.ChildOrderEntityObject
import org.finos.vuu.example.ignite.schema.ChildOrderSchema
import org.finos.vuu.plugin.virtualized.table.{VirtualizedRange, VirtualizedSessionTable, VirtualizedViewPortKeys}
import org.finos.vuu.provider.VirtualizedProvider
import org.finos.vuu.util.schema.SchemaMapper
Expand All @@ -18,7 +18,7 @@ import java.util.concurrent.atomic.AtomicInteger
class IgniteOrderDataProvider(final val igniteStore: IgniteOrderStore)
(implicit clock: Clock) extends VirtualizedProvider with StrictLogging {

private val schemaMapper = SchemaMapper(ChildOrderEntityObject.getSchema, IgniteOrderDataModule.columns, columnNameByExternalField)
private val schemaMapper = SchemaMapper(ChildOrderSchema.get, IgniteOrderDataModule.columns, columnNameByExternalField)
private val dataQuery = IgniteOrderDataQuery(igniteStore, schemaMapper)
private val indexCalculator = IndexCalculator(extraRowsCount = 5000)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,19 @@ package org.finos.vuu.example.ignite.schema

import org.apache.ignite.cache.QueryEntity
import org.finos.vuu.core.module.simul.model.ChildOrder
import org.finos.vuu.feature.ignite.utils.buildQueryEntity
import org.finos.vuu.util.schema.{ExternalEntitySchema, ExternalEntitySchemaBuilder}

object ChildOrderEntityObject {
private val _schema = createSchema()
def getSchema: ExternalEntitySchema = _schema
def buildQueryEntity: QueryEntity = BaseIgniteEntityObject.buildQueryEntity(_schema, classOf[Int], classOf[ChildOrder])
def getListToChildOrder: List[_] => ChildOrder = BaseIgniteEntityObject.entityConverter[ChildOrder](ChildOrder)
object ChildOrderSchema {

private def createSchema(): ExternalEntitySchema = {
private val schema: ExternalEntitySchema = {
ExternalEntitySchemaBuilder()
.withCaseClass[ChildOrder]
.withIndex("PARENTID_IDX", List("parentId"))
.withIndex("CHILDID_IDX", List("id"))
.build()
}

def get: ExternalEntitySchema = schema
def queryEntity: QueryEntity = buildQueryEntity(schema, classOf[Int], classOf[ChildOrder])
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.finos.vuu.example.ignite.utils

object getListToObjectConverter {
def apply[ReturnType](obj: Object): List[_] => ReturnType = {
val converter = obj.getClass.getMethods.find(x => x.getName == "apply" && x.isBridge).get
values => converter.invoke(obj, values.map(_.asInstanceOf[AnyRef]): _*).asInstanceOf[ReturnType]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@ import org.apache.ignite.calcite.CalciteQueryEngineConfiguration
import org.apache.ignite.configuration.{IgniteConfiguration, SqlConfiguration}
import org.apache.ignite.{Ignite, Ignition}
import org.finos.vuu.core.module.simul.model.{ChildOrder, ParentOrder}
import org.finos.vuu.example.ignite.schema.ChildOrderEntityObject
import org.finos.vuu.example.ignite.schema.ChildOrderSchema

import java.util
import scala.jdk.CollectionConverters.IterableHasAsJava

object TestUtils {
Expand Down Expand Up @@ -69,7 +68,7 @@ object TestUtils {

childOrderCacheConfiguration.setName("childOrderCache")

childOrderCacheConfiguration.setQueryEntities(List(ChildOrderEntityObject.buildQueryEntity).asJavaCollection)
childOrderCacheConfiguration.setQueryEntities(List(ChildOrderSchema.queryEntity).asJavaCollection)
igniteConfiguration.setCacheConfiguration(parentOrderCacheConfiguration, childOrderCacheConfiguration)

val sqlConfiguration = new SqlConfiguration
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import org.apache.ignite.Ignite
import org.finos.vuu.core.module.simul.model.{ChildOrder, ParentOrder}
import org.finos.vuu.core.sort.SortDirection
import org.finos.vuu.example.ignite.module.IgniteOrderDataModule
import org.finos.vuu.example.ignite.schema.ChildOrderEntityObject
import org.finos.vuu.example.ignite.schema.ChildOrderSchema
import org.finos.vuu.example.ignite.{IgniteOrderStore, TestUtils}
import org.finos.vuu.net.FilterSpec
import org.finos.vuu.util.schema.SchemaMapper
Expand All @@ -13,7 +13,7 @@ import org.scalatest.matchers.should.Matchers
import org.scalatest.BeforeAndAfterAll

class IgniteOrderDataQueryFunctionalTest extends AnyFunSuiteLike with BeforeAndAfterAll with Matchers {
private val schemaMapper = SchemaMapper(ChildOrderEntityObject.getSchema, IgniteOrderDataModule.columns, IgniteOrderDataProvider.columnNameByExternalField)
private val schemaMapper = SchemaMapper(ChildOrderSchema.get, IgniteOrderDataModule.columns, IgniteOrderDataProvider.columnNameByExternalField)
private var ignite: Ignite = _
private var orderStore: IgniteOrderStore = _
private var dataQuery: IgniteOrderDataQuery = _
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.finos.vuu.example.ignite.schema

import org.finos.vuu.example.ignite.utils.getListToObjectConverter
import org.scalatest.featurespec.AnyFeatureSpec
import org.scalatest.matchers.should.Matchers

class getListToObjectConverterTest extends AnyFeatureSpec with Matchers {

Feature("getListToObjectConverterTest") {
Scenario("Can build Dto from a list of values") {
val dto = getListToObjectConverter[TestDto](TestDto)(List("TestObject", 25.5))

dto shouldEqual TestDto(name = "TestObject", value = 25.5)
}
}

private case class TestDto(name: String, value: Double)
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package org.finos.vuu.example.ignite.schema
package org.finos.vuu.feature.ignite.utils

import org.apache.ignite.cache.{QueryEntity, QueryIndex, QueryIndexType}
import org.finos.vuu.util.schema.ExternalEntitySchema

import scala.collection.mutable
import scala.jdk.CollectionConverters._

object BaseIgniteEntityObject {

def buildQueryEntity(schema: ExternalEntitySchema, keyClass: Class[_], valueClass: Class[_]): QueryEntity = {
object buildQueryEntity {
def apply(schema: ExternalEntitySchema, keyClass: Class[_], valueClass: Class[_]): QueryEntity = {
val fields = new java.util.LinkedHashMap[String, String](
mutable.LinkedHashMap.empty.addAll(schema.fields.map(f => (f.name, f.dataType.getName))).asJava
)
Expand All @@ -20,8 +19,4 @@ object BaseIgniteEntityObject {
new QueryEntity(keyClass, valueClass).setFields(fields).setIndexes(queryIndex.asJava)
}

def entityConverter[ReturnType](obj: Object): List[_] => ReturnType = {
val converter = obj.getClass.getMethods.find(x => x.getName == "apply" && x.isBridge).get
values => converter.invoke(obj, values.map(_.asInstanceOf[AnyRef]): _*).asInstanceOf[ReturnType]
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.finos.vuu.example.ignite.schema
package org.finos.vuu.feature.ignite.utils

import org.finos.vuu.util.schema.ExternalEntitySchemaBuilder
import org.scalatest.featurespec.AnyFeatureSpec
Expand All @@ -7,7 +7,7 @@ import org.scalatest.matchers.should.Matchers
import scala.collection.mutable
import scala.jdk.CollectionConverters.{CollectionHasAsScala, MapHasAsScala}

class BaseIgniteEntityObjectTest extends AnyFeatureSpec with Matchers {
class buildQueryEntityTest extends AnyFeatureSpec with Matchers {

Feature("buildQueryEntity") {
val testSchema = ExternalEntitySchemaBuilder()
Expand All @@ -16,22 +16,13 @@ class BaseIgniteEntityObjectTest extends AnyFeatureSpec with Matchers {
.build()

Scenario("Can build query entity") {
val queryEntity = BaseIgniteEntityObject.buildQueryEntity(testSchema, classOf[Long], classOf[TestDto])
val queryEntity = buildQueryEntity(testSchema, classOf[Long], classOf[TestDto])

queryEntity.getFields.asScala shouldEqual mutable.LinkedHashMap.empty.addAll(List(("name", "java.lang.String"), ("value", "double")))
queryEntity.getIndexes.size shouldEqual 1
queryEntity.getIndexes.asScala.head.getName shouldEqual "TEST_INDEX"
}
}

Feature("entityConverter") {
Scenario("Can build Dto from list of values") {
val dto = BaseIgniteEntityObject.entityConverter[TestDto](TestDto)(List("TestObject", 25.5))

dto shouldEqual TestDto(name = "TestObject", value = 25.5)
}
}
private case class TestDto(name: String, value: Double)
}


private case class TestDto(name: String, value: Double)

0 comments on commit 44b5f6d

Please sign in to comment.