Skip to content
This repository was archived by the owner on Jul 21, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions config/customer-groups.yaml
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
customer-groups:
# number of generated customer groups
elementCount: 15
# range of customers per customer group
elementCount: 100

# range of customers per customer group - will be ignored if rules are present (see below)
minCustomers: 5
maxCustomers: 50

# generate random custom attributes
generatedAttributes:
elementCount: 5

rules:
includeConditions:
- attributePath: session.sourceCodeGroup
operator: is-equal
4 changes: 2 additions & 2 deletions config/sourcecodes.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
sourcecodes:
# number of generated source code groups
elementCount: 10
elementCount: 100
# range of codes per source code group
minCodes: 1
maxCodes: 10
maxCodes: 1

# generate random custom attributes
generatedAttributes:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
package com.salesforce.comdagen.config

import com.fasterxml.jackson.annotation.JsonRootName
import com.salesforce.comdagen.Configuration
import com.salesforce.comdagen.ExtendableObjectConfig
import com.salesforce.comdagen.RenderConfig

Expand All @@ -17,17 +18,55 @@ data class CustomerGroupConfiguration(

val maxCustomers: Int = 100,


override val customAttributes: Map<String, AttributeConfig>? = null,

override val generatedAttributes: GeneratedAttributeConfig? = null,

override val elementCount: Int = 5,
override val initialSeed: Long,

val rules: CustomerGroupConditions? = null,

override val outputFilePattern: String = "generated.xml",
override val outputDir: String = "",
override val templateName: String = "customer-groups.ftlx"

) : RenderConfig, ExtendableObjectConfig {
init {
require(maxCustomers >= minCustomers, { "maxCustomers needs to be greater equal minCustomers" })
}
}

}

