use of com.bakdata.conquery.apiv1.query.concept.filter.CQTable in project conquery by bakdata.
the class FilterTest method parseQuery.
private Query parseQuery(StandaloneSupport support) throws JSONException, IOException {
rawFilterValue.put("filter", support.getDataset().getName() + ".concept.connector.filter");
FilterValue<?> result = parseSubTree(support, rawFilterValue, Jackson.MAPPER.getTypeFactory().constructType(FilterValue.class));
CQTable cqTable = new CQTable();
cqTable.setFilters(Collections.singletonList(result));
cqTable.setConnector(connector);
CQConcept cqConcept = new CQConcept();
cqTable.setConcept(cqConcept);
cqConcept.setElements(Collections.singletonList(concept));
cqConcept.setTables(Collections.singletonList(cqTable));
if (dateRange != null) {
CQDateRestriction restriction = new CQDateRestriction();
restriction.setDateRange(dateRange);
restriction.setChild(cqConcept);
return new ConceptQuery(restriction);
}
return new ConceptQuery(cqConcept);
}
use of com.bakdata.conquery.apiv1.query.concept.filter.CQTable in project conquery by bakdata.
the class CQConcept method createQueryPlan.
@Override
public QPNode createQueryPlan(QueryPlanContext context, ConceptQueryPlan plan) {
final List<Aggregator<?>> conceptAggregators = createAggregators(plan, selects);
List<QPNode> tableNodes = new ArrayList<>();
for (CQTable table : tables) {
List<FilterNode<?>> filters = table.getFilters().stream().map(FilterValue::createNode).collect(Collectors.toList());
// add filter to children
List<Aggregator<?>> aggregators = new ArrayList<>();
aggregators.addAll(conceptAggregators);
final List<Aggregator<?>> connectorAggregators = createAggregators(plan, table.getSelects());
// Exists aggregators hold a reference to their parent FiltersNode so they need to be treated separately.
// They also don't need aggregation as they simply imitate their reference.
List<ExistsAggregator> existsAggregators = connectorAggregators.stream().filter(ExistsAggregator.class::isInstance).map(ExistsAggregator.class::cast).collect(Collectors.toList());
aggregators.addAll(connectorAggregators);
aggregators.removeIf(ExistsAggregator.class::isInstance);
List<Aggregator<CDateSet>> eventDateUnionAggregators = aggregateEventDates ? List.of(new EventDateUnionAggregator(Set.of(table.getConnector().getTable()))) : Collections.emptyList();
aggregators.addAll(eventDateUnionAggregators);
final QPNode filtersNode = getConcept().createConceptQuery(context, filters, aggregators, eventDateUnionAggregators);
// Link up the ExistsAggregators to the node
existsAggregators.forEach(agg -> agg.setReference(filtersNode));
// Select if matching secondaryId available
final boolean hasSelectedSecondaryId = Arrays.stream(table.getConnector().getTable().getColumns()).map(Column::getSecondaryId).filter(Objects::nonNull).anyMatch(o -> Objects.equals(context.getSelectedSecondaryId(), o));
final Column validityDateColumn = selectValidityDateColumn(table);
final ConceptNode node = new ConceptNode(// TODO Don't set validity node, when no validity column exists. See workaround for this and remove it: https://github.com/bakdata/conquery/pull/1362
new ValidityDateNode(validityDateColumn, filtersNode), elements, table, // if the node is excluded, don't pass it into the Node.
!excludeFromSecondaryId && hasSelectedSecondaryId ? context.getSelectedSecondaryId() : null);
tableNodes.add(node);
}
// We always merge on concept level
final QPNode outNode = OrNode.of(tableNodes, aggregateEventDates ? DateAggregationAction.MERGE : DateAggregationAction.BLOCK);
// Link concept-level Exists-select to outer node.
conceptAggregators.stream().filter(aggregator -> aggregator instanceof ExistsAggregator).forEach(aggregator -> ((ExistsAggregator) aggregator).setReference(outNode));
return outNode;
}
use of com.bakdata.conquery.apiv1.query.concept.filter.CQTable in project conquery by bakdata.
the class SerializationTests method testFormQuery.
@Test
public void testFormQuery() throws IOException, JSONException {
CQConcept concept = new CQConcept();
final TreeConcept testConcept = new TreeConcept();
Dataset dataset = new Dataset();
dataset.setName("testDataset");
testConcept.setDataset(dataset);
testConcept.setName("concept");
final ConceptTreeConnector connector = new ConceptTreeConnector();
connector.setConcept(testConcept);
connector.setName("connector1");
testConcept.setConnectors(List.of(connector));
concept.setElements(Collections.singletonList(testConcept));
CQTable[] tables = { new CQTable() };
connector.setTable(new Table());
tables[0].setConnector(connector);
tables[0].setConcept(concept);
concept.setTables(Arrays.asList(tables));
ConceptQuery subQuery = new ConceptQuery(concept);
CQOr features = new CQOr();
features.setChildren(Collections.singletonList(concept));
AbsoluteFormQuery query = new AbsoluteFormQuery(subQuery, CDateRange.exactly(LocalDate.now()).toSimpleRange(), ArrayConceptQuery.createFromFeatures(Collections.singletonList(features)), List.of(ExportForm.ResolutionAndAlignment.of(Resolution.COMPLETE, Alignment.NO_ALIGN), ExportForm.ResolutionAndAlignment.of(Resolution.QUARTERS, Alignment.QUARTER)));
CentralRegistry centralRegistry = new CentralRegistry();
centralRegistry.register(dataset);
centralRegistry.register(testConcept);
centralRegistry.register(connector);
SerializationTestUtil.forType(AbsoluteFormQuery.class).registry(centralRegistry).test(query);
}
use of com.bakdata.conquery.apiv1.query.concept.filter.CQTable in project conquery by bakdata.
the class SerializationTests method cqConcept.
@Test
public void cqConcept() throws JSONException, IOException {
final Dataset dataset = new Dataset();
dataset.setName("dataset");
final TreeConcept concept = new TreeConcept();
concept.setName("concept");
concept.setDataset(dataset);
final ConceptTreeConnector connector = new ConceptTreeConnector();
connector.setConcept(concept);
concept.setConnectors(List.of(connector));
final CQConcept cqConcept = new CQConcept();
cqConcept.setElements(List.of(concept));
cqConcept.setLabel("Label");
final CQTable cqTable = new CQTable();
cqTable.setConnector(connector);
cqTable.setFilters(List.of());
cqTable.setConcept(cqConcept);
cqConcept.setTables(List.of(cqTable));
final CentralRegistry registry = new CentralRegistry();
registry.register(dataset);
registry.register(concept);
registry.register(connector);
SerializationTestUtil.forType(CQConcept.class).registry(registry).test(cqConcept);
}
use of com.bakdata.conquery.apiv1.query.concept.filter.CQTable in project conquery by bakdata.
the class CQConcept method setDefaultExists.
@Override
public void setDefaultExists() {
boolean allTablesEmpty = getTables().stream().map(CQTable::getSelects).allMatch(List::isEmpty);
if (!(getSelects().isEmpty() && (tables.isEmpty() || allTablesEmpty))) {
// Don't fill if there are any selects on concept level or on any table level
return;
}
List<Select> cSelects = new ArrayList<>(getSelects());
cSelects.addAll(getConcept().getDefaultSelects());
setSelects(cSelects);
for (CQTable t : getTables()) {
List<Select> conSelects = new ArrayList<>(t.getSelects());
conSelects.addAll(t.getConnector().getDefaultSelects());
t.setSelects(conSelects);
}
}
Aggregations