package org.skywalking.apm.collector.worker.storage; import org.skywalking.apm.collector.actor.selector.AbstractHashMessage; import java.util.*; /** * @author pengys5 */ public class JoinAndSplitData extends AbstractHashMessage implements Data { public static final String SPLIT = ","; private String id; private Map<String, Set<String>> data = new HashMap<>(); public JoinAndSplitData(String key) { super(key); this.id = key; } public String getId() { return id; } public void set(String attributeName, String value) { if (!data.containsKey(attributeName)) { data.put(attributeName, new HashSet<>()); } data.get(attributeName).add(value); } public void merge(JoinAndSplitData source) { source.data.forEach((attributeName, valueSet) -> valueSet.forEach(value -> set(attributeName, value))); } public void merge(Map<String, ?> source) { source.forEach((column, dbValue) -> { if (!AbstractIndex.TIME_SLICE.equals(column) && !AbstractIndex.AGG_COLUMN.equals(column)) { String[] dbValues = String.valueOf(dbValue).split(SPLIT); for (String value : dbValues) { set(column, value); } } }); } public Map<String, String> asMap() { Map<String, String> source = new HashMap<>(); data.forEach((attributeName, valueSet) -> { Iterator<String> iterator = valueSet.iterator(); StringBuilder builder = new StringBuilder(); int i = 0; while (iterator.hasNext()) { if (i == 0) { builder.append(iterator.next()); } else { builder.append(SPLIT).append(iterator.next()); } i++; } source.put(attributeName, builder.toString()); }); return source; } }