class CustomerGroupConditions(override val initialSeed: Long) : Configuration {
val includeConditions: List<CustomerGroupCondition> = listOf()
val excludeConditions: List<CustomerGroupCondition> = listOf()
override val elementCount: Int
get() = 2

override fun equals(other: Any?): Boolean{
if (this === other) return true
if (other?.javaClass != javaClass) return false

other as CustomerGroupConditions

if (includeConditions != other.includeConditions) return false
if (excludeConditions != other.excludeConditions) return false

return true
}


override fun hashCode(): Int {
return includeConditions.hashCode() + 31 * excludeConditions.hashCode()
}

}
class CustomerGroupCondition(
val attributePath: String,
val operator: String) {

val value: String? = null

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,21 @@ import com.salesforce.comdagen.config.CustomerGroupConfiguration
import com.salesforce.comdagen.model.AttributeDefinition
import com.salesforce.comdagen.model.CustomerGroup
import com.salesforce.comdagen.model.GroupAssignment
import com.salesforce.comdagen.model.GroupCondition
import java.util.*

data class CustomerGroupGenerator(
override val configuration: CustomerGroupConfiguration,
private val customerConfig: CustomerConfiguration
private val customerConfig: CustomerConfiguration,
private val sourceCodes: List<String>
) : Generator<CustomerGroupConfiguration, CustomerGroup> {

override val creatorFunc = { _: Int, seed: Long -> CustomerGroup(seed, metadata["CustomerGroup"].orEmpty()) }
override val creatorFunc = { idx: Int, seed: Long -> CustomerGroup(idx, seed, metadata["CustomerGroup"].orEmpty(), includeConditions) }

val assignments: Sequence<GroupAssignment>
get() {
if(configuration.rules != null)
return emptySequence()
val groups = objects
val rng = Random(configuration.initialSeed)
return groups.flatMap { group ->
Expand All @@ -35,6 +39,13 @@ data class CustomerGroupGenerator(
(1..customerCount).asSequence().map { GroupAssignment(group.id, getRandomCustomer(rng.nextInt())) }
}
}
private val includeConditions: (Int) -> List<GroupCondition>? = { idx ->
configuration.rules?.includeConditions?.map { condition -> GroupCondition(condition.attributePath ,condition.operator, sourceCodes[idx]) }
}
val excludeConditions: List<GroupCondition>?
get() {
TODO()
}

override val metadata: Map<String, Set<AttributeDefinition>> = mapOf(
"CustomerGroup" to configuration.attributeDefinitions("CustomerGroup")
Expand Down
5 changes: 4 additions & 1 deletion src/main/java/com/salesforce/comdagen/model/CustomerGroup.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,21 @@ package com.salesforce.comdagen.model
import com.salesforce.comdagen.RandomData
import java.util.*

class CustomerGroup(private val seed: Long, private val attributeDefinitions: Set<AttributeDefinition>) {
class CustomerGroup(private val idx: Int, private val seed: Long, private val attributeDefinitions: Set<AttributeDefinition>, includeConditions: (Int) -> List<GroupCondition>?) {
val id: String
get() = "comdagen-${Math.abs(seed)}"

val description: String
get() = RandomData.getRandomSentence(seed + "customerGroupDescription".hashCode())

val conditions: List<GroupCondition>? = includeConditions(idx.toInt())

val customAttributes: List<CustomAttribute>
get() {
val rng = Random(seed + "customAttributes".hashCode())
return attributeDefinitions.map { CustomAttribute(it, rng.nextLong()) }
}
}

data class GroupCondition(val attributePath: String, val operator: String, val value: String)
data class GroupAssignment(val groupId: String, val customerId: Int)
16 changes: 8 additions & 8 deletions src/main/java/com/salesforce/comdagen/model/Site.kt
Original file line number Diff line number Diff line change
Expand Up @@ -142,9 +142,15 @@ class Site(
else
null

val sourceCodeGenerator: SourceCodeGenerator? =
if (sourceCodeConfig != null)
SourceCodeGenerator(sourceCodeConfig)
else
null

val customerGroupGenerator: CustomerGroupGenerator? =
if (customerGroupConfig != null && customerConfig != null)
CustomerGroupGenerator(customerGroupConfig, customerConfig)
if (customerGroupConfig != null && customerConfig != null && sourceCodeConfig != null)
CustomerGroupGenerator(customerGroupConfig, customerConfig, sourceCodeGenerator?.objects?.toList()?.map { it.id } ?: kotlin.collections.emptyList())
else
null

Expand All @@ -154,12 +160,6 @@ class Site(
else
null

val sourceCodeGenerator: SourceCodeGenerator? =
if (sourceCodeConfig != null)
SourceCodeGenerator(sourceCodeConfig)
else
null

val promotionGenerator: PromotionGenerator? = if (promotionConfig != null && catalogGenerator != null)
PromotionGenerator(promotionConfig, catalogGenerator.objects.first(),
customerGroups = customerGroupGenerator?.objects?.map { it.id }?.toList() ?: emptyList(),
Expand Down
20 changes: 12 additions & 8 deletions src/test/java/com/salesforce/comdagen/CustomerGroupTest.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package com.salesforce.comdagen

import com.salesforce.comdagen.config.AttributeConfig
import com.salesforce.comdagen.config.CustomerConfiguration
import com.salesforce.comdagen.config.CustomerGroupConfiguration
import com.salesforce.comdagen.config.GeneratedAttributeConfig
import com.salesforce.comdagen.config.*
import com.salesforce.comdagen.generator.CustomerGroupGenerator
import org.junit.Test
import java.util.*
import kotlin.test.assertEquals
import kotlin.test.assertNotEquals
import kotlin.test.assertTrue
Expand All @@ -21,8 +19,9 @@ class CustomerGroupTest {
val elementCount = 30
val customerConfig = CustomerConfiguration(initialSeed = seed)
val customerGroupConfig = CustomerGroupConfiguration(elementCount = elementCount, initialSeed = seed)
val sourceCodeConfig = SourceCodeConfiguration(initialSeed = seed)
val customerGroupGenerator =
CustomerGroupGenerator(configuration = customerGroupConfig, customerConfig = customerConfig)
CustomerGroupGenerator(configuration = customerGroupConfig, customerConfig = customerConfig, sourceCodes = Collections.emptyList<String>())

assertEquals(elementCount, customerGroupGenerator.objects.count())
}
Expand All @@ -37,8 +36,9 @@ class CustomerGroupTest {
minCustomers = minCustomers, maxCustomers = maxCustomers,
elementCount = elementCount, initialSeed = seed
)
val sourceCodeConfig = SourceCodeConfiguration(initialSeed = seed)
val customerGroupGenerator =
CustomerGroupGenerator(configuration = customerGroupConfig, customerConfig = customerConfig)
CustomerGroupGenerator(configuration = customerGroupConfig, customerConfig = customerConfig, sourceCodes = Collections.emptyList<String>())

customerGroupGenerator.objects.forEach { group ->
val assignmentCount: Int = customerGroupGenerator.assignments.count { it.groupId == group.id }
Expand All @@ -63,9 +63,11 @@ class CustomerGroupTest {
val customAttribute: Map<String, AttributeConfig> = mapOf(name to attributeConfig)

val customerGroupConfig = CustomerGroupConfiguration(customAttributes = customAttribute, initialSeed = seed)
val sourceCodeConfig = SourceCodeConfiguration(initialSeed = seed)
val customerGroupGenerator = CustomerGroupGenerator(
configuration = customerGroupConfig,
customerConfig = CustomerConfiguration(initialSeed = seed)
customerConfig = CustomerConfiguration(initialSeed = seed),
sourceCodes = Collections.emptyList<String>()
)

assertEquals(customAttribute.values.size, customerGroupGenerator.metadata.values.sumBy { it.size })
Expand All @@ -85,9 +87,11 @@ class CustomerGroupTest {
val elementCount = 15
val customerGroupConfig =
CustomerGroupConfiguration(generatedAttributes = GeneratedAttributeConfig(elementCount), initialSeed = seed)
val sourceCodeConfiguration = SourceCodeConfiguration(initialSeed = seed)
val customerGroupGenerator = CustomerGroupGenerator(
configuration = customerGroupConfig,
customerConfig = CustomerConfiguration(initialSeed = seed)
customerConfig = CustomerConfiguration(initialSeed = seed),
sourceCodes = Collections.emptyList<String>()
)

customerGroupGenerator.objects.forEach { group ->
Expand Down
4 changes: 3 additions & 1 deletion src/test/java/com/salesforce/comdagen/PromotionTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.salesforce.comdagen.model.OrderPromotion
import com.salesforce.comdagen.model.ProductPromotion
import com.salesforce.comdagen.model.ShippingPromotion
import org.junit.Test
import java.util.*
import kotlin.test.assertEquals
import kotlin.test.assertTrue

Expand Down Expand Up @@ -431,7 +432,8 @@ class PromotionTest {

val customerConfig = CustomerConfiguration(initialSeed = seed)
val customerGroupConfig = CustomerGroupConfiguration(initialSeed = seed)
val customerGroupGenerator = CustomerGroupGenerator(customerGroupConfig, customerConfig)
val sourceCodeConfiguration = SourceCodeConfiguration(initialSeed = seed)
val customerGroupGenerator = CustomerGroupGenerator(customerGroupConfig, customerConfig, sourceCodes = Collections.emptyList<String>())

val customerGroupIds = customerGroupGenerator.objects.map { it.id }.toList()
.plus(listOf("Everyone", "Registered", "Unregistered"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import org.xmlunit.validation.Languages
import java.io.File
import java.nio.file.Files
import java.nio.file.StandardCopyOption
import java.util.*
import javax.xml.transform.stream.StreamSource
import javax.xml.validation.SchemaFactory
import javax.xml.validation.Validator
Expand Down Expand Up @@ -218,7 +219,7 @@ class SchemaVerificationTest {
fun testCustomerGroupValid() {
val customerConfig = CustomerConfiguration(initialSeed = seed)
val customerGroupConfig = CustomerGroupConfiguration(initialSeed = seed)
val customerGroupGenerator = CustomerGroupGenerator(customerGroupConfig, customerConfig)
val customerGroupGenerator = CustomerGroupGenerator(customerGroupConfig, customerConfig, sourceCodes = Collections.emptyList<String>())

val v = getValidator("/schema/customergroup.xsd")

Expand Down Expand Up @@ -309,7 +310,7 @@ class SchemaVerificationTest {
val catalog = CatalogGenerator(CatalogListConfiguration(initialSeed = seed)).objects.first()
val customerGroupIds = CustomerGroupGenerator(
CustomerGroupConfiguration(initialSeed = seed),
CustomerConfiguration(initialSeed = seed)
CustomerConfiguration(initialSeed = seed), sourceCodes = Collections.emptyList<String>()
).objects.map { it.id }.toList()
val shippingMethods =
ShippingGenerator(ShippingConfiguration(initialSeed = seed)).objects.map { it.id }.toList()
Expand Down
15 changes: 15 additions & 0 deletions templates/customer-groups.ftlx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,21 @@
<#list gen.objects as group>
<customer-group group-id="${group.id}">
<description>${group.description}</description>
<#if group.conditions?has_content>
<membership-rule>
<included-customers>
<condition-group match-mode="all">
<#list group.conditions as condition>
<condition>
<attribute-path>${condition.attributePath}</attribute-path>
<operator>${condition.operator}</operator>
<string>${condition.value}</string>
</condition>
</#list>
</condition-group>
</included-customers>
</membership-rule>
</#if>
<#if group.customAttributes?has_content>
<custom-attributes>
<#list group.customAttributes as attribute>
Expand Down