in src/main/software/amazon/event/ruler/Event.java [211:245]
private static List<String> doFlatten(final JsonNode eventRoot) throws IllegalArgumentException {
final TreeMap<String, List<String>> fields = new TreeMap<>();
if (!eventRoot.isObject()) {
throw new IllegalArgumentException("Event must be a JSON object");
}
final Stack<String> path = new Stack<>();
flattenObject(eventRoot, fields, path);
// Ruler algorithm will explore all possible matches based on field (key value pair) in event, duplicated fields
// in event do NOT impact final matches but it will downgrade the performance by producing duplicated
// checking Steps, in worse case, those the duplicated steps can stuck the process and use up all memory, so when
// building the event, dedupe the fields from event can low such risk.
final Set<String> uniqueValues = new HashSet<>();
final List<String> nameVals = new ArrayList<>();
for (Map.Entry<String, List<String>> entry : fields.entrySet()) {
String k = entry.getKey();
List<String> vs = entry.getValue();
if(vs.size() != 1) {
uniqueValues.clear();
for (String v : vs) {
if (uniqueValues.add(v)) {
nameVals.add(k);
nameVals.add(v);
}
}
} else {
nameVals.add(k);
nameVals.add(vs.get(0));
}
}
return nameVals;
}