Search in sources :

Example 1 with Select

use of com.bakdata.conquery.models.datasets.concepts.select.Select 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;
}
Also used : ConceptNode(com.bakdata.conquery.models.query.queryplan.specific.ConceptNode) JsonProperty(com.fasterxml.jackson.annotation.JsonProperty) Arrays(java.util.Arrays) ConceptElement(com.bakdata.conquery.models.datasets.concepts.ConceptElement) EventDateUnionAggregator(com.bakdata.conquery.models.query.queryplan.aggregators.specific.EventDateUnionAggregator) NotEmpty(javax.validation.constraints.NotEmpty) Valid(javax.validation.Valid) JsonAlias(com.fasterxml.jackson.annotation.JsonAlias) Locale(java.util.Locale) QPNode(com.bakdata.conquery.models.query.queryplan.QPNode) ToString(lombok.ToString) CQTable(com.bakdata.conquery.apiv1.query.concept.filter.CQTable) InternalOnly(com.bakdata.conquery.io.jackson.InternalOnly) ConceptQueryPlan(com.bakdata.conquery.models.query.queryplan.ConceptQueryPlan) NamespacedIdentifiableHolding(com.bakdata.conquery.models.query.NamespacedIdentifiableHolding) CPSType(com.bakdata.conquery.io.cps.CPSType) SelectResultInfo(com.bakdata.conquery.models.query.resultinfo.SelectResultInfo) NsIdRefCollection(com.bakdata.conquery.io.jackson.serializer.NsIdRefCollection) Concept(com.bakdata.conquery.models.datasets.concepts.Concept) Set(java.util.Set) ConceptNode(com.bakdata.conquery.models.query.queryplan.specific.ConceptNode) NotNull(javax.validation.constraints.NotNull) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) FilterValue(com.bakdata.conquery.apiv1.query.concept.filter.FilterValue) List(java.util.List) Slf4j(lombok.extern.slf4j.Slf4j) JsonManagedReference(com.fasterxml.jackson.annotation.JsonManagedReference) Column(com.bakdata.conquery.models.datasets.Column) Setter(lombok.Setter) Getter(lombok.Getter) NamespacedIdentifiable(com.bakdata.conquery.models.identifiable.ids.NamespacedIdentifiable) ArrayList(java.util.ArrayList) Select(com.bakdata.conquery.models.datasets.concepts.select.Select) JsonIgnore(com.fasterxml.jackson.annotation.JsonIgnore) DateAggregationMode(com.bakdata.conquery.models.query.DateAggregationMode) FilterNode(com.bakdata.conquery.models.query.queryplan.filter.FilterNode) ResultInfo(com.bakdata.conquery.models.query.resultinfo.ResultInfo) DateAggregationAction(com.bakdata.conquery.models.query.queryplan.DateAggregationAction) ValidityDateNode(com.bakdata.conquery.models.query.queryplan.specific.ValidityDateNode) ExportForm(com.bakdata.conquery.apiv1.forms.export_form.ExportForm) QueryPlanContext(com.bakdata.conquery.models.query.QueryPlanContext) ValidationMethod(io.dropwizard.validation.ValidationMethod) QueryResolveContext(com.bakdata.conquery.models.query.QueryResolveContext) OrNode(com.bakdata.conquery.models.query.queryplan.specific.OrNode) Aggregator(com.bakdata.conquery.models.query.queryplan.aggregators.Aggregator) CQElement(com.bakdata.conquery.apiv1.query.CQElement) ExistsAggregator(com.bakdata.conquery.models.query.queryplan.aggregators.specific.ExistsAggregator) Collections(java.util.Collections) CDateSet(com.bakdata.conquery.models.common.CDateSet) QPNode(com.bakdata.conquery.models.query.queryplan.QPNode) CQTable(com.bakdata.conquery.apiv1.query.concept.filter.CQTable) FilterNode(com.bakdata.conquery.models.query.queryplan.filter.FilterNode) EventDateUnionAggregator(com.bakdata.conquery.models.query.queryplan.aggregators.specific.EventDateUnionAggregator) ArrayList(java.util.ArrayList) EventDateUnionAggregator(com.bakdata.conquery.models.query.queryplan.aggregators.specific.EventDateUnionAggregator) Aggregator(com.bakdata.conquery.models.query.queryplan.aggregators.Aggregator) ExistsAggregator(com.bakdata.conquery.models.query.queryplan.aggregators.specific.ExistsAggregator) Column(com.bakdata.conquery.models.datasets.Column) ValidityDateNode(com.bakdata.conquery.models.query.queryplan.specific.ValidityDateNode) ExistsAggregator(com.bakdata.conquery.models.query.queryplan.aggregators.specific.ExistsAggregator)

