Skip to content

Commit

Permalink
Fix secondary ID qualifying (#3594)
Browse files Browse the repository at this point in the history
  • Loading branch information
jnsrnhld authored Oct 8, 2024
1 parent 408e6cc commit 057eb76
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.bakdata.conquery.apiv1.query.concept.filter.CQTable;
import com.bakdata.conquery.apiv1.query.concept.specific.CQConcept;
import com.bakdata.conquery.models.datasets.Column;
import com.bakdata.conquery.models.datasets.Table;
import com.bakdata.conquery.models.datasets.concepts.ConceptElement;
import com.bakdata.conquery.models.datasets.concepts.select.concept.ConceptColumnSelect;
import com.bakdata.conquery.models.datasets.concepts.tree.ConceptTreeChild;
Expand Down Expand Up @@ -97,7 +98,7 @@ private static QueryStep finishConceptConversion(QueryStep predecessor, CQConcep
Optional<ColumnDateRange> validityDate = predecessorSelects.getValidityDate();
SqlIdColumns ids = predecessorSelects.getIds();

SelectContext<ConceptSqlTables> selectContext = SelectContext.create(cqConcept, ids, validityDate, universalTables, context);
SelectContext<ConceptSqlTables> selectContext = SelectContext.create(ids, validityDate, universalTables, context);
List<ConceptSqlSelects> converted = cqConcept.getSelects().stream()
.map(select -> select.createConverter().conceptSelect(select, selectContext))
.toList();
Expand Down Expand Up @@ -151,7 +152,7 @@ private CQTableContext createTableContext(TablePath tablePath, CQConcept cqConce
getDateRestriction(conversionContext, tablesValidityDate).ifPresent(allSqlFiltersForTable::add);

// convert selects
SelectContext<ConnectorSqlTables> selectContext = SelectContext.create(cqTable, ids, tablesValidityDate, connectorTables, conversionContext);
SelectContext<ConnectorSqlTables> selectContext = SelectContext.create(ids, tablesValidityDate, connectorTables, conversionContext);
List<ConnectorSqlSelects> allSelectsForTable = new ArrayList<>();
ConnectorSqlSelects conceptColumnSelect = createConceptColumnConnectorSqlSelects(cqConcept, selectContext);
allSelectsForTable.add(conceptColumnSelect);
Expand All @@ -167,29 +168,30 @@ private CQTableContext createTableContext(TablePath tablePath, CQConcept cqConce
.build();
}

private static SqlIdColumns convertIds(CQConcept cqConcept, CQTable cqTable, ConversionContext conversionContext) {
public static SqlIdColumns convertIds(CQConcept cqConcept, CQTable cqTable, ConversionContext conversionContext) {

Field<Object> primaryColumn = TablePrimaryColumnUtil.findPrimaryColumn(cqTable.getConnector().getTable(), conversionContext.getConfig());
Table table = cqTable.getConnector().getTable();
Field<Object> primaryColumn = TablePrimaryColumnUtil.findPrimaryColumn(table, conversionContext.getConfig());

if (cqConcept.isExcludeFromSecondaryId()
|| conversionContext.getSecondaryIdDescription() == null
|| !cqTable.hasSelectedSecondaryId(conversionContext.getSecondaryIdDescription())
) {
return new SqlIdColumns(primaryColumn);
return new SqlIdColumns(primaryColumn).withAlias();
}

Column secondaryIdColumn = cqTable.getConnector().getTable().findSecondaryIdColumn(conversionContext.getSecondaryIdDescription());
Column secondaryIdColumn = table.findSecondaryIdColumn(conversionContext.getSecondaryIdDescription());

Preconditions.checkArgument(
secondaryIdColumn != null,
"Expecting Table %s to have a matching secondary id for %s".formatted(
cqTable.getConnector().getTable(),
table,
conversionContext.getSecondaryIdDescription()
)
);

Field<Object> secondaryId = DSL.field(DSL.name(secondaryIdColumn.getName()));
return new SqlIdColumns(primaryColumn, secondaryId);
Field<Object> secondaryId = DSL.field(DSL.name(table.getName(), secondaryIdColumn.getName()));
return new SqlIdColumns(primaryColumn, secondaryId).withAlias();
}

private static Optional<ColumnDateRange> convertValidityDate(CQTable cqTable, String connectorLabel, ConversionContext context) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,9 @@ private static QueryStep.QueryStepBuilder joinWithStratificationTable(

Selects stratificationSelects = stratificationTableCte.getQualifiedSelects();
SqlIdColumns stratificationIds = stratificationSelects.getIds();
SqlIdColumns rootTableIds = tableContext.getIds();
SqlIdColumns rootTableIds = tableContext.getIds().getPredecessor().orElseThrow(() -> new IllegalStateException(
"Id's should have been qualified during conversion and thus have a predecessor")
);
List<Condition> idConditions = stratificationIds.join(rootTableIds);

// join full stratification with connector table on all ID's from prerequisite query
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package com.bakdata.conquery.sql.conversion.cqelement.concept;

import static com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptCteStep.*;
import static com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptCteStep.EVENT_FILTER;
import static com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptCteStep.INTERVAL_PACKING_SELECTS;
import static com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptCteStep.MANDATORY_STEPS;
import static com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptCteStep.UNIVERSAL_SELECTS;
import static com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptCteStep.UNNEST_DATE;
import static com.bakdata.conquery.sql.conversion.cqelement.intervalpacking.IntervalPackingCteStep.INTERVAL_COMPLETE;

import java.util.HashMap;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@

import com.bakdata.conquery.models.forms.util.Resolution;
import com.bakdata.conquery.sql.conversion.SharedAliases;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.experimental.SuperBuilder;
import org.jooq.Condition;
import org.jooq.Field;
import org.jooq.impl.DSL;

@SuperBuilder
@AllArgsConstructor
public class SqlIdColumns implements Qualifiable<SqlIdColumns> {

@Getter
Expand All @@ -26,21 +28,40 @@ public class SqlIdColumns implements Qualifiable<SqlIdColumns> {
@Nullable
private final Field<Object> secondaryId;

@Nullable
private final SqlIdColumns predecessor;

public SqlIdColumns(Field<Object> primaryColumn, Field<Object> secondaryId) {
this.primaryColumn = primaryColumn;
this.secondaryId = secondaryId;
this.predecessor = null;
}

public SqlIdColumns(Field<Object> primaryColumn) {
this.primaryColumn = primaryColumn;
this.secondaryId = null;
this.predecessor = null;
}

public SqlIdColumns withAlias() {
if (this.secondaryId == null) {
return new SqlIdColumns(this.primaryColumn.as(SharedAliases.PRIMARY_COLUMN.getAlias()), null, this);
}
return new SqlIdColumns(
this.primaryColumn.as(SharedAliases.PRIMARY_COLUMN.getAlias()),
this.secondaryId.as(SharedAliases.SECONDARY_ID.getAlias()),
this
);
}

@Override
public SqlIdColumns qualify(String qualifier) {
Field<Object> primaryColumn = QualifyingUtil.qualify(this.primaryColumn, qualifier);
Field<Object> secondaryId = this.secondaryId != null ? QualifyingUtil.qualify(this.secondaryId, qualifier) : null;
return new SqlIdColumns(primaryColumn, secondaryId);
if (secondaryId == null) {
return new SqlIdColumns(primaryColumn, null, this);
}
Field<Object> secondaryId = QualifyingUtil.qualify(this.secondaryId, qualifier);
return new SqlIdColumns(primaryColumn, secondaryId, this);
}

public SqlIdColumns withAbsoluteStratification(Resolution resolution, Field<Integer> index) {
Expand Down Expand Up @@ -73,6 +94,10 @@ public Optional<Field<Object>> getSecondaryId() {
return Optional.ofNullable(this.secondaryId);
}

public Optional<SqlIdColumns> getPredecessor() {
return Optional.ofNullable(this.predecessor);
}

public boolean isWithStratification() {
return false;
}
Expand Down Expand Up @@ -110,10 +135,10 @@ public SqlIdColumns coalesce(List<SqlIdColumns> selectsIds) {
});

Field<Object> coalescedPrimaryColumn = coalesceFields(primaryColumns).as(SharedAliases.PRIMARY_COLUMN.getAlias());
Field<Object> coalescedSecondaryIds = !secondaryIds.isEmpty()
? coalesceFields(secondaryIds).as(SharedAliases.SECONDARY_ID.getAlias())
: null;

if (secondaryIds.isEmpty()) {
return new SqlIdColumns(coalescedPrimaryColumn);
}
Field<Object> coalescedSecondaryIds = coalesceFields(secondaryIds).as(SharedAliases.SECONDARY_ID.getAlias());
return new SqlIdColumns(coalescedPrimaryColumn, coalescedSecondaryIds);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,16 @@

import com.bakdata.conquery.models.datasets.concepts.Connector;
import com.bakdata.conquery.models.datasets.concepts.select.concept.ConceptColumnSelect;
import com.bakdata.conquery.sql.conversion.SharedAliases;
import com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptCteStep;
import com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptSqlTables;
import com.bakdata.conquery.sql.conversion.cqelement.concept.ConnectorSqlTables;
import com.bakdata.conquery.sql.conversion.dialect.SqlFunctionProvider;
import com.bakdata.conquery.sql.conversion.model.CteStep;
import com.bakdata.conquery.sql.conversion.model.NameGenerator;
import com.bakdata.conquery.sql.conversion.model.QualifyingUtil;
import com.bakdata.conquery.sql.conversion.model.QueryStep;
import com.bakdata.conquery.sql.conversion.model.Selects;
import com.bakdata.conquery.sql.conversion.model.SqlIdColumns;
import com.bakdata.conquery.sql.execution.ResultSetProcessor;
import com.bakdata.conquery.util.TablePrimaryColumnUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.jooq.Field;
Expand Down Expand Up @@ -126,11 +123,7 @@ private static QueryStep createConnectorColumnSelectQuery(
.orElse(connector.getTable().getName());

Table<Record> connectorTable = DSL.table(DSL.name(tableName));

Field<Object> primaryColumn = TablePrimaryColumnUtil.findPrimaryColumn(connector.getTable(), selectContext.getConversionContext().getConfig());
Field<Object> qualifiedPrimaryColumn = QualifyingUtil.qualify(primaryColumn, connectorTable.getName()).as(SharedAliases.PRIMARY_COLUMN.getAlias());
SqlIdColumns ids = new SqlIdColumns(qualifiedPrimaryColumn);

SqlIdColumns ids = selectContext.getIds().qualify(connectorTable.getName());
Field<Object> connectorColumn = DSL.field(DSL.name(connectorTable.getName(), connector.getColumn().getName()));
Field<String> casted = selectContext.getFunctionProvider().cast(connectorColumn, SQLDataType.VARCHAR).as(alias);
FieldWrapper<String> connectorSelect = new FieldWrapper<>(casted);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import java.util.Optional;

import com.bakdata.conquery.apiv1.query.concept.filter.CQTable;
import com.bakdata.conquery.apiv1.query.concept.specific.CQConcept;
import com.bakdata.conquery.sql.conversion.Context;
import com.bakdata.conquery.sql.conversion.cqelement.ConversionContext;
import com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptSqlTables;
Expand All @@ -26,7 +24,6 @@ public class SelectContext<T extends SqlTables> implements Context {
ConversionContext conversionContext;

public static SelectContext<ConnectorSqlTables> create(
CQTable cqTable,
SqlIdColumns ids,
Optional<ColumnDateRange> validityDate,
ConnectorSqlTables tables,
Expand All @@ -36,7 +33,6 @@ public static SelectContext<ConnectorSqlTables> create(
}

public static SelectContext<ConceptSqlTables> create(
CQConcept cqConcept,
SqlIdColumns ids,
Optional<ColumnDateRange> validityDate,
ConceptSqlTables tables,
Expand Down

0 comments on commit 057eb76

Please sign in to comment.