Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor SqlSelects and Filters into SqlAggregators #3241

Merged
merged 3 commits into from
Dec 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class DateAggregationContext implements Context {

Field<Object> primaryColumn;
List<SqlSelect> carryThroughSelects;
DateAggregationTables dateAggregationTables;
DateAggregationTables<?> dateAggregationTables;
DateAggregationDates dateAggregationDates;
@Builder.Default
Map<DateAggregationCteStep, List<QueryStep>> intervalMergeSteps = new HashMap<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public ColumnDateRange getOverlapValidityDate(DateAggregationDates dateAggregati
@Override
public List<SqlSelect> getIntermediateTableSelects(DateAggregationDates dateAggregationDates, List<SqlSelect> carryThroughSelects) {

List<FieldWrapper> nulledRangeStartAndEnd =
List<FieldWrapper<?>> nulledRangeStartAndEnd =
Stream.of(
DSL.inline(null, Date.class).as(DateAggregationCte.RANGE_START),
DSL.inline(null, Date.class).as(DateAggregationCte.RANGE_END)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ protected QueryStep.QueryStepBuilder convertStep(DateAggregationContext context)
.as(ROW_NUMBER_FIELD_NAME);

ArrayList<SqlSelect> selects = new ArrayList<>(context.getCarryThroughSelects());
selects.add(new FieldWrapper(rowNumber));
selects.add(new FieldWrapper<>(rowNumber));

Selects rowNumberSelects = Selects.builder()
.primaryColumn(primaryColumn)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
*/
interface SqlAggregationAction {

DateAggregationTables tableNames(NameGenerator nameGenerator);
DateAggregationTables<?> tableNames(NameGenerator nameGenerator);

List<DateAggregationCte> dateAggregationCtes();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package com.bakdata.conquery.sql.conversion.cqelement.concept;

import java.util.List;
import java.util.stream.Collectors;

import com.bakdata.conquery.sql.conversion.model.QueryStep;
import com.bakdata.conquery.sql.conversion.model.Selects;
import com.bakdata.conquery.sql.conversion.model.filter.FilterCondition;
import com.bakdata.conquery.sql.conversion.model.select.ExistsSqlSelect;
import com.bakdata.conquery.sql.conversion.model.select.SqlSelect;
import org.jooq.Condition;

Expand Down Expand Up @@ -34,11 +32,10 @@ public QueryStep.QueryStepBuilder convertStep(ConceptCteContext conceptCteContex

private List<SqlSelect> getForAggregationFilterSelects(ConceptCteContext conceptCteContext) {
return conceptCteContext.getSelects().stream()
.flatMap(sqlSelects -> sqlSelects.getForFinalStep().stream())
// TODO: EXISTS edge case is only in a concepts final select statement and has no predecessor selects
.filter(conquerySelect -> !(conquerySelect instanceof ExistsSqlSelect))
.flatMap(sqlSelects -> sqlSelects.getFinalSelects().stream())
.filter(sqlSelect -> !sqlSelect.isUniversal())
.distinct()
.collect(Collectors.toList());
.toList();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.bakdata.conquery.sql.conversion.cqelement.concept;

import java.util.List;
import java.util.stream.Collectors;

import com.bakdata.conquery.sql.conversion.model.QueryStep;
import com.bakdata.conquery.sql.conversion.model.Selects;
Expand All @@ -13,9 +12,9 @@ class AggregationSelectCte extends ConceptCte {
public QueryStep.QueryStepBuilder convertStep(ConceptCteContext conceptCteContext) {

List<SqlSelect> requiredInAggregationFilterStep = conceptCteContext.allConceptSelects()
.flatMap(sqlSelects -> sqlSelects.getForAggregationSelectStep().stream())
.flatMap(sqlSelects -> sqlSelects.getAggregationSelects().stream())
.distinct()
.collect(Collectors.toList());
.toList();

Selects aggregationSelectSelects = Selects.builder()
.primaryColumn(conceptCteContext.getPrimaryColumn())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import com.bakdata.conquery.sql.conversion.dialect.SqlFunctionProvider;
import com.bakdata.conquery.sql.conversion.model.ColumnDateRange;
import com.bakdata.conquery.sql.conversion.model.QueryStep;
import com.bakdata.conquery.sql.conversion.model.filter.ConceptFilter;
import com.bakdata.conquery.sql.conversion.model.filter.SqlFilters;
import com.bakdata.conquery.sql.conversion.model.filter.ConditionUtil;
import com.bakdata.conquery.sql.conversion.model.filter.FilterType;
import com.bakdata.conquery.sql.conversion.model.filter.Filters;
Expand Down Expand Up @@ -91,10 +91,10 @@ private ConceptCteContext createConceptCteContext(CQConcept node, ConversionCont
ConceptTables conceptTables = new ConceptTables(conceptLabel, requiredSteps, tableName, context.getNameGenerator());

// convert filters
Stream<ConceptFilter> conceptFilters = table.getFilters().stream()
.map(filterValue -> this.filterValueConversions.convert(filterValue, context, conceptTables));
Stream<ConceptFilter> dateRestrictionFilter = getDateRestriction(context, validityDateSelect).stream();
List<ConceptFilter> allFilters = Stream.concat(conceptFilters, dateRestrictionFilter).toList();
Stream<SqlFilters> conceptFilters = table.getFilters().stream()
.map(filterValue -> this.filterValueConversions.convert(filterValue, context, conceptTables));
Stream<SqlFilters> dateRestrictionFilter = getDateRestriction(context, validityDateSelect).stream();
List<SqlFilters> allFilters = Stream.concat(conceptFilters, dateRestrictionFilter).toList();

// convert selects
SelectContext selectContext = new SelectContext(context, node, conceptLabel, validityDateSelect, conceptTables);
Expand Down Expand Up @@ -146,7 +146,7 @@ private Optional<ColumnDateRange> convertValidityDate(
return Optional.of(validityDate);
}

private Optional<ConceptFilter> getDateRestriction(ConversionContext context, Optional<ColumnDateRange> validityDate) {
private Optional<SqlFilters> getDateRestriction(ConversionContext context, Optional<ColumnDateRange> validityDate) {

if (!dateRestrictionApplicable(context.dateRestrictionActive(), validityDate)) {
return Optional.empty();
Expand All @@ -162,8 +162,8 @@ private Optional<ConceptFilter> getDateRestriction(ConversionContext context, Op

Condition dateRestrictionCondition = this.functionProvider.dateRestriction(dateRestriction, validityDate.get());

return Optional.of(new ConceptFilter(
SqlSelects.builder().forPreprocessingStep(dateRestrictionSelects).build(),
return Optional.of(new SqlFilters(
SqlSelects.builder().preprocessingSelects(dateRestrictionSelects).build(),
Filters.builder().event(List.of(ConditionUtil.wrap(dateRestrictionCondition, FilterType.EVENT))).build()
));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import com.bakdata.conquery.sql.conversion.model.ColumnDateRange;
import com.bakdata.conquery.sql.conversion.model.NameGenerator;
import com.bakdata.conquery.sql.conversion.model.QueryStep;
import com.bakdata.conquery.sql.conversion.model.filter.ConceptFilter;
import com.bakdata.conquery.sql.conversion.model.filter.SqlFilters;
import com.bakdata.conquery.sql.conversion.model.select.SqlSelects;
import lombok.Builder;
import lombok.Value;
Expand All @@ -28,7 +28,7 @@ class ConceptCteContext implements Context {
Optional<ColumnDateRange> validityDate;
boolean isExcludedFromDateAggregation;
List<SqlSelects> selects;
List<ConceptFilter> filters;
List<SqlFilters> filters;
ConceptTables conceptTables;
@With
QueryStep previous;
Expand All @@ -38,7 +38,7 @@ class ConceptCteContext implements Context {
*/
public Stream<SqlSelects> allConceptSelects() {
return Stream.concat(
getFilters().stream().map(ConceptFilter::getSelects),
getFilters().stream().map(SqlFilters::getSelects),
getSelects().stream()
);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.bakdata.conquery.sql.conversion.cqelement.concept;

import java.util.List;
import java.util.Optional;

import com.bakdata.conquery.sql.conversion.model.ColumnDateRange;
import com.bakdata.conquery.sql.conversion.model.QueryStep;
import com.bakdata.conquery.sql.conversion.model.Selects;
import com.bakdata.conquery.sql.conversion.model.filter.FilterCondition;
Expand All @@ -12,34 +14,39 @@ class EventFilterCte extends ConceptCte {

@Override
public QueryStep.QueryStepBuilder convertStep(ConceptCteContext conceptCteContext) {

String predecessorTableName = conceptCteContext.getConceptTables().getPredecessor(cteStep());
Selects eventFilterSelects = Selects.builder()
.primaryColumn(conceptCteContext.getPrimaryColumn())
.validityDate(conceptCteContext.getValidityDate())
.sqlSelects(getForAggregationSelectStep(conceptCteContext))
.build()
.qualify(predecessorTableName);

Selects eventFilterSelects = getEventFilterSelects(conceptCteContext);
List<Condition> eventFilterConditions = conceptCteContext.getFilters().stream()
.flatMap(conceptFilter -> conceptFilter.getFilters().getEvent().stream())
.map(FilterCondition::filterCondition)
.toList();

return QueryStep.builder()
.selects(eventFilterSelects)
.conditions(eventFilterConditions);
}

private static List<SqlSelect> getForAggregationSelectStep(ConceptCteContext conceptCteContext) {
return conceptCteContext.allConceptSelects()
.flatMap(sqlSelects -> sqlSelects.getForAggregationSelectStep().stream())
.toList();
}

@Override
public ConceptCteStep cteStep() {
return ConceptCteStep.EVENT_FILTER;
}

private Selects getEventFilterSelects(ConceptCteContext conceptCteContext) {
String predecessorTableName = conceptCteContext.getConceptTables().getPredecessor(cteStep());

Optional<ColumnDateRange> validityDate = conceptCteContext.getValidityDate();
if (validityDate.isPresent()) {
validityDate = Optional.of(validityDate.get().qualify(predecessorTableName));
}

List<? extends SqlSelect> sqlSelects = conceptCteContext.allConceptSelects()
.flatMap(selects -> selects.getAggregationSelects().stream())
.map(sqlSelect -> sqlSelect.createColumnReference(predecessorTableName))
.toList();

return Selects.builder()
.primaryColumn(conceptCteContext.getPrimaryColumn())
.validityDate(validityDate)
.sqlSelects(sqlSelects)
.build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class FinalConceptCte extends ConceptCte {
protected QueryStep.QueryStepBuilder convertStep(ConceptCteContext conceptCteContext) {

List<SqlSelect> forFinalStep = conceptCteContext.getSelects().stream()
.flatMap(sqlSelects -> sqlSelects.getForFinalStep().stream())
.flatMap(sqlSelects -> sqlSelects.getFinalSelects().stream())
.distinct()
.toList();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class PreprocessingCte extends ConceptCte {
public QueryStep.QueryStepBuilder convertStep(ConceptCteContext conceptCteContext) {

List<SqlSelect> forPreprocessing = conceptCteContext.allConceptSelects()
.flatMap(sqlSelects -> sqlSelects.getForPreprocessingStep().stream())
.flatMap(sqlSelects -> sqlSelects.getPreprocessingSelects().stream())
.distinct()
.toList();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@

import com.bakdata.conquery.models.datasets.concepts.filters.specific.BigMultiSelectFilter;
import com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptCteStep;
import com.bakdata.conquery.sql.conversion.model.filter.ConceptFilter;
import com.bakdata.conquery.sql.conversion.model.filter.SqlFilters;

public class BigMultiSelectFilterConverter implements FilterConverter<String[], BigMultiSelectFilter> {

@Override
public ConceptFilter convert(BigMultiSelectFilter bigMultiSelectFilter, FilterContext<String[]> context) {
public SqlFilters convert(BigMultiSelectFilter bigMultiSelectFilter, FilterContext<String[]> context) {
return SelectFilterUtil.convert(bigMultiSelectFilter, context, context.getValue());
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,50 +1,18 @@
package com.bakdata.conquery.sql.conversion.cqelement.concept.filter;

import java.util.List;
import java.util.Set;

import com.bakdata.conquery.models.common.Range;
import com.bakdata.conquery.models.datasets.concepts.filters.specific.CountFilter;
import com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptCteStep;
import com.bakdata.conquery.sql.conversion.model.filter.ConceptFilter;
import com.bakdata.conquery.sql.conversion.model.filter.CountCondition;
import com.bakdata.conquery.sql.conversion.model.filter.Filters;
import com.bakdata.conquery.sql.conversion.model.select.CountSqlSelect;
import com.bakdata.conquery.sql.conversion.model.select.ExtractingSqlSelect;
import com.bakdata.conquery.sql.conversion.model.select.SqlSelect;
import com.bakdata.conquery.sql.conversion.model.select.SqlSelects;
import org.jooq.Field;
import com.bakdata.conquery.sql.conversion.model.filter.SqlFilters;
import com.bakdata.conquery.sql.conversion.model.select.CountSqlAggregator;

public class CountFilterConverter implements FilterConverter<Range.LongRange, CountFilter> {

@Override
public ConceptFilter convert(CountFilter countFilter, FilterContext<Range.LongRange> context) {

SqlSelect rootSelect = new ExtractingSqlSelect<>(
context.getConceptTables().getPredecessor(ConceptCteStep.PREPROCESSING),
countFilter.getColumn().getName(),
Object.class
);

Field<Object> qualifiedRootSelect = context.getConceptTables().qualifyOnPredecessor(ConceptCteStep.AGGREGATION_SELECT, rootSelect.aliased());
CountSqlSelect countSqlSelect = new CountSqlSelect(
qualifiedRootSelect,
context.getNameGenerator().selectName(countFilter),
CountSqlSelect.CountType.fromBoolean(countFilter.isDistinct())
);

Field<Object> qualifiedCountGroupBy = context.getConceptTables().qualifyOnPredecessor(ConceptCteStep.AGGREGATION_FILTER, countSqlSelect.aliased());
CountCondition countFilterCondition = new CountCondition(qualifiedCountGroupBy, context.getValue());

return new ConceptFilter(
SqlSelects.builder()
.forPreprocessingStep(List.of(rootSelect))
.forAggregationSelectStep(List.of(countSqlSelect))
.build(),
Filters.builder()
.group(List.of(countFilterCondition))
.build()
);
public SqlFilters convert(CountFilter countFilter, FilterContext<Range.LongRange> context) {
return CountSqlAggregator.create(countFilter, context).getSqlFilters();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
package com.bakdata.conquery.sql.conversion.cqelement.concept.filter;

import java.util.List;
import java.util.Set;

import com.bakdata.conquery.models.common.Range;
import com.bakdata.conquery.models.datasets.concepts.filters.specific.DateDistanceFilter;
import com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptCteStep;
import com.bakdata.conquery.sql.conversion.model.filter.ConceptFilter;
import com.bakdata.conquery.sql.conversion.model.filter.DateDistanceCondition;
import com.bakdata.conquery.sql.conversion.model.filter.FilterCondition;
import com.bakdata.conquery.sql.conversion.model.filter.Filters;
import com.bakdata.conquery.sql.conversion.model.select.DateDistanceSqlSelect;
import com.bakdata.conquery.sql.conversion.model.select.SqlSelects;
import com.bakdata.conquery.sql.conversion.model.filter.SqlFilters;
import com.bakdata.conquery.sql.conversion.model.select.DateDistanceSqlAggregator;
import com.bakdata.conquery.sql.conversion.supplier.DateNowSupplier;

public class DateDistanceFilterConverter implements FilterConverter<Range.LongRange, DateDistanceFilter> {
Expand All @@ -23,31 +18,8 @@ public DateDistanceFilterConverter(DateNowSupplier dateNowSupplier) {
}

@Override
public ConceptFilter convert(DateDistanceFilter dateDistanceFilter, FilterContext<Range.LongRange> context) {

DateDistanceSqlSelect dateDistanceSqlSelect = new DateDistanceSqlSelect(
dateNowSupplier,
dateDistanceFilter.getTimeUnit(),
context.getConceptTables().getPredecessor(ConceptCteStep.PREPROCESSING),
dateDistanceFilter.getColumn(),
dateDistanceFilter.getName(),
context.getParentContext().getDateRestrictionRange(),
context.getParentContext().getSqlDialect().getFunctionProvider()
);

FilterCondition dateDistanceCondition = new DateDistanceCondition(
context.getConceptTables().qualifyOnPredecessor(ConceptCteStep.EVENT_FILTER, dateDistanceSqlSelect.aliased()),
context.getValue()
);

return new ConceptFilter(
SqlSelects.builder()
.forPreprocessingStep(List.of(dateDistanceSqlSelect))
.build(),
Filters.builder()
.event(List.of(dateDistanceCondition))
.build()
);
public SqlFilters convert(DateDistanceFilter dateDistanceFilter, FilterContext<Range.LongRange> context) {
return DateDistanceSqlAggregator.create(dateDistanceFilter, context, dateNowSupplier).getSqlFilters();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

import com.bakdata.conquery.models.datasets.concepts.filters.Filter;
import com.bakdata.conquery.sql.conversion.Conversions;
import com.bakdata.conquery.sql.conversion.model.filter.ConceptFilter;
import com.bakdata.conquery.sql.conversion.model.filter.SqlFilters;

public class FilterConversions extends Conversions<Filter<?>, ConceptFilter, FilterContext<?>> {
public class FilterConversions extends Conversions<Filter<?>, SqlFilters, FilterContext<?>> {

public FilterConversions(List<? extends FilterConverter<?, ?>> converters) {
super(converters);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

import com.bakdata.conquery.models.datasets.concepts.filters.Filter;
import com.bakdata.conquery.sql.conversion.Converter;
import com.bakdata.conquery.sql.conversion.model.filter.ConceptFilter;
import com.bakdata.conquery.sql.conversion.model.filter.SqlFilters;

public interface FilterConverter<V, F extends Filter<V>> extends Converter<F, ConceptFilter, FilterContext<V>> {
public interface FilterConverter<V, F extends Filter<V>> extends Converter<F, SqlFilters, FilterContext<V>> {

}
Loading
Loading