use of com.bakdata.conquery.models.datasets.concepts.tree.ConceptTreeChild in project conquery by bakdata.
the class FrontEndConceptBuilder method createCTRoot.
private static FENode createCTRoot(Concept<?> c, StructureNode[] structureNodes) {
MatchingStats matchingStats = c.getMatchingStats();
StructureNodeId structureParent = Arrays.stream(structureNodes).filter(sn -> sn.getContainedRoots().contains(c.getId())).findAny().map(StructureNode::getId).orElse(null);
FENode n = FENode.builder().active(true).description(c.getDescription()).label(c.getLabel()).additionalInfos(c.getAdditionalInfos()).matchingEntries(matchingStats.countEvents()).matchingEntities(matchingStats.countEntities()).dateRange(matchingStats.spanEvents() != null ? matchingStats.spanEvents().toSimpleRange() : null).detailsAvailable(Boolean.TRUE).codeListResolvable(c.countElements() > 1).parent(structureParent).selects(c.getSelects().stream().map(FrontEndConceptBuilder::createSelect).collect(Collectors.toList())).tables(c.getConnectors().stream().map(FrontEndConceptBuilder::createTable).collect(Collectors.toList())).build();
if (c instanceof ConceptTreeNode) {
ConceptTreeNode<?> tree = (ConceptTreeNode<?>) c;
if (tree.getChildren() != null) {
n.setChildren(tree.getChildren().stream().map(ConceptTreeChild::getId).toArray(ConceptTreeChildId[]::new));
}
}
return n;
}
use of com.bakdata.conquery.models.datasets.concepts.tree.ConceptTreeChild in project conquery by bakdata.
the class ConceptsProcessor method resolveConceptElements.
public ResolvedConceptsResult resolveConceptElements(TreeConcept concept, List<String> conceptCodes) {
List<ConceptElementId<?>> resolvedCodes = new ArrayList<>();
List<String> unknownCodes = new ArrayList<>();
if (concept == null) {
return new ResolvedConceptsResult(null, null, conceptCodes);
}
for (String conceptCode : conceptCodes) {
ConceptTreeChild child;
try {
child = concept.findMostSpecificChild(conceptCode, new CalculatedValue<>(Collections::emptyMap));
if (child != null) {
resolvedCodes.add(child.getId());
} else {
unknownCodes.add(conceptCode);
}
} catch (ConceptConfigurationException e) {
log.error("Error while trying to resolve " + conceptCode, e);
}
}
return new ResolvedConceptsResult(resolvedCodes, null, unknownCodes);
}
use of com.bakdata.conquery.models.datasets.concepts.tree.ConceptTreeChild in project conquery by bakdata.
the class CBlock method calculateSpecificChildrenPaths.
/**
* Calculates the path for each event from the root of the {@link TreeConcept} to the most specific {@link ConceptTreeChild}
* denoted by the individual {@link ConceptTreeChild#getPrefix()}.
*/
private static int[][] calculateSpecificChildrenPaths(Bucket bucket, ConceptTreeConnector connector) {
final Column column = connector.getColumn();
final TreeConcept treeConcept = connector.getConcept();
final StringStore stringStore;
// If we have a column and it is of string-type, we create indices and caches.
if (column != null && bucket.getStores()[column.getPosition()] instanceof StringStore) {
stringStore = (StringStore) bucket.getStores()[column.getPosition()];
// Create index and insert into Tree.
TreeChildPrefixIndex.putIndexInto(treeConcept);
treeConcept.initializeIdCache(stringStore, bucket.getImp());
} else // No column only possible if we have just one tree element!
if (treeConcept.countElements() == 1) {
stringStore = null;
} else {
throw new IllegalStateException(String.format("Cannot build tree over Connector[%s] without Column", connector.getId()));
}
final int[][] mostSpecificChildren = new int[bucket.getNumberOfEvents()][];
Arrays.fill(mostSpecificChildren, ConceptTreeConnector.NOT_CONTAINED);
final ConceptTreeCache cache = treeConcept.getCache(bucket.getImp());
final int[] root = treeConcept.getPrefix();
for (int event = 0; event < bucket.getNumberOfEvents(); event++) {
try {
// Events can also be filtered, allowing a single table to be used by multiple connectors.
if (column != null && !bucket.has(event, column)) {
mostSpecificChildren[event] = Connector.NOT_CONTAINED;
continue;
}
String stringValue = "";
int valueIndex = -1;
if (stringStore != null) {
valueIndex = bucket.getString(event, column);
stringValue = stringStore.getElement(valueIndex);
}
// Lazy evaluation of map to avoid allocations if possible.
// Copy event for closure.
final int _event = event;
final CalculatedValue<Map<String, Object>> rowMap = new CalculatedValue<>(() -> bucket.calculateMap(_event));
if ((connector.getCondition() != null && !connector.getCondition().matches(stringValue, rowMap))) {
mostSpecificChildren[event] = Connector.NOT_CONTAINED;
continue;
}
ConceptTreeChild child = cache == null ? treeConcept.findMostSpecificChild(stringValue, rowMap) : cache.findMostSpecificChild(valueIndex, stringValue, rowMap);
// All unresolved elements resolve to the root.
if (child == null) {
mostSpecificChildren[event] = root;
continue;
}
// put path into event
mostSpecificChildren[event] = child.getPrefix();
} catch (ConceptConfigurationException ex) {
log.error("Failed to resolve event {}-{} against concept {}", bucket, event, treeConcept, ex);
}
}
if (cache != null) {
log.trace("Hits: {}, Misses: {}, Hits/Misses: {}, %Hits: {} (Up to now)", cache.getHits(), cache.getMisses(), (double) cache.getHits() / cache.getMisses(), (double) cache.getHits() / (cache.getHits() + cache.getMisses()));
}
return mostSpecificChildren;
}
Aggregations