11package streams
22
33import org.apache.commons.lang3.StringUtils
4+ import org.neo4j.logging.Log
45import streams.config.StreamsConfig
56import streams.events.EntityType
7+ import streams.events.RelKeyStrategy
68
79
8- private inline fun <reified T > filterMap (config : Map <String , String >, routingPrefix : String , dbName : String = ""): List <T > {
10+ private inline fun <reified T > filterMap (config : Map <String , String >, routingPrefix : String , dbName : String = "", routingSuffix : String? = null, log : Log ? = null ): List <T > {
911 val entityType = when (T ::class ) {
1012 NodeRoutingConfiguration ::class -> EntityType .node
1113 RelationshipRoutingConfiguration ::class -> EntityType .relationship
1214 else -> throw IllegalArgumentException (" The class must be an instance of RoutingConfiguration" )
1315 }
1416 return config
1517 .filterKeys {
18+ val startWithPrefixAndNotEndWithSuffix = it.startsWith(routingPrefix) && routingSuffix?.let { suffix -> ! it.endsWith(suffix) } ? : true
1619 if (it.contains(StreamsRoutingConfigurationConstants .FROM )) {
1720 val topicDbName = it.replace(routingPrefix, StringUtils .EMPTY )
1821 .split(StreamsRoutingConfigurationConstants .FROM )[1 ]
19- it.startsWith(routingPrefix) && topicDbName == dbName // for `from.<db>` we compare the routing prefix and the db name
22+ startWithPrefixAndNotEndWithSuffix && topicDbName == dbName // for `from.<db>` we compare the routing prefix and the db name
2023 } else {
21- dbName == " " && it.startsWith(routingPrefix) // for the default db we only filter by routingPrefix
24+ // for the default db we only filter by routingPrefix
25+ dbName == " " && startWithPrefixAndNotEndWithSuffix
2226 }
2327 }
2428 .flatMap {
25- val topic = it.key.replace(routingPrefix, StringUtils .EMPTY )
26- .split(StreamsRoutingConfigurationConstants .FROM )[0 ]
29+ val prefixAndTopic = it.key.split(StreamsRoutingConfigurationConstants .FROM )[0 ]
30+
31+ val keyStrategy = routingSuffix?.let { suffix ->
32+ print (" suffix - $suffix " )
33+ config.entries.firstOrNull{ it.key.startsWith(prefixAndTopic) && it.key.endsWith(suffix) }?.value
34+ } ? : RelKeyStrategy .DEFAULT .toString().toLowerCase()
35+
2736 RoutingConfigurationFactory
28- .getRoutingConfiguration(topic, it.value, entityType) as List <T >
37+ .getRoutingConfiguration(prefixAndTopic.replace(routingPrefix, StringUtils .EMPTY ),
38+ it.value, entityType, keyStrategy, log) as List <T >
2939 }
3040}
3141
@@ -34,6 +44,7 @@ private object StreamsRoutingConfigurationConstants {
3444 const val REL_ROUTING_KEY_PREFIX : String = " streams.source.topic.relationships."
3545 const val SCHEMA_POLLING_INTERVAL = " streams.source.schema.polling.interval"
3646 const val FROM = " .from."
47+ const val KEY_STRATEGY_SUFFIX = " .key_strategy"
3748}
3849
3950data class StreamsEventRouterConfiguration (val enabled : Boolean = StreamsConfig .SOURCE_ENABLED_VALUE ,
@@ -50,19 +61,23 @@ data class StreamsEventRouterConfiguration(val enabled: Boolean = StreamsConfig.
5061
5162 companion object {
5263
53- fun from (streamsConfig : Map <String , String >, dbName : String , isDefaultDb : Boolean ): StreamsEventRouterConfiguration {
64+ fun from (streamsConfig : Map <String , String >, dbName : String , isDefaultDb : Boolean , log : Log ? = null ): StreamsEventRouterConfiguration {
5465 var nodeRouting = filterMap<NodeRoutingConfiguration >(config = streamsConfig,
5566 routingPrefix = StreamsRoutingConfigurationConstants .NODE_ROUTING_KEY_PREFIX ,
5667 dbName = dbName)
5768 var relRouting = filterMap<RelationshipRoutingConfiguration >(config = streamsConfig,
5869 routingPrefix = StreamsRoutingConfigurationConstants .REL_ROUTING_KEY_PREFIX ,
59- dbName = dbName)
70+ dbName = dbName,
71+ routingSuffix = StreamsRoutingConfigurationConstants .KEY_STRATEGY_SUFFIX ,
72+ log = log)
6073
6174 if (isDefaultDb) {
62- nodeRouting + = filterMap< NodeRoutingConfiguration > (config = streamsConfig,
75+ nodeRouting + = filterMap(config = streamsConfig,
6376 routingPrefix = StreamsRoutingConfigurationConstants .NODE_ROUTING_KEY_PREFIX )
64- relRouting + = filterMap<RelationshipRoutingConfiguration >(config = streamsConfig,
65- routingPrefix = StreamsRoutingConfigurationConstants .REL_ROUTING_KEY_PREFIX )
77+ relRouting + = filterMap(config = streamsConfig,
78+ routingPrefix = StreamsRoutingConfigurationConstants .REL_ROUTING_KEY_PREFIX ,
79+ routingSuffix = StreamsRoutingConfigurationConstants .KEY_STRATEGY_SUFFIX ,
80+ log = log)
6681 }
6782
6883 val default = StreamsEventRouterConfiguration ()
0 commit comments