Example 2 with Select

use of com.bakdata.conquery.models.datasets.concepts.select.Select 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);
    }
}
Also used : CQTable(com.bakdata.conquery.apiv1.query.concept.filter.CQTable) Select(com.bakdata.conquery.models.datasets.concepts.select.Select) ArrayList(java.util.ArrayList) List(java.util.List) ArrayList(java.util.ArrayList)

Example 3 with Select

use of com.bakdata.conquery.models.datasets.concepts.select.Select in project conquery by bakdata.

the class FilteringConceptManipulator method consume.

public void consume(CQConcept concept, DatasetRegistry namespaces) {
    List<Select> selects = concept.getSelects();
    if (!selectBlockList.isEmpty()) {
        selects.removeIf(s -> selectBlockList.contains(s.getId()));
    } else if (!selectAllowList.isEmpty()) {
        selects.removeIf(s -> !selectAllowList.contains(s.getId()));
    }
    // Add default selects if none is present anymore
    if (selects.isEmpty()) {
        concept.setSelects(selectDefault.stream().map(namespaces::resolve).collect(Collectors.toList()));
    }
    // Handle tables
    List<CQTable> tables = concept.getTables();
    Iterator<CQTable> it = tables.iterator();
    while (it.hasNext()) {
        CQTable table = it.next();
        if (tableBlockList.contains(table.getConnector().getId())) {
            it.remove();
        }
        if (!tableAllowList.containsKey(table.getConnector().getId())) {
            it.remove();
        } else {
            // If table is allowlisted apply a table manipulator if one exist
            TableManipulator tableMan = tableAllowList.get(table.getConnector().getId());
            if (tableMan != null) {
                tableMan.consume(table, namespaces);
            }
        }
    }
    if (tables.isEmpty()) {
        throw new IllegalStateException(String.format("After filtering the tables of concept %s, no table was left in the concept. ConceptManipulator: %s", concept, this.toString()));
    }
}
Also used : ConnectorId(com.bakdata.conquery.models.identifiable.ids.specific.ConnectorId) Setter(lombok.Setter) Iterator(java.util.Iterator) Getter(lombok.Getter) Set(java.util.Set) Collectors(java.util.stream.Collectors) ConceptSelectId(com.bakdata.conquery.models.identifiable.ids.specific.ConceptSelectId) Connector(com.bakdata.conquery.models.datasets.concepts.Connector) List(java.util.List) Select(com.bakdata.conquery.models.datasets.concepts.select.Select) Builder(lombok.Builder) Map(java.util.Map) ToString(lombok.ToString) DatasetRegistry(com.bakdata.conquery.models.worker.DatasetRegistry) CQTable(com.bakdata.conquery.apiv1.query.concept.filter.CQTable) CQConcept(com.bakdata.conquery.apiv1.query.concept.specific.CQConcept) Collections(java.util.Collections) CQTable(com.bakdata.conquery.apiv1.query.concept.filter.CQTable) Select(com.bakdata.conquery.models.datasets.concepts.select.Select)

Aggregations

CQTable (com.bakdata.conquery.apiv1.query.concept.filter.CQTable)3 Select (com.bakdata.conquery.models.datasets.concepts.select.Select)3 List (java.util.List)3 ArrayList (java.util.ArrayList)2 Collections (java.util.Collections)2 ExportForm (com.bakdata.conquery.apiv1.forms.export_form.ExportForm)1 CQElement (com.bakdata.conquery.apiv1.query.CQElement)1 FilterValue (com.bakdata.conquery.apiv1.query.concept.filter.FilterValue)1 CQConcept (com.bakdata.conquery.apiv1.query.concept.specific.CQConcept)1 CPSType (com.bakdata.conquery.io.cps.CPSType)1 InternalOnly (com.bakdata.conquery.io.jackson.InternalOnly)1 NsIdRefCollection (com.bakdata.conquery.io.jackson.serializer.NsIdRefCollection)1 CDateSet (com.bakdata.conquery.models.common.CDateSet)1 Column (com.bakdata.conquery.models.datasets.Column)1 Concept (com.bakdata.conquery.models.datasets.concepts.Concept)1 ConceptElement (com.bakdata.conquery.models.datasets.concepts.ConceptElement)1 Connector (com.bakdata.conquery.models.datasets.concepts.Connector)1 NamespacedIdentifiable (com.bakdata.conquery.models.identifiable.ids.NamespacedIdentifiable)1 ConceptSelectId (com.bakdata.conquery.models.identifiable.ids.specific.ConceptSelectId)1 ConnectorId (com.bakdata.conquery.models.identifiable.ids.specific.ConnectorId)1