diff --git a/backend/src/main/java/com/bakdata/conquery/models/config/Dialect.java b/backend/src/main/java/com/bakdata/conquery/models/config/Dialect.java index 0bb1507f68..957fa075f6 100644 --- a/backend/src/main/java/com/bakdata/conquery/models/config/Dialect.java +++ b/backend/src/main/java/com/bakdata/conquery/models/config/Dialect.java @@ -3,7 +3,6 @@ import com.bakdata.conquery.sql.conversion.dialect.DialectBundle; import com.bakdata.conquery.sql.conversion.dialect.clickhouse.ClickhouseDialectBundle; import com.bakdata.conquery.sql.conversion.dialect.hana.HanaDialectBundle; -import com.bakdata.conquery.sql.conversion.dialect.pg.PostgreDialectBundle; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -16,7 +15,6 @@ @Getter public enum Dialect { - POSTGRESQL(new PostgreDialectBundle()), CLICKHOUSE(new ClickhouseDialectBundle()), HANA(new HanaDialectBundle()); diff --git a/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/DaterangeSelectOrFilter.java b/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/DaterangeSelectOrFilter.java index 3c1710a1e1..1e4ac051e8 100644 --- a/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/DaterangeSelectOrFilter.java +++ b/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/DaterangeSelectOrFilter.java @@ -8,6 +8,7 @@ public interface DaterangeSelectOrFilter { + //TODO consider dropping this and require single column to just be same in start and end? ColumnId getColumn(); ColumnId getStartColumn(); diff --git a/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/filters/specific/CountQuartersFilter.java b/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/filters/specific/CountQuartersFilter.java index ed0fc0c17b..eaa79ff22c 100644 --- a/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/filters/specific/CountQuartersFilter.java +++ b/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/filters/specific/CountQuartersFilter.java @@ -14,7 +14,6 @@ import com.bakdata.conquery.models.events.MajorTypeId; import com.bakdata.conquery.models.identifiable.ids.specific.ColumnId; import com.bakdata.conquery.models.query.filter.RangeFilterNode; -import com.bakdata.conquery.models.query.queryplan.aggregators.specific.CountQuartersOfDateRangeAggregator; import com.bakdata.conquery.models.query.queryplan.aggregators.specific.CountQuartersOfDatesAggregator; import com.bakdata.conquery.models.query.queryplan.filter.FilterNode; import com.bakdata.conquery.sql.conversion.model.aggregator.CountQuartersSqlAggregator; @@ -51,9 +50,7 @@ public List getRequiredColumns() { @Override public FilterNode createFilterNode(Range.LongRange value) { final Column column = getColumn().resolve(); - if (column.getType() == MajorTypeId.DATE_RANGE) { - return new RangeFilterNode(value, new CountQuartersOfDateRangeAggregator(column)); - } + //TODO missing impl for start/end return new RangeFilterNode(value, new CountQuartersOfDatesAggregator(column)); } diff --git a/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/filters/specific/DurationSumFilter.java b/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/filters/specific/DurationSumFilter.java index f7b58b21be..d810dc3dcb 100644 --- a/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/filters/specific/DurationSumFilter.java +++ b/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/filters/specific/DurationSumFilter.java @@ -1,12 +1,5 @@ package com.bakdata.conquery.models.datasets.concepts.filters.specific; -import java.util.ArrayList; -import java.util.List; -import javax.annotation.Nullable; - -import com.fasterxml.jackson.annotation.JsonAlias; -import jakarta.validation.Valid; - import com.bakdata.conquery.apiv1.frontend.FrontendFilterConfiguration; import com.bakdata.conquery.apiv1.frontend.FrontendFilterType; import com.bakdata.conquery.io.cps.CPSType; @@ -28,9 +21,14 @@ import com.bakdata.conquery.sql.conversion.model.filter.FilterConverter; import com.fasterxml.jackson.annotation.JsonIgnore; import io.dropwizard.validation.ValidationMethod; +import jakarta.validation.Valid; import lombok.Data; import lombok.extern.slf4j.Slf4j; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; + @Data @Slf4j @CPSType(id = "DURATION_SUM", base = Filter.class) @@ -39,7 +37,6 @@ public class DurationSumFilter extends Filter implements Datera @Valid @Nullable private List distinctBy; - @JsonAlias("dateRangeColumn") @Nullable private ColumnId column; @Nullable @@ -57,8 +54,7 @@ public List getRequiredColumns() { } if (column != null) { required.add(column); - } - else { + } else { required.add(startColumn); required.add(endColumn); } @@ -79,8 +75,8 @@ private boolean hasDistinct() { @Override public FilterNode createFilterNode(Range.LongRange value) { - ColumnAggregator aggregator = getColumn() != null ? new DurationSumAggregator(getColumn().resolve()) - : new TwoColumnDurationSumAggregator(startColumn.resolve(), endColumn.resolve()); + ColumnAggregator aggregator = isSingleColumnDaterange() ? new DurationSumAggregator(getColumn().resolve()) + : new TwoColumnDurationSumAggregator(startColumn.resolve(), endColumn.resolve()); if (hasDistinct()) { aggregator = new DistinctValuesWrapperAggregator<>(aggregator, distinctBy.stream().map(ColumnId::resolve).toList()); diff --git a/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/select/connector/specific/CountQuartersSelect.java b/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/select/connector/specific/CountQuartersSelect.java index e21b695ef7..0eabfac564 100644 --- a/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/select/connector/specific/CountQuartersSelect.java +++ b/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/select/connector/specific/CountQuartersSelect.java @@ -1,18 +1,11 @@ package com.bakdata.conquery.models.datasets.concepts.select.connector.specific; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; -import javax.annotation.Nullable; - import com.bakdata.conquery.io.cps.CPSType; import com.bakdata.conquery.models.datasets.Column; import com.bakdata.conquery.models.datasets.concepts.DaterangeSelectOrFilter; import com.bakdata.conquery.models.datasets.concepts.select.Select; -import com.bakdata.conquery.models.events.MajorTypeId; import com.bakdata.conquery.models.identifiable.ids.specific.ColumnId; import com.bakdata.conquery.models.query.queryplan.aggregators.Aggregator; -import com.bakdata.conquery.models.query.queryplan.aggregators.specific.CountQuartersOfDateRangeAggregator; import com.bakdata.conquery.models.query.queryplan.aggregators.specific.CountQuartersOfDatesAggregator; import com.bakdata.conquery.models.types.ResultType; import com.bakdata.conquery.sql.conversion.model.aggregator.CountQuartersSqlAggregator; @@ -23,6 +16,9 @@ import lombok.NoArgsConstructor; import lombok.Setter; +import javax.annotation.Nullable; +import java.util.List; + /** * Entity is included when the number of distinct quarters for all events is within a given range. * Implementation is specific for DateRanges @@ -51,12 +47,8 @@ public List getRequiredColumns() { @Override public Aggregator createAggregator() { final Column column = getColumn().resolve(); - final MajorTypeId typeId = column.getType(); - return switch (typeId) { - case DATE_RANGE -> new CountQuartersOfDateRangeAggregator(column); - case DATE -> new CountQuartersOfDatesAggregator(column); - default -> throw new IllegalArgumentException(String.format("Column '%s' is not of Date (-Range) Type but '%s'", getColumn(), typeId)); - }; + //TODO missing case for start/end + return new CountQuartersOfDatesAggregator(column); } @Override diff --git a/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/select/connector/specific/DateUnionSelect.java b/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/select/connector/specific/DateUnionSelect.java index 43399ac6b2..177134a31d 100644 --- a/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/select/connector/specific/DateUnionSelect.java +++ b/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/select/connector/specific/DateUnionSelect.java @@ -45,7 +45,7 @@ public List getRequiredColumns() { @Override public Aggregator createAggregator() { - // TODO fix this for 2 columns + // TODO Missing case for two columns return new DateUnionAggregator(getColumn().resolve()); } diff --git a/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/select/connector/specific/DurationSumSelect.java b/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/select/connector/specific/DurationSumSelect.java index 638e0738d3..ff74ef6435 100644 --- a/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/select/connector/specific/DurationSumSelect.java +++ b/backend/src/main/java/com/bakdata/conquery/models/datasets/concepts/select/connector/specific/DurationSumSelect.java @@ -29,62 +29,62 @@ @JsonIgnoreProperties("categorical") public class DurationSumSelect extends Select implements DaterangeSelectOrFilter { - @Nullable - private ColumnId column; - - @Nullable - private ColumnId startColumn, endColumn; - - private List distinctBy; - - @Override - public List getRequiredColumns() { - List out = new ArrayList<>(); - - if (column != null) { - out.add(column); - } - else { - out.add(startColumn); - out.add(endColumn); - } - - if (hasDistinct()) { - out.addAll(distinctBy); - } - return out; - } - - @Override - public ResultSetProcessor.Reader createResultSetReader(ResultSetProcessor processor) { - return processor::getInteger; - } - - @JsonIgnore - private boolean hasDistinct() { - return distinctBy != null && !distinctBy.isEmpty(); - } - - @Override - public Aggregator createAggregator() { - ColumnAggregator aggregator = getColumn() != null ? new DurationSumAggregator(getColumn().resolve()) - : new TwoColumnDurationSumAggregator(startColumn.resolve(), endColumn.resolve()); - - if (!hasDistinct()) { - return aggregator; - } - - return new DistinctValuesWrapperAggregator<>(aggregator, distinctBy.stream().map(ColumnId::resolve).toList()); - } - - @Override - public ResultType getResultType() { - return ResultType.Primitive.INTEGER; - } - - @Override - public SelectConverter createConverter() { - //TODO apply distinctBy (though needs to be done once other branches are merged) - return new DurationSumSqlAggregator(); - } + @Nullable + private ColumnId column; + + @Nullable + private ColumnId startColumn, endColumn; + + private List distinctBy; + + @Override + public List getRequiredColumns() { + List out = new ArrayList<>(); + + if (column != null) { + out.add(column); + } else { + out.add(startColumn); + out.add(endColumn); + } + + if (hasDistinct()) { + out.addAll(distinctBy); + } + return out; + } + + @Override + public ResultSetProcessor.Reader createResultSetReader(ResultSetProcessor processor) { + return processor::getInteger; + } + + @JsonIgnore + private boolean hasDistinct() { + return distinctBy != null && !distinctBy.isEmpty(); + } + + @Override + public Aggregator createAggregator() { + ColumnAggregator aggregator = isSingleColumnDaterange() + ? new DurationSumAggregator(getColumn().resolve()) + : new TwoColumnDurationSumAggregator(startColumn.resolve(), endColumn.resolve()); + + if (!hasDistinct()) { + return aggregator; + } + + return new DistinctValuesWrapperAggregator<>(aggregator, distinctBy.stream().map(ColumnId::resolve).toList()); + } + + @Override + public ResultType getResultType() { + return ResultType.Primitive.INTEGER; + } + + @Override + public SelectConverter createConverter() { + //TODO apply distinctBy (though needs to be done once other branches are merged) + return new DurationSumSqlAggregator(); + } } diff --git a/backend/src/main/java/com/bakdata/conquery/models/query/queryplan/aggregators/specific/CountQuartersOfDateRangeAggregator.java b/backend/src/main/java/com/bakdata/conquery/models/query/queryplan/aggregators/specific/CountQuartersOfDateRangeAggregator.java deleted file mode 100644 index aa39aa22f4..0000000000 --- a/backend/src/main/java/com/bakdata/conquery/models/query/queryplan/aggregators/specific/CountQuartersOfDateRangeAggregator.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.bakdata.conquery.models.query.queryplan.aggregators.specific; - -import java.time.YearMonth; -import java.time.temporal.ChronoField; -import java.time.temporal.IsoFields; -import java.time.temporal.TemporalAdjuster; - -import com.bakdata.conquery.models.common.CDateSet; -import com.bakdata.conquery.models.common.QuarterUtils; -import com.bakdata.conquery.models.common.daterange.CDateRange; -import com.bakdata.conquery.models.datasets.Column; -import com.bakdata.conquery.models.datasets.Table; -import com.bakdata.conquery.models.events.Bucket; -import com.bakdata.conquery.models.query.QueryExecutionContext; -import com.bakdata.conquery.models.query.entity.Entity; -import com.bakdata.conquery.models.query.queryplan.aggregators.SingleColumnAggregator; -import it.unimi.dsi.fastutil.ints.IntOpenHashSet; -import it.unimi.dsi.fastutil.ints.IntSet; -import lombok.ToString; - -/** - * Count the number of distinct quarters for all events. Implementation is specific for DateRanges - */ -@ToString(callSuper = true, onlyExplicitlyIncluded = true) -public class CountQuartersOfDateRangeAggregator extends SingleColumnAggregator { - - private final TemporalAdjuster monthInQuarter = QuarterUtils.firstMonthInQuarterAdjuster(); - private final TemporalAdjuster nextQuarter = QuarterUtils.nextQuarterAdjuster(); - - private final IntSet quarters = new IntOpenHashSet(); - private CDateSet dateRestriction; - - public CountQuartersOfDateRangeAggregator(Column column) { - super(column); - } - - @Override - public void init(Entity entity, QueryExecutionContext context) { - quarters.clear(); - } - - @Override - public void nextTable(QueryExecutionContext ctx, Table currentTable) { - dateRestriction = ctx.getDateRestriction(); - } - - @Override - public void consumeEvent(Bucket bucket, int event) { - if (!bucket.has(event, getColumn())) { - return; - } - - final CDateSet set = CDateSet.create(bucket.getDateRange(event, getColumn())); - set.retainAll(dateRestriction); - - for (CDateRange subRange : set.asRanges()) { - // we can sensibly only look at real quarters. - if(subRange.isOpen()){ - continue; - } - - addDateRange(subRange); - } - } - - public void addDateRange(CDateRange dateRange) { - YearMonth minQuarter = YearMonth.from(monthInQuarter.adjustInto(dateRange.getMin())); - YearMonth maxQuarter = YearMonth.from(monthInQuarter.adjustInto(dateRange.getMax())); - - if (minQuarter.equals(maxQuarter)) { - quarters.add(minQuarter.get(ChronoField.YEAR) * 4 + minQuarter.get(IsoFields.QUARTER_OF_YEAR)); - } - else { - YearMonth quarter = minQuarter; - // Iterate with max inclusive - while (!quarter.isAfter(maxQuarter)) { - quarters.add(quarter.getYear() * 4 + quarter.get(IsoFields.QUARTER_OF_YEAR)); - - quarter = YearMonth.from(nextQuarter.adjustInto(quarter)); - } - } - } - - @Override - public Long createAggregationResult() { - return quarters.isEmpty() ? null : (long) quarters.size(); - } - -} diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conquery/SqlMatchingStats.java b/backend/src/main/java/com/bakdata/conquery/sql/conquery/SqlMatchingStats.java index 3188c86796..a98646b38f 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conquery/SqlMatchingStats.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conquery/SqlMatchingStats.java @@ -149,22 +149,14 @@ private Field[] collectValidityDateFields(Connector connector) { List> validityDates = new ArrayList<>(); for (ValidityDate validityDate : connector.getValidityDates()) { - if (!validityDate.isSingleColumnDaterange()) { + if (validityDate.isSingleColumnDaterange()) { + Column column = validityDate.getColumn().get(); + validityDates.add(field(name(column.getName()), Date.class)); + } else { validityDates.add(field(name(validityDate.getStartColumn().getColumn()), Date.class)); validityDates.add(field(name(validityDate.getEndColumn().getColumn()), Date.class)); - continue; } - Column column = validityDate.getColumn().get(); - - if (column.getType() == MajorTypeId.DATE) { - validityDates.add(field(name(column.getName()), Date.class)); - } else if (column.getType() == MajorTypeId.DATE_RANGE) { - Field rangeField = field(name(column.getName())); - - validityDates.add(functionProvider.lower(rangeField)); - validityDates.add(functionProvider.upper(rangeField)); - } } return (Field[]) validityDates.toArray(Field[]::new); } diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/CQExternalConverter.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/CQExternalConverter.java index 995feeeef2..4a48875f98 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/CQExternalConverter.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/CQExternalConverter.java @@ -23,11 +23,9 @@ import com.google.common.base.Preconditions; import org.jooq.Field; import org.jooq.Name; -import org.jooq.Nullability; import org.jooq.Record; import org.jooq.Table; import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; public class CQExternalConverter implements NodeConverter { @@ -43,7 +41,7 @@ private static QueryStep createExternalIdsCte(CQExternal external, SqlFunctionPr unions.addAll(rowSelects); } Preconditions.checkArgument(!unions.isEmpty(), "Expecting at least 1 resolved row when converting a CQExternal"); - QueryStep allStep = QueryStep.createUnionAllStep(unions, CQ_EXTERNAL_IDS_CTE_NAME, Collections.emptyList(), context.isNegation()); + QueryStep allStep = QueryStep.createUnionAllStep(unions, CQ_EXTERNAL_IDS_CTE_NAME, Collections.emptyList(), context.isNegation(), functionProvider); Optional maybeValidityDate = allStep.getSelects().getValidityDate(); @@ -175,7 +173,7 @@ private QueryStep createExternalExtrasCte(CQExternal external, SqlFunctionProvid unions.add(rowSelects); } Preconditions.checkArgument(!unions.isEmpty(), "Expecting at least 1 converted resolved row when converting a CQExternal"); - return QueryStep.createUnionAllStep(unions, CQ_EXTERNAL_EXTRAS_CTE_NAME, Collections.emptyList(), context.isNegation()); + return QueryStep.createUnionAllStep(unions, CQ_EXTERNAL_EXTRAS_CTE_NAME, Collections.emptyList(), context.isNegation(), functionProvider); } diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/aggregation/DateAggregationContext.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/aggregation/DateAggregationContext.java index f1819aac19..7eae7cb528 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/aggregation/DateAggregationContext.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/aggregation/DateAggregationContext.java @@ -39,7 +39,7 @@ public DateAggregationContext withStep(DateAggregationCteStep dateAggregationCte public QueryStep getStep(DateAggregationCteStep dateAggregationCteStep) { List querySteps = intervalMergeSteps.get(dateAggregationCteStep); if (querySteps != null && !querySteps.isEmpty()) { - return querySteps.get(0); + return querySteps.getFirst(); } return null; } diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/aggregation/PostgreSqlDateAggregator.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/aggregation/PostgreSqlDateAggregator.java deleted file mode 100644 index 43bb14e36a..0000000000 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/aggregation/PostgreSqlDateAggregator.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.bakdata.conquery.sql.conversion.cqelement.aggregation; - -import static org.jooq.impl.DSL.*; -import static org.jooq.impl.DSL.field; -import static org.jooq.impl.DSL.keyword; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import com.bakdata.conquery.models.query.queryplan.DateAggregationAction; -import com.bakdata.conquery.sql.conversion.cqelement.ConversionContext; -import com.bakdata.conquery.sql.conversion.dialect.SqlDateAggregator; -import com.bakdata.conquery.sql.conversion.dialect.SqlFunctionProvider; -import com.bakdata.conquery.sql.conversion.model.ColumnDateRange; -import com.bakdata.conquery.sql.conversion.model.CteStep; -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.select.SqlSelect; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.jooq.Field; -import org.jooq.Keyword; -import org.jooq.impl.DSL; - -public class PostgreSqlDateAggregator implements SqlDateAggregator { - - @Getter - @RequiredArgsConstructor - private enum PostgresDateAggregationCteStep implements CteStep { - - DATE_AGGREGATED("dates_aggregated"), - DATES_INVERTED("dates_inverted"); - - private final String suffix; - } - - private final SqlFunctionProvider functionProvider; - - public PostgreSqlDateAggregator(SqlFunctionProvider functionProvider) { - this.functionProvider = functionProvider; - } - - @Override - public QueryStep apply( - QueryStep joinedStep, - List carryThroughSelects, - DateAggregationDates dateAggregationDates, - DateAggregationAction dateAggregationAction, - ConversionContext conversionContext - ) { - String joinedStepCteName = joinedStep.getCteName(); - DateAggregationDates qualified = dateAggregationDates.qualify(joinedStepCteName); - - ColumnDateRange aggregatedValidityDate = getAggregatedValidityDate(qualified, dateAggregationAction) - .asValidityDateRange(joinedStepCteName); - - Selects dateAggregationSelects = Selects.builder() - .ids(joinedStep.getQualifiedSelects().getIds()) - .validityDate(Optional.ofNullable(aggregatedValidityDate)) - .sqlSelects(QualifyingUtil.qualify(carryThroughSelects, joinedStepCteName)) - .build(); - - return QueryStep.builder() - .cteName(conversionContext.getNameGenerator().cteStepName(PostgresDateAggregationCteStep.DATE_AGGREGATED, joinedStepCteName)) - .selects(dateAggregationSelects) - .fromTable(QueryStep.toTableLike(joinedStepCteName)) - .predecessors(List.of(joinedStep)) - .build(); - } - - @Override - public QueryStep invertAggregatedIntervals(QueryStep baseStep, ConversionContext conversionContext) { - - Selects baseStepSelects = baseStep.getQualifiedSelects(); - Optional validityDate = baseStepSelects.getValidityDate(); - if (validityDate.isEmpty()) { - return baseStep; - } - - Field maxDateRange = function( - "daterange", - Object.class, - this.functionProvider.getMinDateExpression(), - this.functionProvider.getMaxDateExpression(), - inline("[]") - ); - - // see https://www.postgresql.org/docs/current/functions-range.html - // {[-infinity,infinity]} - {multirange} computes the inverse of a {multirange} - Field invertedValidityDate = field( - "{0}::{1} - {2}", - Object.class, - maxDateRange, - keyword("datemultirange"), - validityDate.get().getRange() - ).as(PostgresDateAggregationCteStep.DATES_INVERTED.getSuffix()); - - return QueryStep.builder() - .cteName(conversionContext.getNameGenerator().cteStepName(PostgresDateAggregationCteStep.DATES_INVERTED, baseStep.getCteName())) - .selects(baseStepSelects.withValidityDate(ColumnDateRange.of(invertedValidityDate))) - .fromTable(QueryStep.toTableLike(baseStep.getCteName())) - .predecessors(List.of(baseStep)) - .build(); - } - - public ColumnDateRange getAggregatedValidityDate(DateAggregationDates dateAggregationDates, DateAggregationAction dateAggregationAction) { - - // see https://www.postgresql.org/docs/current/functions-range.html - String aggregatingOperator = switch (dateAggregationAction) { - case MERGE -> " + "; - case INTERSECT -> " * "; - case BLOCK, NEGATE -> throw new IllegalStateException("Unexpected aggregation mode: " + dateAggregationAction); - }; - - String aggregatedExpression = dateAggregationDates.getValidityDates().stream() - .flatMap(validityDate -> validityDate.toFields().stream()) - .map(PostgreSqlDateAggregator::createEmptyRangeForNullValues) - .collect(Collectors.joining(aggregatingOperator)); - - return ColumnDateRange.of(field(aggregatedExpression)); - } - - private static String createEmptyRangeForNullValues(Field field) { - Keyword datemultirange = keyword("datemultirange"); - return coalesce(field("{0}::{1}", field, datemultirange), field("'{}'::{0}", datemultirange)) - .toString(); - } - -} diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/concept/IntervalPackingSelectsCte.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/concept/IntervalPackingSelectsCte.java index 09a2c423e3..45e03332c0 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/concept/IntervalPackingSelectsCte.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/cqelement/concept/IntervalPackingSelectsCte.java @@ -93,15 +93,8 @@ private static QueryStep create( Preconditions.checkArgument(validityDate.isPresent(), "Can't create a IntervalPackingSelectsCte without a validity date present."); // we need an additional predecessor to unnest the validity date if it is a single column range - List predecessors = List.of(); - QueryStep directPredecessor = predecessor; - if (validityDate.get().isSingleColumnRange()) { - String unnestCteName = tables.cteName(ConceptCteStep.UNNEST_DATE); - directPredecessor = functionProvider.unnestDaterange(validityDate.get(), predecessor, unnestCteName); - predecessors = List.of(directPredecessor); - } - Selects predecessorSelects = directPredecessor.getQualifiedSelects(); + Selects predecessorSelects = predecessor.getQualifiedSelects(); Selects selects = Selects.builder() .ids(predecessorSelects.getIds()) .sqlSelects(intervalPackingSelects) @@ -110,9 +103,9 @@ private static QueryStep create( return QueryStep.builder() .cteName(tables.cteName(ConceptCteStep.INTERVAL_PACKING_SELECTS)) .selects(selects) - .fromTable(QueryStep.toTableLike(directPredecessor.getCteName())) + .fromTable(QueryStep.toTableLike(predecessor.getCteName())) .groupBy(predecessorSelects.getIds().toFields()) - .predecessors(predecessors) + .predecessors(List.of()) .build(); } diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/SqlFunctionProvider.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/SqlFunctionProvider.java index 35725e8438..8e96da4d58 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/SqlFunctionProvider.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/SqlFunctionProvider.java @@ -124,8 +124,8 @@ default List forCDateSet(CDateSet dateset, SharedAliases alias) * Empty means not having both start and end, having just one is acceptable. */ default Condition isNotEmptyValidityDate(ValidityDate validityDate) { - ColumnId singleColumn = validityDate.getColumn(); - if (singleColumn != null) { + if (validityDate.isSingleColumnDaterange()) { + ColumnId singleColumn = validityDate.getColumn(); return field(name(singleColumn.getTable().getTable(), singleColumn.getColumn())).isNotNull(); } @@ -303,10 +303,6 @@ default Field externalId(String id) { return inline(id, SQLDataType.VARCHAR); } - Field lower(Field daterange); - - Field upper(Field daterange); - /** * Any condition that is acceptable for the specific database on a join. * (e.g. Hana does not like `true`) diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/clickhouse/ClickhouseFunctionProvider.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/clickhouse/ClickhouseFunctionProvider.java index 873bd95bf2..0123b29f4a 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/clickhouse/ClickhouseFunctionProvider.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/clickhouse/ClickhouseFunctionProvider.java @@ -8,24 +8,19 @@ import java.util.List; import java.util.function.Function; -import com.bakdata.conquery.models.common.CDateSet; import com.bakdata.conquery.models.common.daterange.CDateRange; import com.bakdata.conquery.models.datasets.Column; import com.bakdata.conquery.models.datasets.concepts.DaterangeSelectOrFilter; import com.bakdata.conquery.models.datasets.concepts.ValidityDate; -import com.bakdata.conquery.sql.conversion.SharedAliases; 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 org.apache.commons.lang3.NotImplementedException; import org.jetbrains.annotations.NotNull; import org.jooq.Condition; import org.jooq.DataType; import org.jooq.Field; import org.jooq.OrderField; -import org.jooq.Record; import org.jooq.SortField; -import org.jooq.Table; import org.jooq.impl.DSL; import org.jooq.impl.SQLDataType; @@ -56,11 +51,6 @@ public Field externalId(String id) { @Override public Condition dateRestriction(ColumnDateRange dateRestriction, ColumnDateRange daterange) { - - if (dateRestriction.isSingleColumnRange() || daterange.isSingleColumnRange()) { - throw new UnsupportedOperationException("Clickhouse does not support single column ranges."); - } - Condition dateRestrictionStartsBeforeDate = dateRestriction.getStart().lessThan(daterange.getEnd()); Condition dateRestrictionEndsAfterDate = dateRestriction.getEnd().greaterThan(daterange.getStart()); @@ -125,7 +115,7 @@ private ColumnDateRange toColumnDateRange(ValidityDate validityDate) { Column endColumn; // if no end column is present, the only existing column is both start and end of the date range - if (validityDate.getColumn() != null) { + if (validityDate.isSingleColumnDaterange()) { Column column = validityDate.getColumn().resolve(); startColumn = column; endColumn = column; @@ -233,11 +223,12 @@ public Field getMaxDateExpression() { @Override public ColumnDateRange forArbitraryDateRange(DaterangeSelectOrFilter daterangeSelectOrFilter) { String tableName = daterangeSelectOrFilter.getTable().getName(); - if (daterangeSelectOrFilter.getEndColumn() != null) { + if (daterangeSelectOrFilter.isSingleColumnDaterange()) { + Column column = daterangeSelectOrFilter.getColumn().resolve(); + return ofStartAndEnd(tableName, column, column); + } else { return ofStartAndEnd(tableName, daterangeSelectOrFilter.getStartColumn().resolve(), daterangeSelectOrFilter.getEndColumn().resolve()); } - Column column = daterangeSelectOrFilter.getColumn().resolve(); - return ofStartAndEnd(tableName, column, column); } @Override @@ -273,11 +264,6 @@ public Field dateRangeAggregation(ColumnDateRange columnDateRange) { @Override public Field dateRangeToField(ColumnDateRange columnDateRange) { - - if (columnDateRange.isSingleColumnRange()) { - throw new UnsupportedOperationException("Clickhouse does not support single-column date ranges."); - } - Field startDateExpression = field("{0}::Nullable(Integer)", Object.class, columnDateRange.getStart()); Field endDateExpression = field("{0}::Nullable(Integer)", Object.class, columnDateRange.getEnd()); @@ -319,18 +305,6 @@ public Field dateDistance(ChronoUnit datePart, Field startDate, F return dateDistance.cast(Integer.class); } - @Override - public Field lower(Field daterange) { - // Only relevant for PG - throw new NotImplementedException(); - } - - @Override - public Field upper(Field daterange) { - // Only relevant for PG - throw new NotImplementedException(); - } - @Override public Field random(Field column) { @@ -356,7 +330,10 @@ public Field yearQuarter(Field dateField) { public ColumnDateRange allRangeIf(Condition condition) { return ColumnDateRange.of( when(condition.isTrue(), - allRange() + getMinDateExpression() + ), + when(condition.isTrue(), + getMaxDateExpression() ) ); } diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/hana/HanaSqlFunctionProvider.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/hana/HanaSqlFunctionProvider.java index bb47ce606c..ae4a3cad16 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/hana/HanaSqlFunctionProvider.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/hana/HanaSqlFunctionProvider.java @@ -18,7 +18,6 @@ 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 org.apache.commons.lang3.NotImplementedException; import org.jetbrains.annotations.NotNull; import org.jooq.Condition; import org.jooq.DataType; @@ -60,11 +59,6 @@ public Condition unconditionalJoinCondition() { @Override public Condition dateRestriction(ColumnDateRange dateRestriction, ColumnDateRange daterange) { - - if (dateRestriction.isSingleColumnRange() || daterange.isSingleColumnRange()) { - throw new UnsupportedOperationException("HANA does not support single column ranges."); - } - Condition dateRestrictionStartsBeforeDate = dateRestriction.getStart().lessThan(daterange.getEnd()); Condition dateRestrictionEndsAfterDate = dateRestriction.getEnd().greaterThan(daterange.getStart()); @@ -115,16 +109,6 @@ public ColumnDateRange emptyColumnDateRange() { return ColumnDateRange.of(inline(null, Date.class), inline(null, Date.class)); } - @Override - public Field lower(Field daterange) { - throw new NotImplementedException("Only relevant for PG."); - } - - @Override - public Field upper(Field daterange) { - throw new NotImplementedException("Only relevant for PG."); - } - @Override public ColumnDateRange forValidityDate(ValidityDate validityDate) { @@ -133,7 +117,7 @@ public ColumnDateRange forValidityDate(ValidityDate validityDate) { @Override public ColumnDateRange allRange() { - return ColumnDateRange.of(getMinDateExpression().as("all_range_start"), getMaxDateExpression().as("all_range_end")); + return ColumnDateRange.of(getMinDateExpression(), getMaxDateExpression()); } private ColumnDateRange toColumnDateRange(ValidityDate validityDate) { @@ -144,7 +128,7 @@ private ColumnDateRange toColumnDateRange(ValidityDate validityDate) { Column endColumn; // if no end column is present, the only existing column is both start and end of the date range - if (validityDate.getColumn() != null) { + if (validityDate.isSingleColumnDaterange()) { Column column = validityDate.getColumn().resolve(); startColumn = column; endColumn = column; @@ -186,7 +170,10 @@ public Field addDays(Field dateColumn, Field amountOfDays) public ColumnDateRange allRangeIf(Condition condition) { return ColumnDateRange.of( when(condition.isTrue(), - allRange() + getMinDateExpression() + ), + when(condition.isTrue(), + getMaxDateExpression() ) ); } @@ -250,11 +237,12 @@ public Field getMaxDateExpression() { @Override public ColumnDateRange forArbitraryDateRange(DaterangeSelectOrFilter daterangeSelectOrFilter) { String tableName = daterangeSelectOrFilter.getTable().getName(); - if (daterangeSelectOrFilter.getEndColumn() != null) { + if (daterangeSelectOrFilter.isSingleColumnDaterange()) { + Column column = daterangeSelectOrFilter.getColumn().resolve(); + return ofStartAndEnd(tableName, column, column); + } else { return ofStartAndEnd(tableName, daterangeSelectOrFilter.getStartColumn().resolve(), daterangeSelectOrFilter.getEndColumn().resolve()); } - Column column = daterangeSelectOrFilter.getColumn().resolve(); - return ofStartAndEnd(tableName, column, column); } @Override @@ -300,11 +288,6 @@ public Field dateRangeAggregation(ColumnDateRange columnDateRange) { @Override public Field dateRangeToField(ColumnDateRange columnDateRange) { - - if (columnDateRange.isSingleColumnRange()) { - throw new UnsupportedOperationException("HANA does not support single-column date ranges."); - } - // translation is handled in printer return field("'[' || {0} || {2} || {1} || ')'", String.class, cast(columnDateRange.getStart(), SQLDataType.VARCHAR), diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PgDistinctSelectConverter.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PgDistinctSelectConverter.java deleted file mode 100644 index b768044af8..0000000000 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PgDistinctSelectConverter.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.bakdata.conquery.sql.conversion.dialect.pg; - -import static org.jooq.impl.DSL.field; - -import com.bakdata.conquery.models.datasets.concepts.select.connector.DistinctSelect; -import com.bakdata.conquery.models.datasets.concepts.select.connector.specific.MappableSingleColumnSelect; -import com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptCteStep; -import com.bakdata.conquery.sql.conversion.cqelement.concept.ConnectorSqlTables; -import com.bakdata.conquery.sql.conversion.model.select.ConnectorSqlSelects; -import com.bakdata.conquery.sql.conversion.model.select.FieldWrapper; -import com.bakdata.conquery.sql.conversion.model.select.SelectContext; -import com.bakdata.conquery.sql.conversion.model.select.SelectConverter; -import com.bakdata.conquery.sql.conversion.model.select.SingleColumnSqlSelect; - -public class PgDistinctSelectConverter implements SelectConverter { - - - @Override - public ConnectorSqlSelects connectorSelect(DistinctSelect distinctSelect, SelectContext selectContext) { - - String alias = selectContext.getNameGenerator().selectName(distinctSelect); - - ConnectorSqlTables tables = selectContext.getTables(); - SingleColumnSqlSelect preprocessingSelect = - MappableSingleColumnSelect.getSubstringSelect(distinctSelect.getColumn().get(), distinctSelect.getSubstringRange(), selectContext, alias); - - String eventFilterTable = selectContext.getTables().cteName(ConceptCteStep.EVENT_FILTER); - SingleColumnSqlSelect qualified = preprocessingSelect.qualify(eventFilterTable); - - FieldWrapper grouped = new FieldWrapper<>(field("array_agg(DISTINCT {0})", Object.class, qualified.select()).as(alias), qualified.select().getName()); - - SingleColumnSqlSelect finalSelect = grouped.qualify(tables.cteName(ConceptCteStep.AGGREGATION_SELECT)); - - return ConnectorSqlSelects.builder() - .preprocessingSelect(preprocessingSelect) - .aggregationSelect(grouped) - .finalSelect(finalSelect) - .build(); - } - - -} diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PgResultSetProcessor.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PgResultSetProcessor.java deleted file mode 100644 index 942f42c583..0000000000 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PgResultSetProcessor.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.bakdata.conquery.sql.conversion.dialect.pg; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.sql.Array; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -import com.bakdata.conquery.models.config.ConqueryConfig; -import com.bakdata.conquery.sql.execution.ResultSetProcessor; -import com.bakdata.conquery.sql.execution.SqlCDateSetParser; -import com.bakdata.conquery.util.DateReader; -import lombok.RequiredArgsConstructor; -import org.apache.logging.log4j.util.Strings; - -@RequiredArgsConstructor -public class PgResultSetProcessor implements ResultSetProcessor { - - protected final ConqueryConfig config; - protected final SqlCDateSetParser dateSetParser; - - /** - * Use to keep null values for primitive data types. - *

- * For example, calling a primitives' ResultSet getter like getDouble, getInt etc. straightaway will never return null. - */ - private static T checkForNullElseGet(ResultSet resultSet, int columnIndex, Getter getter, Class resultType) throws SQLException { - - if (resultSet.getObject(columnIndex) == null) { - return null; - } - return resultType.cast(getter.getFromResultSet(columnIndex)); - } - - @Override - public String getString(ResultSet resultSet, int columnIndex) throws SQLException { - return resultSet.getString(columnIndex); - } - - @Override - public Integer getInteger(ResultSet resultSet, int columnIndex) throws SQLException { - return checkForNullElseGet(resultSet, columnIndex, resultSet::getInt, Integer.class); - } - - @Override - public Double getDouble(ResultSet resultSet, int columnIndex) throws SQLException { - return checkForNullElseGet(resultSet, columnIndex, resultSet::getDouble, Double.class); - } - - @Override - public BigDecimal getMoney(ResultSet resultSet, int columnIndex) throws SQLException { - BigDecimal money = resultSet.getBigDecimal(columnIndex); - if (money == null) { - return null; - } - return money.setScale(2, RoundingMode.HALF_EVEN); - } - - @Override - public Boolean getBoolean(ResultSet resultSet, int columnIndex) throws SQLException { - return checkForNullElseGet(resultSet, columnIndex, resultSet::getBoolean, Boolean.class); - } - - @Override - public Integer getDate(ResultSet resultSet, int columnIndex) throws SQLException { - String dateString = resultSet.getString(columnIndex); - if (dateString == null) { - return null; - } - DateReader dateReader = config.getLocale().getDateReader(); - return (int) dateReader.parseToLocalDate(dateString).toEpochDay(); - } - - @Override - public List getDateRange(ResultSet resultSet, int columnIndex) throws SQLException { - return this.dateSetParser.toEpochDayRange(resultSet.getString(columnIndex)); - } - - @Override - public List> getDateRangeList(ResultSet resultSet, int columnIndex) throws SQLException { - return this.dateSetParser.toEpochDayRangeList(resultSet.getString(columnIndex)); - } - - @Override - public List getStringList(ResultSet resultSet, int columnIndex) throws SQLException { - return list(resultSet, columnIndex); - } - - @Override - public List getBooleanList(ResultSet resultSet, int columnIndex) throws SQLException { - return list(resultSet, columnIndex); - } - - @Override - public List getIntegerList(ResultSet resultSet, int columnIndex) throws SQLException { - return list(resultSet, columnIndex); - } - - @Override - public List getDoubleList(ResultSet resultSet, int columnIndex) throws SQLException { - return list(resultSet, columnIndex); - } - - @Override - public List getMoneyList(ResultSet resultSet, int columnIndex) throws SQLException { - return list( - resultSet, - columnIndex - ); - } - - @Override - public List getDateList(ResultSet resultSet, int columnIndex) throws SQLException { - return list(resultSet, columnIndex); - } - - private List list(ResultSet resultSet, int columnIndex) throws SQLException { - Array arrayExpression = resultSet.getArray(columnIndex); - if (arrayExpression == null) { - return null; - } - - List result = Arrays.stream(((Object[]) arrayExpression.getArray())) - .filter(Objects::nonNull) - .filter(obj -> !(obj instanceof String str) || Strings.isNotBlank(str)) - .map(o -> (T) o) - .toList(); - - return result.isEmpty() ? null : result; - } - - @FunctionalInterface - private interface Getter { - Object getFromResultSet(int columnIndex) throws SQLException; - } - -} diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PostgreDialectBundle.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PostgreDialectBundle.java deleted file mode 100644 index 457a910709..0000000000 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PostgreDialectBundle.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.bakdata.conquery.sql.conversion.dialect.pg; - -import static org.jooq.impl.SQLDataType.NVARCHAR; - -import java.util.List; -import java.util.Map; - -import com.bakdata.conquery.models.config.ConqueryConfig; -import com.bakdata.conquery.models.config.Dialect; -import com.bakdata.conquery.models.datasets.concepts.select.Select; -import com.bakdata.conquery.models.datasets.concepts.select.connector.DistinctSelect; -import com.bakdata.conquery.models.events.MajorTypeId; -import com.bakdata.conquery.models.query.Visitable; -import com.bakdata.conquery.sql.conversion.NodeConverter; -import com.bakdata.conquery.sql.conversion.cqelement.aggregation.PostgreSqlDateAggregator; -import com.bakdata.conquery.sql.conversion.cqelement.intervalpacking.PostgreSqlIntervalPacker; -import com.bakdata.conquery.sql.conversion.dialect.DialectBundle; -import com.bakdata.conquery.sql.conversion.dialect.IntervalPacker; -import com.bakdata.conquery.sql.conversion.dialect.SqlDateAggregator; -import com.bakdata.conquery.sql.conversion.dialect.SqlFunctionProvider; -import com.bakdata.conquery.sql.conversion.forms.StratificationFunctions; -import com.bakdata.conquery.sql.conversion.model.select.SelectConverter; -import com.bakdata.conquery.sql.execution.DefaultResultSetProcessor; -import com.bakdata.conquery.sql.execution.PgSqlCDateSetParser; -import com.bakdata.conquery.sql.execution.ResultSetProcessor; -import com.bakdata.conquery.sql.execution.SqlCDateSetParser; -import lombok.extern.slf4j.Slf4j; -import org.jooq.DSLContext; -import org.jooq.Field; -import org.jooq.SQLDialect; -import org.jooq.impl.BuiltInDataType; -import org.jooq.postgres.extensions.types.DateRange; - -@Slf4j -public class PostgreDialectBundle implements DialectBundle { - - private final SqlFunctionProvider functionProvider; - private final IntervalPacker intervalPacker; - private final SqlDateAggregator dateAggregator; - private final SqlCDateSetParser dateSetParser; - - @Override - public ResultSetProcessor getResultSetProcessor(ConqueryConfig config) { - return new PgResultSetProcessor(config, dateSetParser); - } - - @Override - public Dialect getDialect() { - return Dialect.POSTGRESQL; - } - - @Override - public int getNameMaxLength() { - return 63; - } - - @Override - public String getConnectionTestString() { - return "SELECT 1"; - } - - @Override - public SQLDialect getJooqDialect() { - return SQLDialect.POSTGRES; - } - - public PostgreDialectBundle() { - this.functionProvider = new PostgreSqlFunctionProvider(); - this.intervalPacker = new PostgreSqlIntervalPacker(this.functionProvider); - this.dateAggregator = new PostgreSqlDateAggregator(this.functionProvider); - this.dateSetParser = new PgSqlCDateSetParser(); - } - - - - - @Override - public boolean supportsSingleColumnRanges() { - return true; - } - - @Override - public List> getNodeConverters(DSLContext dslContext) { - return getDefaultNodeConverters(dslContext); - } - - @Override - public Map, ? extends SelectConverter> getSelectConverterOverrides() { - return Map.of(DistinctSelect.class, new PgDistinctSelectConverter()); - } - - @Override - public StratificationFunctions getStratificationFunctions() { - return new PostgresStratificationFunctions(((PostgreSqlFunctionProvider) getFunctionProvider())); - } - - @Override - public boolean isTypeCompatible(Field field, MajorTypeId type) { - log.trace("Field {} type: getTypeName={}, getQualifiedName={}", field.getName(), field.getDataType().getTypeName(), field.getDataType().getQualifiedName()); - return switch (type) { - case STRING -> field.getDataType().isString(); - case INTEGER -> field.getDataType().isInteger(); - case BOOLEAN -> field.getDataType().isBoolean(); - case REAL -> field.getDataType().isNumeric(); - case DECIMAL -> field.getDataType().isDecimal(); - case MONEY -> field.getDataType().isNumeric(); // Not possible to introspect for - case DATE -> field.getDataType().isDate(); - case DATE_RANGE -> field.getDataType().getSQLDataType().equals(new BuiltInDataType<>(DateRange.class, "daterange")); // Not possible to introspect for - }; - } - - @Override - public SqlFunctionProvider getFunctionProvider() { - return this.functionProvider; - } - - @Override - public IntervalPacker getIntervalPacker() { - return this.intervalPacker; - } - - @Override - public SqlDateAggregator getDateAggregator() { - return this.dateAggregator; - } - -} diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PostgreSqlFunctionProvider.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PostgreSqlFunctionProvider.java deleted file mode 100644 index b5f31ffe28..0000000000 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PostgreSqlFunctionProvider.java +++ /dev/null @@ -1,361 +0,0 @@ -package com.bakdata.conquery.sql.conversion.dialect.pg; - -import static org.jooq.impl.DSL.*; - -import java.sql.Date; -import java.time.temporal.ChronoUnit; -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.function.Function; - -import com.bakdata.conquery.models.common.CDateSet; -import com.bakdata.conquery.models.common.daterange.CDateRange; -import com.bakdata.conquery.models.datasets.Column; -import com.bakdata.conquery.models.datasets.concepts.DaterangeSelectOrFilter; -import com.bakdata.conquery.models.datasets.concepts.ValidityDate; -import com.bakdata.conquery.sql.conversion.SharedAliases; -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.Selects; -import org.jetbrains.annotations.NotNull; -import org.jooq.ArrayAggOrderByStep; -import org.jooq.Condition; -import org.jooq.DataType; -import org.jooq.DatePart; -import org.jooq.Field; -import org.jooq.OrderField; -import org.jooq.Record; -import org.jooq.SortField; -import org.jooq.Table; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; - -/** - * Provider of SQL functions for PostgresSQL. - * - * @see PostgreSQL Documentation - */ -public class PostgreSqlFunctionProvider implements SqlFunctionProvider { - - public static final Field EMPTY_RANGE = field("{0}::daterange", inline("empty"), Object.class); - public static final String INFINITY_DATE_VALUE = "infinity"; - public static final String NEGATIVE_INFINITY_DATE_VALUE = "-infinity"; - public static final String OPEN_RANGE = "[)"; - public static final String CLOSED_RANGE = "[]"; - private static final String ANY_CHAR_REGEX = "%"; - - private static Field unnest(Field multirange) { - return function("unnest", Object.class, multirange); - } - - @Override - public Field getMaxDateExpression() { - return field("{0}::date", Date.class, INFINITY_DATE_VALUE); - } - - @Override - public String getAnyCharRegex() { - return ANY_CHAR_REGEX; - } - - @NotNull - @Override - public Collection> orderByValidityDates(Function, ? extends SortField> ordering, List> validityDateFields) { - - return validityDateFields.stream().map(field -> nullif(field, emptyDateRange())).map(ordering).map(SortField::nullsLast).toList(); - } - - public Field emptyDateRange() { - return field("{0}::daterange", inline("empty")); - } - - @Override - public Field getMinDateExpression() { - return field("{0}::date", Date.class, NEGATIVE_INFINITY_DATE_VALUE); - } - - @Override - public Condition dateRestriction(ColumnDateRange dateRestriction, ColumnDateRange daterange) { - // the && operator checks if two ranges overlap (see https://www.postgresql.org/docs/15/functions-range.html) - return condition("{0} && {1}", ensureIsSingleColumnRange(dateRestriction).getRange(), ensureIsSingleColumnRange(daterange).getRange()); - } - - public Field daterange(Field startColumn, Field endColumn, String bounds) { - return function("daterange", Object.class, startColumn, endColumn, inline(bounds)); - } - - @Override - public List forCDateSet(CDateSet dateset, SharedAliases alias) { - // Postgres can return a date set as a single multidaterange - Field[] daterangeFields = dateset.asRanges().stream().map(this::forCDateRange).map(ColumnDateRange::getRange).toArray(Field[]::new); - Field multirange = datemultirange(daterangeFields); - return List.of(ColumnDateRange.of(multirange).as(alias.getAlias())); - } - - @Override - public ColumnDateRange forCDateRange(CDateRange daterange) { - - String startDateExpression = NEGATIVE_INFINITY_DATE_VALUE; - String endDateExpression = INFINITY_DATE_VALUE; - - if (daterange.hasLowerBound()) { - startDateExpression = daterange.getMin().toString(); - } - if (daterange.hasUpperBound()) { - endDateExpression = daterange.getMax().toString(); - } - - Field daterangeField = daterange(inline(startDateExpression), inline(endDateExpression), CLOSED_RANGE); - - return ColumnDateRange.of(daterangeField); - } - - private Field datemultirange(Field... fields) { - return function("datemultirange", Object.class, fields); - } - - @Override - public ColumnDateRange forValidityDate(ValidityDate validityDate) { - // if there is no validity date, each entity has the max range {-inf/inf} as validity date - return validityDate == null ? allRange() : toColumnDateRange(validityDate); - } - - - @Override - public ColumnDateRange allRange() { - return ColumnDateRange.of(daterange(toDateField(NEGATIVE_INFINITY_DATE_VALUE), toDateField(INFINITY_DATE_VALUE), CLOSED_RANGE)); - } - - private ColumnDateRange toColumnDateRange(ValidityDate validityDate) { - String tableName = validityDate.getConnector().resolveTableId().getTable(); - - if (validityDate.getColumn() != null) { - return ofSingleColumn(tableName, validityDate.getColumn().resolve()); - } - - return ofStartAndEnd(tableName, validityDate.getStartColumn().resolve(), validityDate.getEndColumn().resolve()); - } - - @Override - public Field toDateField(String dateValue) { - return field("{0}::{1}", Date.class, val(dateValue), keyword("date")); - } - - private ColumnDateRange ofSingleColumn(String tableName, Column column) { - - Field dateRange; - - dateRange = switch (column.getType()) { - // if validityDateColumn is a DATE_RANGE we can make use of Postgres' integrated daterange type, but the upper bound is exclusive by default - case DATE_RANGE -> { - Field daterange = field(name(column.getName())); - Field withOpenLowerEnd = coalesce(lower(daterange), toDateField(NEGATIVE_INFINITY_DATE_VALUE)); - Field withOpenUpperEnd = coalesce(upper(daterange), toDateField(INFINITY_DATE_VALUE)); - yield when(daterange.isNull(), emptyDateRange()).otherwise(daterange(withOpenLowerEnd, withOpenUpperEnd, OPEN_RANGE)); - } - // if the validity date column is not of daterange type, we construct it manually - case DATE -> { - Field singleDate = field(name(tableName, column.getName()), Date.class); - Field withOpenLowerEnd = coalesce(singleDate, toDateField(NEGATIVE_INFINITY_DATE_VALUE)); - Field withOpenUpperEnd = coalesce(singleDate, toDateField(INFINITY_DATE_VALUE)); - yield when(singleDate.isNull(), emptyDateRange()).otherwise(daterange(withOpenLowerEnd, withOpenUpperEnd, CLOSED_RANGE)); - } - default -> - throw new IllegalArgumentException("Given column type '%s' can't be converted to a proper date restriction.".formatted(column.getType())); - }; - - return ColumnDateRange.of(dateRange); - } - - private ColumnDateRange ofStartAndEnd(String tableName, Column startColumn, Column endColumn) { - - Field startField = field(name(tableName, startColumn.getName())); - Field withOpenLowerEnd = coalesce(startField, toDateField(NEGATIVE_INFINITY_DATE_VALUE)); - Field endField = field(name(tableName, endColumn.getName())); - Field withOpenUpperEnd = coalesce(endField, toDateField(INFINITY_DATE_VALUE)); - - return ColumnDateRange.of(when(startField.isNull().and(endField.isNull()), emptyDateRange()).otherwise(this.daterange(withOpenLowerEnd, withOpenUpperEnd, CLOSED_RANGE))); - } - - - - @Override - public ColumnDateRange allRangeIf(Condition condition) { - return ColumnDateRange.of(when(condition.isTrue(), datemultirange(daterange(toDateField(NEGATIVE_INFINITY_DATE_VALUE), toDateField(INFINITY_DATE_VALUE), CLOSED_RANGE)))); - } - - @Override - public ColumnDateRange forValidityDate(ValidityDate validityDate, CDateRange dateRestriction) { - // if there is no validity date, each entity has the max range {-inf/inf} as validity date - ColumnDateRange validityDateRange = validityDate == null ? allRange() : toColumnDateRange(validityDate); - ColumnDateRange restriction = toColumnDateRange(dateRestriction); - return intersection(validityDateRange, restriction); - } - - @Override - public ColumnDateRange intersection(ColumnDateRange left, ColumnDateRange right) { - return ColumnDateRange.of(field("{0} * {1}", ensureIsSingleColumnRange(right).getRange(), ensureIsSingleColumnRange(left).getRange())); - } - - private ColumnDateRange toColumnDateRange(CDateRange dateRestriction) { - String startDateExpression = NEGATIVE_INFINITY_DATE_VALUE; - String endDateExpression = INFINITY_DATE_VALUE; - - if (dateRestriction.hasLowerBound()) { - startDateExpression = dateRestriction.getMin().toString(); - } - if (dateRestriction.hasUpperBound()) { - endDateExpression = dateRestriction.getMax().toString(); - } - - Field dateRestrictionRange = daterange(toDateField(startDateExpression), toDateField(endDateExpression), CLOSED_RANGE); - return ColumnDateRange.of(dateRestrictionRange); - } - - - @Override - public ColumnDateRange forArbitraryDateRange(DaterangeSelectOrFilter daterangeSelectOrFilter) { - String tableName = daterangeSelectOrFilter.getTable().getName(); - - if (daterangeSelectOrFilter.getColumn() != null) { - return ofSingleColumn(tableName, daterangeSelectOrFilter.getColumn().resolve()); - } - - return ofStartAndEnd(tableName, daterangeSelectOrFilter.getStartColumn().resolve(), daterangeSelectOrFilter.getEndColumn().resolve()); - } - - @Override - public ColumnDateRange aggregated(ColumnDateRange columnDateRange) { - return ColumnDateRange.of(rangeAgg(columnDateRange)).as(columnDateRange.getAlias()); - } - - private Field rangeAgg(ColumnDateRange columnDateRange) { - return function("range_agg", Object.class, columnDateRange.getRange()); - } - - @Override - public ColumnDateRange toDualColumn(ColumnDateRange columnDateRange) { - Field daterange = columnDateRange.getRange(); - Field start = lower(daterange); - Field end = upper(daterange); - return ColumnDateRange.of(start, end); - } - - - - @Override - public QueryStep unnestDaterange(ColumnDateRange nested, QueryStep predecessor, String cteName) { - - ColumnDateRange qualifiedRange = nested.qualify(predecessor.getCteName()); - - ColumnDateRange unnested = ColumnDateRange.of(unnest(qualifiedRange.getRange()).as(qualifiedRange.getAlias()), qualifiedRange.getAlias()); - - Selects selects = Selects.builder().ids(predecessor.getQualifiedSelects().getIds()).validityDate(Optional.of(unnested)).build(); - - return QueryStep.builder().cteName(cteName).selects(selects).fromTable(QueryStep.toTableLike(predecessor.getCteName())).build(); - } - - @Override - public Field dateRangeAggregation(ColumnDateRange columnDateRange) { - return rangeAgg(columnDateRange); - } - - @Override - public Field dateRangeToField(ColumnDateRange columnDateRange) { - if (!columnDateRange.isSingleColumnRange()) { - throw new UnsupportedOperationException("All column date ranges should have been converted to single column ranges."); - } - return columnDateRange.getRange(); - } - - @Override - public Field dateDistance(ChronoUnit datePart, Field startDate, Field endDate) { - - if (datePart == ChronoUnit.DAYS) { - return field("{0}", Integer.class, endDate.minus(startDate)); - } - - Field age = function("age", Integer.class, endDate, startDate); - return switch (datePart) { - case MONTHS -> extract(DatePart.YEAR, age).multiply(12).plus(extract(DatePart.MONTH, age)); - case YEARS -> extract(DatePart.YEAR, age); - case DECADES -> extract(DatePart.DECADE, age); - case CENTURIES -> extract(DatePart.CENTURY, age); - default -> throw new UnsupportedOperationException("Given ChronoUnit %s is not supported."); - }; - } - - @Override - public Field cast(Field field, DataType type) { - return DSL.cast(field, type); - } - - public Field extract(DatePart datePart, Field timeInterval) { - return field("{0}({1} {2} {3})", Integer.class, keyword("extract"), keyword(datePart.toSQL()), keyword("from"), timeInterval); - } - - @Override - public Field addDays(Field dateColumn, Field amountOfDays) { - return dateColumn.plus(amountOfDays); - } - - @Override - public Field random(Field column) { - ArrayAggOrderByStep arrayAgg = arrayAgg(field("{0} {1} {2}", column, keyword("ORDER BY"), function("random", Object.class))); - return field("({0})[1]", column.getType(), arrayAgg); - } - - @Override - public Condition likeRegex(Field field, String pattern) { - return field.similarTo(pattern); - } - - @Override - public Field yearQuarter(Field dateField) { - return field("{0}::varchar || '-Q' || {1}::varchar", String.class, DSL.extract(dateField, DatePart.YEAR), DSL.extract(dateField, DatePart.QUARTER)); - } - - - @Override - public Condition isNotEmptyDateRange(ColumnDateRange columnDateRange) { - return condition(function("isempty", Boolean.class, columnDateRange.getRange())).not(); - } - - @Override - public ColumnDateRange emptyColumnDateRange() { - return ColumnDateRange.of(EMPTY_RANGE); - } - - @Override - public Condition orAgg(Field field) { - return condition(boolOr(field)); - } - - @Override - public Field lower(Field daterange) { - return function("lower", Date.class, daterange); - } - - @Override - public Field upper(Field daterange) { - return function("upper", Date.class, daterange); - } - - private ColumnDateRange ensureIsSingleColumnRange(ColumnDateRange daterange) { - return daterange.isSingleColumnRange() ? daterange : ColumnDateRange.of(daterange(daterange.getStart(), daterange.getEnd(), OPEN_RANGE)); // end is already exclusive - } - - @Override - public Field asArrayRepr(List value) { - return array(value.toArray()); - } - - - @Override - public Field arrayOut(List> fields) { - return array(fields); - } - -} diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PostgresStratificationFunctions.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PostgresStratificationFunctions.java deleted file mode 100644 index c1872e6e54..0000000000 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PostgresStratificationFunctions.java +++ /dev/null @@ -1,215 +0,0 @@ -package com.bakdata.conquery.sql.conversion.dialect.pg; - -import static com.bakdata.conquery.sql.conversion.forms.FormConstants.SERIES_INDEX; -import static org.jooq.impl.DSL.*; - -import java.math.BigDecimal; -import java.sql.Date; -import java.sql.Timestamp; -import java.time.temporal.ChronoUnit; -import java.util.Map; - -import com.bakdata.conquery.apiv1.query.TemporalSamplerFactory; -import com.bakdata.conquery.sql.conversion.dialect.Interval; -import com.bakdata.conquery.sql.conversion.forms.Offset; -import com.bakdata.conquery.sql.conversion.forms.StratificationFunctions; -import com.bakdata.conquery.sql.conversion.model.ColumnDateRange; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.jooq.DatePart; -import org.jooq.Field; -import org.jooq.Keyword; -import org.jooq.Record; -import org.jooq.Table; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; - -@Getter -@RequiredArgsConstructor -public class PostgresStratificationFunctions extends StratificationFunctions { - - private static final Map> INTERVAL_MAP = Map.of( - Interval.ONE_YEAR_INTERVAL, inline("1 year"), - Interval.YEAR_AS_DAYS_INTERVAL, inline("365 days"), - Interval.QUARTER_INTERVAL, inline("3 months"), - Interval.NINETY_DAYS_INTERVAL, inline("90 days"), - Interval.ONE_DAY_INTERVAL, inline("1 day") - ); - - private static final Keyword INTERVAL_KEYWORD = keyword("interval"); - - private final PostgreSqlFunctionProvider functionProvider; - - private static Field castExpressionToDate(Field shiftedDate) { - return field("({0})::{1}", Date.class, shiftedDate, keyword("date")); - } - - private static void checkIsSingleColumnRange(ColumnDateRange dateRange) { - if (!dateRange.isSingleColumnRange()) { - throw new IllegalStateException("Expecting a single column range for Postgres SQL dialect."); - } - } - - @Override - public ColumnDateRange ofStartAndEnd(Field start, Field end) { - return ColumnDateRange.of(functionProvider.daterange(start, end, "[)")); - } - - @Override - public Field absoluteIndexStartDate(ColumnDateRange dateRange) { - return lower(dateRange); - } - - @Override - public Field lowerBoundYearStart(ColumnDateRange dateRange) { - return castExpressionToDate(jumpToYearStart(lower(dateRange))); - } - - @Override - public Field upperBoundYearEnd(ColumnDateRange dateRange) { - return field( - "{0} + {1} {2}", - Date.class, - dateTruncate(inline("year"), inclusiveUpper(dateRange)), - INTERVAL_KEYWORD, - INTERVAL_MAP.get(Interval.ONE_YEAR_INTERVAL) - ); - } - - @Override - public Field upperBoundYearEndQuarterAligned(ColumnDateRange dateRange) { - Field lowerBoundQuarter = functionProvider.extract(DatePart.QUARTER, lower(dateRange)); - Field upperBound = inclusiveUpper(dateRange); - Field yearStartOfUpperBound = castExpressionToDate(jumpToYearStart(upperBound)); - Field yearEndQuarterAligned = addQuarters(yearStartOfUpperBound, lowerBoundQuarter, Offset.MINUS_ONE); - // we add +1 year to the quarter aligned end if it is less than the upper bound we want to align - return when( - yearEndQuarterAligned.lessThan(upperBound), - shiftByInterval(yearEndQuarterAligned, Interval.ONE_YEAR_INTERVAL, inline(1), Offset.NONE) - ) - .otherwise(yearEndQuarterAligned); - } - - @Override - public Field lowerBoundQuarterStart(ColumnDateRange dateRange) { - return jumpToQuarterStart(lower(dateRange)); - } - - @Override - public Field jumpToQuarterStart(Field date) { - Field quarter = functionProvider.extract(DatePart.QUARTER, date); - return addQuarters(jumpToYearStart(date), quarter, Offset.MINUS_ONE); - } - - @Override - public Field upperBoundQuarterEnd(ColumnDateRange dateRange) { - Field inclusiveEnd = inclusiveUpper(dateRange); - return jumpToNextQuarterStart(inclusiveEnd); - } - - @Override - public Field jumpToNextQuarterStart(Field date) { - Field yearStart = dateTruncate(inline("year"), date); - Field quarter = functionProvider.extract(DatePart.QUARTER, date); - return addQuarters(yearStart, quarter, Offset.NONE); - } - - @Override - public Field intSeriesField() { - return SERIES_INDEX; - } - - @Override - public Table generateIntSeries(int from, int to) { - return table("generate_series({0}, {1})", from, to); - } - - @Override - public Field indexSelectorField(TemporalSamplerFactory indexSelector, ColumnDateRange validityDate) { - return switch (indexSelector) { - case EARLIEST -> min(lower(validityDate)); - // upper returns the exclusive end date, we want to inclusive one, so we add -1 day - case LATEST -> max(inclusiveUpper(validityDate)); - case RANDOM -> { - // we calculate a random int which is in range of the date distance between upper and lower bound - Field dateDistanceInDays = functionProvider.dateDistance(ChronoUnit.DAYS, lower(validityDate), exclusiveUpper(validityDate)); - Field randomAmountOfDays = rand().times(dateDistanceInDays); - Field flooredAsInt = functionProvider.cast(floor(randomAmountOfDays), SQLDataType.INTEGER); - // then we add this random amount (of days) to the start date - Field randomDateInRange = functionProvider.addDays(lower(validityDate), flooredAsInt); - // finally, we handle multiple ranges by randomizing which range we use to select a random date from - yield functionProvider.random(randomDateInRange); - } - }; - } - - @Override - public Field shiftByInterval(Field startDate, Interval interval, Field amount, Offset offset) { - Field intervalExpression = INTERVAL_MAP.get(interval); - return addMultipliedInterval(startDate, intervalExpression, amount, offset); - } - - @Override - public Field lower(ColumnDateRange dateRange) { - checkIsSingleColumnRange(dateRange); - return function("lower", Date.class, dateRange.getRange()); - } - - @Override - protected Field inclusiveUpper(ColumnDateRange dateRange) { - checkIsSingleColumnRange(dateRange); - return exclusiveUpper(dateRange).minus(1); - } - - @Override - protected Field exclusiveUpper(ColumnDateRange dateRange) { - checkIsSingleColumnRange(dateRange); - return function("upper", Date.class, dateRange.getRange()); - } - - @Override - protected ColumnDateRange calcRange(Field start, Interval interval) { - Field intervalExpression = INTERVAL_MAP.get(interval); - return ofStartAndEnd( - calcStartDate(start, intervalExpression), - calcEndDate(start, intervalExpression) - ); - } - - private Field calcStartDate(Field start, Field intervalExpression) { - Field intSeriesField = intSeriesField(); - return addMultipliedInterval(start, intervalExpression, intSeriesField, Offset.MINUS_ONE); - } - - private Field calcEndDate(Field start, Field intervalExpression) { - Field intSeriesField = intSeriesField(); - return addMultipliedInterval(start, intervalExpression, intSeriesField, Offset.NONE); - } - - private Field addMultipliedInterval(Field start, Field intervalExpression, Field amount, Offset offset) { - Field multiplier = amount.plus(offset.getOffset()); - Field shiftedDate = field( - "{0} + {1} {2} * {3}", - Timestamp.class, - start, - INTERVAL_KEYWORD, - intervalExpression, - multiplier - ); - // cast to date because we only want the date from the timestamp - return castExpressionToDate(shiftedDate); - } - - private Field dateTruncate(Field field, Field date) { - return function("date_trunc", Timestamp.class, field, date); - } - - private Field addQuarters(Field start, Field amountOfQuarters, Offset offset) { - return addMultipliedInterval(start, INTERVAL_MAP.get(Interval.QUARTER_INTERVAL), amountOfQuarters, offset); - } - - private Field jumpToYearStart(Field date) { - return dateTruncate(inline("year"), date); - } - -} diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/forms/RelativeStratification.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/forms/RelativeStratification.java index 8731afabb7..d06755cbdc 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/forms/RelativeStratification.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/forms/RelativeStratification.java @@ -163,7 +163,7 @@ private QueryStep createCompleteTable(QueryStep totalBoundsStep, RelativeFormQue Stream.concat(Stream.ofNullable(outcomeTable), Stream.ofNullable(featureTable)).toList(), FormCteStep.COMPLETE.getSuffix(), Collections.emptyList(), - context.isNegation() + context.isNegation(), functionProvider ); } @@ -196,7 +196,7 @@ private QueryStep createIntervalTable(QueryStep totalBoundsStep, Resolution reso List.of(timeBeforeStep, timeAfterStep), FormCteStep.stratificationCte(resolution).getSuffix(), Collections.emptyList(), - context.isNegation() + context.isNegation(), functionProvider ); } diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/forms/StratificationTableFactory.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/forms/StratificationTableFactory.java index 046f300e3d..4287a5ace8 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/forms/StratificationTableFactory.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/forms/StratificationTableFactory.java @@ -55,7 +55,7 @@ protected static QueryStep unionResolutionTables(List unionSteps, Lis withQualifiedSelects, FormCteStep.FULL_STRATIFICATION.getSuffix(), Stream.concat(predecessors.stream(), unionSteps.stream()).toList(), - context.isNegation() + context.isNegation(), context.getFunctionProvider() ); } diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/ColumnDateRange.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/ColumnDateRange.java index ff12ef137a..b1f635e945 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/ColumnDateRange.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/ColumnDateRange.java @@ -5,7 +5,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import com.bakdata.conquery.sql.conversion.dialect.pg.PostgreSqlFunctionProvider; import com.bakdata.conquery.sql.conversion.model.select.SqlSelect; import lombok.Getter; import lombok.ToString; @@ -13,7 +12,6 @@ import org.jooq.Field; import org.jooq.impl.DSL; -//TODO split this class up into Dialect specific versions. @Getter @ToString(onlyExplicitlyIncluded = true) public class ColumnDateRange implements SqlSelect { @@ -22,8 +20,6 @@ public class ColumnDateRange implements SqlSelect { private static final String START_SUFFIX = "_start"; private static final String END_SUFFIX = "_end"; - @ToString.Include - private final Field range; @ToString.Include private final Field start; @ToString.Include @@ -31,27 +27,11 @@ public class ColumnDateRange implements SqlSelect { private final String alias; protected ColumnDateRange(Field startColumn, Field endColumn, String alias) { - range = null; start = startColumn; end = endColumn; this.alias = alias; } - protected ColumnDateRange(Field range, String alias) { - this.range = (Field) range; - start = null; - end = null; - this.alias = alias; - } - - public static ColumnDateRange of(Field rangeColumn, String alias) { - return new ColumnDateRange(rangeColumn, alias); - } - - public static ColumnDateRange of(Field rangeColumn) { - return new ColumnDateRange(rangeColumn, ""); - } - public static ColumnDateRange of(Field startColumn, Field endColumn) { return new ColumnDateRange(startColumn, endColumn, ""); } @@ -60,37 +40,19 @@ public static ColumnDateRange of(Field startColumn, Field endColumn, return new ColumnDateRange(startColumn, endColumn, alias); } - public static ColumnDateRange empty() { - final Field emptyRange = DSL.field(DSL.val("{}")); - return ColumnDateRange.of(emptyRange); - } public ColumnDateRange asValidityDateRange(String alias) { return as(alias + VALIDITY_DATE_COLUMN_NAME_SUFFIX); } - /** - * @return True if this {@link ColumnDateRange} consists of only 1 column. - * False if it consists of a start and end field. - */ - public boolean isSingleColumnRange() { - return range != null; - } - @Override public List> toFields() { - if (isSingleColumnRange()) { - return List.of(range); - } return Stream.of(start, end) .collect(Collectors.toList()); } @Override public ColumnDateRange qualify(String qualifier) { - if (isSingleColumnRange()) { - return new ColumnDateRange(QualifyingUtil.qualify(getRange(), qualifier), getAlias()); - } return new ColumnDateRange( QualifyingUtil.qualify(getStart(), qualifier), QualifyingUtil.qualify(getEnd(), qualifier), @@ -100,13 +62,13 @@ public ColumnDateRange qualify(String qualifier) { @Override public List requiredColumns() { - return toFields().stream().map(Field::getName).toList(); + return toFields().stream() + .map(Field::getName) + .distinct() + .toList(); } public ColumnDateRange as(String alias) { - if (isSingleColumnRange()) { - return new ColumnDateRange(range.as(alias), alias); - } return new ColumnDateRange( start.as(alias + START_SUFFIX), end.as(alias + END_SUFFIX), @@ -115,12 +77,6 @@ public ColumnDateRange as(String alias) { } public ColumnDateRange coalesce(ColumnDateRange right) { - if (isSingleColumnRange() != right.isSingleColumnRange()) { - throw new UnsupportedOperationException("Can only join ColumnDateRanges of same type"); - } - if (isSingleColumnRange()) { - return ColumnDateRange.of(DSL.coalesce(range, right.getRange())).as(alias); - } return ColumnDateRange.of( DSL.coalesce(start, right.getStart()), DSL.coalesce(end, right.getEnd()) @@ -128,28 +84,14 @@ public ColumnDateRange coalesce(ColumnDateRange right) { } public Condition join(ColumnDateRange right) { - if (isSingleColumnRange() != right.isSingleColumnRange()) { - throw new UnsupportedOperationException("Can only join ColumnDateRanges of same type"); - } - - if (isSingleColumnRange()) { - return range.coerce(Object.class).eq(right.getRange()); - } return start.eq(right.getStart()).and(end.eq(right.getEnd())); } public Condition isNotNull() { - if (isSingleColumnRange()) { - return range.isNotNull(); - } return start.isNotNull().and(end.isNotNull()); } public static Condition isNotEmpty(ColumnDateRange columnDateRange) { - if (columnDateRange.isSingleColumnRange()) { - return columnDateRange.getRange().notEqual(PostgreSqlFunctionProvider.EMPTY_RANGE); - } - return columnDateRange.getStart().isNotNull().and(columnDateRange.getEnd().isNotNull()); } diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/QueryStep.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/QueryStep.java index b5804b4694..ee3d96bcde 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/QueryStep.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/QueryStep.java @@ -1,8 +1,6 @@ package com.bakdata.conquery.sql.conversion.model; -import java.util.Collections; -import java.util.List; - +import com.bakdata.conquery.sql.conversion.dialect.SqlFunctionProvider; import com.bakdata.conquery.sql.conversion.model.select.SqlSelect; import lombok.Builder; import lombok.Singular; @@ -13,6 +11,9 @@ import org.jooq.TableLike; import org.jooq.impl.DSL; +import java.util.Collections; +import java.util.List; + /** * Intermediate representation of an SQL query. */ @@ -42,6 +43,10 @@ public class QueryStep { @Builder.Default boolean unionAll = true; + @Builder.Default + boolean forTableExport = false; + + /** * If the query should be negated or not. */ @@ -57,23 +62,23 @@ public class QueryStep { @Singular List predecessors; - public static QueryStep createUnionAllStep(List unionSteps, String cteName, List predecessors, boolean negation) { - return createUnionStep(unionSteps, cteName, predecessors, true, negation); + public static QueryStep createUnionAllStep(List unionSteps, String cteName, List predecessors, boolean negation, SqlFunctionProvider functionProvider) { + return createUnionStep(unionSteps, cteName, predecessors, true, negation, functionProvider); } - public static QueryStep createUnionStep(List unionSteps, String cteName, List predecessors, boolean negation) { - return createUnionStep(unionSteps, cteName, predecessors, false, negation); + public static QueryStep createUnionStep(List unionSteps, String cteName, List predecessors, boolean negation, SqlFunctionProvider functionProvider) { + return createUnionStep(unionSteps, cteName, predecessors, false, negation, functionProvider); } - private static QueryStep createUnionStep(List unionSteps, String cteName, List predecessors, boolean unionAll, boolean negation) { - return unionSteps.get(0) - .toBuilder() - .cteName(cteName) - .union(unionSteps.subList(1, unionSteps.size())) - .unionAll(unionAll) - .predecessors(predecessors) - .negate(negation) - .build(); + private static QueryStep createUnionStep(List unionSteps, String cteName, List predecessors, boolean unionAll, boolean negation, SqlFunctionProvider functionProvider) { + QueryStep first = unionSteps.getFirst(); + return first.toBuilder() + .cteName(cteName) + .union(unionSteps.stream().skip(1).toList()) + .unionAll(unionAll) + .predecessors(predecessors) + .negate(negation) + .build(); } public static TableLike toTableLike(String fromTableName) { diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/QueryStepTransformer.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/QueryStepTransformer.java index 04dcf0cd84..fa34d101b0 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/QueryStepTransformer.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/QueryStepTransformer.java @@ -1,37 +1,33 @@ package com.bakdata.conquery.sql.conversion.model; -import java.util.List; -import java.util.stream.Stream; - -import org.jooq.CommonTableExpression; -import org.jooq.DSLContext; +import com.bakdata.conquery.sql.conversion.dialect.SqlFunctionProvider; +import lombok.RequiredArgsConstructor; +import org.jooq.*; import org.jooq.Record; -import org.jooq.Select; -import org.jooq.SelectConditionStep; -import org.jooq.SelectHavingStep; -import org.jooq.SelectSelectStep; import org.jooq.impl.DSL; +import java.util.List; +import java.util.stream.Stream; + /** * Transformer for translating the intermediate representation of {@link QueryStep} into the final SQL query. */ +@RequiredArgsConstructor public class QueryStepTransformer { private final DSLContext dslContext; - public QueryStepTransformer(DSLContext dslContext) { - this.dslContext = dslContext; - } - /** * Converts a given {@link QueryStep} into an executable SELECT statement. */ - public Select toSelectQuery(QueryStep queryStep) { + public Select toSelectQuery(QueryStep queryStep, SqlFunctionProvider functionProvider) { - SelectConditionStep queryBase = this.dslContext.with(constructPredecessorCteList(queryStep)) - .select(queryStep.getSelects().all()) - .from(queryStep.getFromTables()) - .where(queryStep.getConditions()); + List> finalRepresentation = queryStep.getSelects().toFinalRepresentation(functionProvider, queryStep.isForTableExport()); + + SelectConditionStep queryBase = this.dslContext.with(constructPredecessorCteList(queryStep, functionProvider)) + .select(finalRepresentation) + .from(queryStep.getFromTables()) + .where(queryStep.getConditions()); // grouping SelectHavingStep grouped = queryBase; @@ -40,43 +36,45 @@ public Select toSelectQuery(QueryStep queryStep) { } // union - if (!queryStep.isUnion()) { - return grouped; + if (queryStep.isUnion()) { + return union(queryStep, grouped, functionProvider); } - return union(queryStep, grouped); + + return grouped; } - private List> constructPredecessorCteList(QueryStep queryStep) { - return queryStep.getPredecessors().stream() - .flatMap(predecessor -> toCteList(predecessor).stream()) - .toList(); + private List> constructPredecessorCteList(QueryStep queryStep, SqlFunctionProvider functionProvider) { + return predecessorCtes(queryStep, functionProvider) + .toList(); } - private List> toCteList(QueryStep queryStep) { + private List> toCteList(QueryStep queryStep, SqlFunctionProvider functionProvider) { return Stream.concat( - this.predecessorCtes(queryStep), - Stream.of(toCte(queryStep)) + this.predecessorCtes(queryStep, functionProvider), + Stream.of(toCte(queryStep, functionProvider)) ).toList(); } - private Stream> predecessorCtes(QueryStep queryStep) { + private Stream> predecessorCtes(QueryStep queryStep, SqlFunctionProvider functionProvider) { return queryStep.getPredecessors().stream() - .flatMap(predecessor -> toCteList(predecessor).stream()); + .flatMap(predecessor -> toCteList(predecessor, functionProvider).stream()); } - private CommonTableExpression toCte(QueryStep queryStep) { - Select selectStep = toSelectStep(queryStep); + private CommonTableExpression toCte(QueryStep queryStep, SqlFunctionProvider functionProvider) { + Select selectStep = toSelectStep(queryStep, functionProvider); return DSL.name(queryStep.getCteName()).as(selectStep); } - private Select toSelectStep(QueryStep queryStep) { + private Select toSelectStep(QueryStep queryStep, SqlFunctionProvider functionProvider) { SelectSelectStep selectClause; + + List> allSelects = queryStep.isForTableExport() ? queryStep.getSelects().toFinalRepresentation(functionProvider, true) : queryStep.getSelects().all(); + if (queryStep.isSelectDistinct()) { - selectClause = dslContext.selectDistinct(queryStep.getSelects().all()); - } - else { - selectClause = dslContext.select(queryStep.getSelects().all()); + selectClause = dslContext.selectDistinct(allSelects); + } else { + selectClause = dslContext.select(allSelects); } Select selectStep = selectClause.from(queryStep.getFromTables()).where(queryStep.getConditions()); @@ -86,15 +84,25 @@ private Select toSelectStep(QueryStep queryStep) { } if (queryStep.isUnion()) { - selectStep = union(queryStep, selectStep); + selectStep = union(queryStep, selectStep, functionProvider); } return selectStep; } - private Select union(QueryStep queryStep, Select base) { + private Select union(QueryStep queryStep, Select base, SqlFunctionProvider functionProvider) { for (QueryStep unionStep : queryStep.getUnion()) { - base = queryStep.isUnionAll() ? base.unionAll(toSelectStep(unionStep)) : base.union(toSelectStep(unionStep)); + Select selectStep = + queryStep.isForTableExport() ? + // TODO this feels like a leaked abstraction, but i am not able to find the proper injection layer at the moment. + toSelectQuery(unionStep, functionProvider) : + toSelectStep(unionStep, functionProvider); + + if (queryStep.isUnionAll()) { + base = base.unionAll(selectStep); + } else { + base = base.union(selectStep); + } } return base; } diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/Selects.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/Selects.java index e9a7aee838..160bae7711 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/Selects.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/Selects.java @@ -1,18 +1,20 @@ package com.bakdata.conquery.sql.conversion.model; import com.bakdata.conquery.models.datasets.concepts.select.Select; -import java.util.List; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - +import com.bakdata.conquery.sql.conversion.SharedAliases; +import com.bakdata.conquery.sql.conversion.dialect.SqlFunctionProvider; import com.bakdata.conquery.sql.conversion.model.select.SqlSelect; import lombok.Builder; import lombok.Singular; import lombok.Value; import org.jooq.Field; +import java.util.List; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + @Value @Builder(toBuilder = true) public class Selects { @@ -25,25 +27,31 @@ public class Selects { @Singular List sqlSelects; - public Selects toFinalRepresentation() { - return builder() - .ids(this.ids) - .validityDate(this.validityDate) - .stratificationDate(this.stratificationDate) - .sqlSelects(this.sqlSelects.stream().map(SqlSelect::toFinalRepresentation).toList()) - .build(); - } + public List> toFinalRepresentation(SqlFunctionProvider functionProvider, boolean forTableExport) { - public Selects withValidityDate(ColumnDateRange validityDate) { - return this.toBuilder() - .validityDate(Optional.of(validityDate)) - .build(); + final Optional> validityDateRendered = + !forTableExport + ? getValidityDate().map(vdd -> functionProvider.dateRangeAggregation(vdd).as(SharedAliases.DATES_COLUMN.getAlias())) + : getValidityDate().map(vdd -> functionProvider.dateRangeToField(vdd).as(SharedAliases.DATES_COLUMN.getAlias())); + + final Optional> stratificationDateRendered = getStratificationDate().map(vdd -> functionProvider.dateRangeToField(vdd).as(SharedAliases.STRATIFICATION_BOUNDS.getAlias())); + + return Stream.of( + getIds().toFields().stream(), + stratificationDateRendered.stream(), + validityDateRendered.stream(), + getSqlSelects().stream().flatMap(sqlSelect -> sqlSelect.toFinalRepresentation().toFields().stream()) + ) + .flatMap(Function.identity()) + .map(select -> (Field) select) + .distinct() + .collect(Collectors.toList()); } public Selects blockValidityDate() { return this.toBuilder() - .validityDate(Optional.empty()) - .build(); + .validityDate(Optional.empty()) + .build(); } public Selects qualify(String qualifier) { @@ -51,8 +59,8 @@ public Selects qualify(String qualifier) { List sqlSelects = this.sqlSelects.stream().map(sqlSelect -> sqlSelect.qualify(qualifier)).collect(Collectors.toList()); SelectsBuilder builder = Selects.builder() - .ids(ids) - .sqlSelects(sqlSelects); + .ids(ids) + .sqlSelects(sqlSelects); if (this.validityDate.isPresent()) { builder = builder.validityDate(this.validityDate.map(_validityDate -> _validityDate.qualify(qualifier))); @@ -67,15 +75,15 @@ public Selects qualify(String qualifier) { public List> all() { return Stream.of( - this.ids.toFields().stream(), - this.stratificationDate.stream().flatMap(range -> range.toFields().stream()), - this.validityDate.stream().flatMap(range -> range.toFields().stream()), - this.sqlSelects.stream().flatMap(sqlSelect -> sqlSelect.toFields().stream()) - ) - .flatMap(Function.identity()) - .map(select -> (Field) select) - .distinct() - .collect(Collectors.toList()); + this.ids.toFields().stream(), + this.stratificationDate.stream().flatMap(range -> range.toFields().stream()), + this.validityDate.stream().flatMap(range -> range.toFields().stream()), + this.sqlSelects.stream().flatMap(sqlSelect -> sqlSelect.toFields().stream()) + ) + .flatMap(Function.identity()) + .map(select -> (Field) select) + .distinct() + .collect(Collectors.toList()); } /** @@ -83,14 +91,14 @@ public List> all() { */ public List> nonExplicitSelects() { return Stream.of( - this.ids.toFields().stream(), - this.stratificationDate.stream().flatMap(range -> range.toFields().stream()), - this.validityDate.stream().flatMap(range -> range.toFields().stream()) - ) - .flatMap(Function.identity()) - .map(select -> (Field) select) - .distinct() - .collect(Collectors.toList()); + this.ids.toFields().stream(), + this.stratificationDate.stream().flatMap(range -> range.toFields().stream()), + this.validityDate.stream().flatMap(range -> range.toFields().stream()) + ) + .flatMap(Function.identity()) + .map(select -> (Field) select) + .distinct() + .collect(Collectors.toList()); } /** @@ -98,9 +106,9 @@ public List> nonExplicitSelects() { */ public List> explicitSelects() { return this.sqlSelects.stream() - .flatMap(sqlSelect -> sqlSelect.toFields().stream()) - .distinct() - .collect(Collectors.toList()); + .flatMap(sqlSelect -> sqlSelect.toFields().stream()) + .distinct() + .collect(Collectors.toList()); } } diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/aggregator/CountQuartersSqlAggregator.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/aggregator/CountQuartersSqlAggregator.java index 2c922e348e..8f438e4654 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/aggregator/CountQuartersSqlAggregator.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/aggregator/CountQuartersSqlAggregator.java @@ -8,7 +8,6 @@ import com.bakdata.conquery.models.datasets.Column; import com.bakdata.conquery.models.datasets.concepts.filters.specific.CountQuartersFilter; import com.bakdata.conquery.models.datasets.concepts.select.connector.specific.CountQuartersSelect; -import com.bakdata.conquery.models.events.MajorTypeId; import com.bakdata.conquery.models.identifiable.ids.specific.ColumnId; import com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptCteStep; import com.bakdata.conquery.sql.conversion.cqelement.concept.ConnectorSqlTables; @@ -16,7 +15,6 @@ import com.bakdata.conquery.sql.conversion.dialect.Interval; import com.bakdata.conquery.sql.conversion.dialect.SqlFunctionProvider; import com.bakdata.conquery.sql.conversion.forms.StratificationFunctions; -import com.bakdata.conquery.sql.conversion.model.ColumnDateRange; import com.bakdata.conquery.sql.conversion.model.filter.CountCondition; import com.bakdata.conquery.sql.conversion.model.filter.FilterConverter; import com.bakdata.conquery.sql.conversion.model.filter.SqlFilters; @@ -49,21 +47,6 @@ private static CommonAggregationSelect createSingleDateColumnAggregatio return CommonAggregationSelect.builder().rootSelect(rootSelect).groupBy(countQuartersAggregation).build(); } - private static CommonAggregationSelect createSingleDaterangeColumnAggregationSelect( - Column countColumn, - String alias, - ConnectorSqlTables tables, - SqlFunctionProvider functionProvider, - StratificationFunctions stratificationFunctions) { - - ColumnDateRange daterange = ColumnDateRange.of(DSL.field(DSL.name(tables.getRootTable(), countColumn.getName()))); - - Field quarterStart = stratificationFunctions.lowerBoundQuarterStart(daterange); - Field nextQuarterStart = stratificationFunctions.upperBoundQuarterEnd(daterange); - - return sumQuarterCount(quarterStart, nextQuarterStart, alias, tables, functionProvider); - } - private static CommonAggregationSelect createTwoDateColumnAggregationSelect( Column startColumn, Column endColumn, @@ -114,16 +97,8 @@ private static CommonAggregationSelect buildSqlSelect( } Column countColumn = column.resolve(); - if (countColumn.getType() == MajorTypeId.DATE_RANGE) { - return createSingleDaterangeColumnAggregationSelect(countColumn, - alias, - tables, - functionProvider, - stratificationFunctions - ); - } - return createSingleDateColumnAggregationSelect(countColumn, alias, tables, functionProvider); + return createSingleDateColumnAggregationSelect(countColumn, alias, tables, functionProvider); } @Override diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/aggregator/DateDistanceSqlAggregator.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/aggregator/DateDistanceSqlAggregator.java index 5d798027f9..b46f250ed4 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/aggregator/DateDistanceSqlAggregator.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/aggregator/DateDistanceSqlAggregator.java @@ -1,37 +1,29 @@ package com.bakdata.conquery.sql.conversion.model.aggregator; -import java.sql.Date; -import java.time.LocalDate; -import java.time.temporal.ChronoUnit; - import com.bakdata.conquery.models.common.Range; import com.bakdata.conquery.models.common.daterange.CDateRange; import com.bakdata.conquery.models.datasets.Column; import com.bakdata.conquery.models.datasets.concepts.filters.specific.DateDistanceFilter; import com.bakdata.conquery.models.datasets.concepts.select.connector.specific.DateDistanceSelect; -import com.bakdata.conquery.models.events.MajorTypeId; import com.bakdata.conquery.sql.conversion.cqelement.ConversionContext; import com.bakdata.conquery.sql.conversion.cqelement.concept.ConceptCteStep; import com.bakdata.conquery.sql.conversion.cqelement.concept.ConnectorSqlTables; import com.bakdata.conquery.sql.conversion.cqelement.concept.FilterContext; import com.bakdata.conquery.sql.conversion.dialect.SqlFunctionProvider; -import com.bakdata.conquery.sql.conversion.forms.StratificationFunctions; import com.bakdata.conquery.sql.conversion.model.ColumnDateRange; import com.bakdata.conquery.sql.conversion.model.SqlTables; -import com.bakdata.conquery.sql.conversion.model.filter.DateDistanceCondition; -import com.bakdata.conquery.sql.conversion.model.filter.FilterConverter; -import com.bakdata.conquery.sql.conversion.model.filter.SqlFilters; -import com.bakdata.conquery.sql.conversion.model.filter.WhereClauses; -import com.bakdata.conquery.sql.conversion.model.filter.WhereCondition; -import com.bakdata.conquery.sql.conversion.model.select.ConnectorSqlSelects; -import com.bakdata.conquery.sql.conversion.model.select.ExtractingSqlSelect; -import com.bakdata.conquery.sql.conversion.model.select.FieldWrapper; -import com.bakdata.conquery.sql.conversion.model.select.SelectContext; -import com.bakdata.conquery.sql.conversion.model.select.SelectConverter; +import com.bakdata.conquery.sql.conversion.model.filter.*; +import com.bakdata.conquery.sql.conversion.model.select.*; import org.jooq.Condition; import org.jooq.Field; import org.jooq.impl.DSL; +import java.sql.Date; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; + +import static org.jooq.impl.DSL.field; + public class DateDistanceSqlAggregator implements SelectConverter, FilterConverter { @Override @@ -96,17 +88,9 @@ private FieldWrapper createDateDistanceSelect( SqlTables tables, ConversionContext conversionContext ) { - Field startDate; - if (column.getType() == MajorTypeId.DATE) { - startDate = DSL.field(DSL.name(tables.getRootTable(), column.getName()), Date.class); - } - else { - StratificationFunctions stratificationFunctions = conversionContext.getDialectBundle().getStratificationFunctions(); - Field daterangeColumn = DSL.field(DSL.name(tables.getRootTable(), column.getName()), Date.class); - startDate = stratificationFunctions.lower(ColumnDateRange.of(daterangeColumn)); - } + Field startDate = field(DSL.name(tables.getRootTable(), column.getName()), Date.class); - Field endDate = getEndDate(conversionContext); + Field endDate = getEndDate(conversionContext); SqlFunctionProvider functionProvider = conversionContext.getFunctionProvider(); return new FieldWrapper<>(functionProvider.dateDistance(timeUnit, startDate, endDate).as(alias)); diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/aggregator/DurationSumSqlAggregator.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/aggregator/DurationSumSqlAggregator.java index ad640e0730..93f9c41151 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/aggregator/DurationSumSqlAggregator.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/aggregator/DurationSumSqlAggregator.java @@ -49,12 +49,13 @@ public Condition convertForTableExport(DurationSumFilter filter, FilterContext startDateField; Field endDateField; + if (filter.isSingleColumnDaterange()) { Column column = filter.getColumn().resolve(); String tableName = column.getTable().getName(); Field daterangeField = field(DSL.name(tableName, column.getName()), Date.class); - startDateField = functionProvider.lower(daterangeField); - endDateField = functionProvider.upper(daterangeField); + startDateField = daterangeField; + endDateField = daterangeField; } else { Column startColumn = filter.getStartColumn().resolve(); diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/select/ConceptColumnSelectConverter.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/select/ConceptColumnSelectConverter.java index d4fab7ed06..96c74631c6 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/select/ConceptColumnSelectConverter.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/select/ConceptColumnSelectConverter.java @@ -104,7 +104,7 @@ private static QueryStep createUnionConnectorConnectorsStep( ) { List unionSteps = connectors.stream().map(connector -> createConnectorColumnSelectQuery(connector, alias, selectContext)).toList(); String unionedColumnsCteName = selectContext.getNameGenerator().cteStepName(CONCEPT_COLUMN_STEPS.UNIONED_COLUMNS, alias); - return QueryStep.createUnionStep(unionSteps, unionedColumnsCteName, Collections.emptyList(), false); //TODO is false correct here? + return QueryStep.createUnionStep(unionSteps, unionedColumnsCteName, Collections.emptyList(), false, selectContext.getFunctionProvider()); //TODO is false correct here? } private static QueryStep createConnectorColumnSelectQuery( diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/select/ExistsSqlSelect.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/select/ExistsSqlSelect.java index f6729273ef..01b19a7cc9 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/select/ExistsSqlSelect.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/model/select/ExistsSqlSelect.java @@ -1,23 +1,27 @@ package com.bakdata.conquery.sql.conversion.model.select; -import java.util.Collections; -import java.util.List; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import org.jooq.Field; import org.jooq.Name; import org.jooq.impl.DSL; +import java.util.Collections; +import java.util.List; + +import static org.jooq.impl.DSL.*; +import static org.jooq.impl.DSL.field; + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class ExistsSqlSelect implements SingleColumnSqlSelect { - private static final Field EXISTS = DSL.inline(1); + private static final Field EXISTS = inline(1); private final Field exists; private final Name alias; public static ExistsSqlSelect withAlias(final String alias) { - return new ExistsSqlSelect(EXISTS.as(alias), DSL.name(alias)); + return new ExistsSqlSelect(EXISTS.as(alias), name(alias)); } @Override @@ -32,23 +36,23 @@ public boolean isUniversal() { @Override public Field select() { - return this.exists; + return exists; } @Override public Field aliased() { - return DSL.field(exists.getName(), exists.getType()); + return field(exists.getName(), exists.getType()); } @Override public SingleColumnSqlSelect qualify(final String qualifier) { - final Field qualified = DSL.field(DSL.name(DSL.name(qualifier), alias), exists.getType()); + final Field qualified = field(name(name(qualifier), alias), exists.getType()); return new ExistsSqlSelect(qualified, alias); } @Override public SqlSelect connectorAggregate() { - return new ExistsSqlSelect(DSL.max(coalesceWithZero()).as(alias), alias); + return new ExistsSqlSelect(max(coalesceWithZero()).as(alias), alias); } @Override @@ -57,6 +61,6 @@ public SqlSelect toFinalRepresentation() { } private Field coalesceWithZero() { - return DSL.coalesce(select(), DSL.value(0)); + return coalesce(select(), value(0)); } } diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/query/ConceptQueryConverter.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/query/ConceptQueryConverter.java index 8078a2bb8e..0eedc29c21 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/query/ConceptQueryConverter.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/query/ConceptQueryConverter.java @@ -1,23 +1,12 @@ package com.bakdata.conquery.sql.conversion.query; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; - import com.bakdata.conquery.apiv1.query.ConceptQuery; import com.bakdata.conquery.apiv1.query.concept.specific.CQNegation; import com.bakdata.conquery.models.query.DateAggregationMode; import com.bakdata.conquery.sql.conversion.NodeConverter; -import com.bakdata.conquery.sql.conversion.SharedAliases; import com.bakdata.conquery.sql.conversion.cqelement.ConversionContext; import com.bakdata.conquery.sql.conversion.dialect.SqlFunctionProvider; -import com.bakdata.conquery.sql.conversion.model.ColumnDateRange; -import com.bakdata.conquery.sql.conversion.model.ConqueryJoinType; -import com.bakdata.conquery.sql.conversion.model.QueryStep; -import com.bakdata.conquery.sql.conversion.model.QueryStepJoiner; -import com.bakdata.conquery.sql.conversion.model.QueryStepTransformer; -import com.bakdata.conquery.sql.conversion.model.Selects; -import com.bakdata.conquery.sql.conversion.model.SqlQuery; +import com.bakdata.conquery.sql.conversion.model.*; import com.bakdata.conquery.sql.conversion.model.select.SqlSelect; import lombok.RequiredArgsConstructor; import org.jooq.Field; @@ -25,6 +14,10 @@ import org.jooq.Select; import org.jooq.TableLike; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + @RequiredArgsConstructor public class ConceptQueryConverter implements NodeConverter { @@ -77,14 +70,14 @@ public ConversionContext convert(ConceptQuery conceptQuery, ConversionContext co List predecessors = Stream.concat(Stream.of(preFinalStep), Stream.ofNullable(contextAfterConversion.getExternalExtras())).toList(); QueryStep finalStep = QueryStep.builder() - .cteName(null) // the final QueryStep won't be converted to a CTE - .selects(getFinalSelects(conceptQuery, preFinalSelects, functionProvider).toFinalRepresentation()) - .fromTable(getFinalTable(preFinalStep, contextAfterConversion)) - .groupBy(getFinalGroupBySelects(preFinalSelects)) - .predecessors(predecessors) - .build(); - - Select finalQuery = this.queryStepTransformer.toSelectQuery(finalStep); + .cteName(null) // the final QueryStep won't be converted to a CTE + .selects(getFinalSelects(conceptQuery, preFinalSelects, functionProvider)) + .fromTable(getFinalTable(preFinalStep, contextAfterConversion)) + .groupBy(getFinalGroupBySelects(preFinalSelects)) + .predecessors(predecessors) + .build(); + + Select finalQuery = this.queryStepTransformer.toSelectQuery(finalStep, functionProvider); return contextAfterConversion.withFinalQuery(new SqlQuery(finalQuery, conceptQuery.getResultInfos())); } @@ -92,12 +85,7 @@ private Selects getFinalSelects(ConceptQuery conceptQuery, Selects preFinalSelec if (conceptQuery.getDateAggregationMode() == DateAggregationMode.NONE) { return preFinalSelects.blockValidityDate(); } - else if (preFinalSelects.getValidityDate().isEmpty()) { - // TODO i think this is unreachable? - return preFinalSelects.withValidityDate(functionProvider.allRange()); - } - Field validityDateStringAggregation = functionProvider.dateRangeAggregation(preFinalSelects.getValidityDate().get()); - return preFinalSelects.withValidityDate(ColumnDateRange.of(validityDateStringAggregation).as(SharedAliases.DATES_COLUMN.getAlias())); + return preFinalSelects; } private List> getFinalGroupBySelects(Selects preFinalSelects) { diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/query/FormConversionHelper.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/query/FormConversionHelper.java index 05876ea091..75b32f027b 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/query/FormConversionHelper.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/query/FormConversionHelper.java @@ -1,12 +1,5 @@ package com.bakdata.conquery.sql.conversion.query; -import static org.jooq.impl.DSL.*; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import com.bakdata.conquery.apiv1.forms.FeatureGroup; import com.bakdata.conquery.apiv1.query.ArrayConceptQuery; import com.bakdata.conquery.apiv1.query.ConceptQuery; @@ -18,28 +11,58 @@ import com.bakdata.conquery.sql.conversion.dialect.SqlFunctionProvider; import com.bakdata.conquery.sql.conversion.forms.FormCteStep; import com.bakdata.conquery.sql.conversion.forms.FormType; -import com.bakdata.conquery.sql.conversion.model.ColumnDateRange; -import com.bakdata.conquery.sql.conversion.model.ConqueryJoinType; -import com.bakdata.conquery.sql.conversion.model.QueryStep; -import com.bakdata.conquery.sql.conversion.model.QueryStepJoiner; -import com.bakdata.conquery.sql.conversion.model.QueryStepTransformer; -import com.bakdata.conquery.sql.conversion.model.Selects; -import com.bakdata.conquery.sql.conversion.model.SqlIdColumns; -import com.bakdata.conquery.sql.conversion.model.SqlQuery; +import com.bakdata.conquery.sql.conversion.model.*; import com.bakdata.conquery.sql.conversion.model.select.FieldWrapper; import com.google.common.base.Preconditions; import lombok.RequiredArgsConstructor; -import org.jooq.Condition; -import org.jooq.Field; +import org.jooq.*; import org.jooq.Record; -import org.jooq.Select; -import org.jooq.TableLike; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.jooq.impl.DSL.*; @RequiredArgsConstructor public class FormConversionHelper { private final QueryStepTransformer queryStepTransformer; + /** + * Selects the ID, resolution, index and date range from stratification table plus all explicit selects from the converted features step. + * For {@link FormType#RELATIVE}, the {@link FeatureGroup} will be set too. + */ + private static Selects getFinalSelects( + FormType formType, + QueryStep stratificationTable, + QueryStep convertedFeatures + ) { + Selects preFinalSelects = convertedFeatures.getQualifiedSelects(); + Selects stratificationSelects = stratificationTable.getQualifiedSelects(); + + SqlIdColumns ids = stratificationSelects.getIds().forFinalSelect(); + + Selects.SelectsBuilder selects = Selects.builder() + .ids(ids) + .validityDate(preFinalSelects.getValidityDate()) + .stratificationDate(stratificationSelects.getStratificationDate()); + + // relative forms have FeatureGroup information after the stratification date and before all other selects + if (formType.equals(FormType.RELATIVE)) { + Field indexField = field(name(stratificationTable.getCteName(), SharedAliases.INDEX.getAlias()), Integer.class); + Field scope = when(indexField.isNull().or(indexField.lessThan(0)), inline(FeatureGroup.FEATURE.toString())) + .otherwise(inline(FeatureGroup.OUTCOME.toString())) + .as(SharedAliases.OBSERVATION_SCOPE.getAlias()); + + selects = selects.sqlSelect(new FieldWrapper<>(scope)); + } + + return selects.sqlSelects(preFinalSelects.getSqlSelects()).build(); + + } + /** * Converts the given {@link Query} and creates another {@link QueryStep} on top which extracts only the primary id and the validity dates. */ @@ -52,16 +75,16 @@ public QueryStep convertPrerequisite(Query query, ConversionContext context) { Selects prerequisiteSelects = convertedPrerequisite.getQualifiedSelects(); // we keep the primary column and the validity date Selects selects = Selects.builder() - .ids(new SqlIdColumns(prerequisiteSelects.getIds().getPrimaryColumn())) - .validityDate(prerequisiteSelects.getValidityDate()) - .build(); + .ids(new SqlIdColumns(prerequisiteSelects.getIds().getPrimaryColumn())) + .validityDate(prerequisiteSelects.getValidityDate()) + .build(); // we want to keep each primary column and the corresponding distinct validity date ranges List> groupByFields = Stream.concat( - Stream.of(prerequisiteSelects.getIds().getPrimaryColumn()), - prerequisiteSelects.getValidityDate().stream().flatMap(validityDate -> validityDate.toFields().stream()) - ) - .collect(Collectors.toList()); + Stream.of(prerequisiteSelects.getIds().getPrimaryColumn()), + prerequisiteSelects.getValidityDate().stream().flatMap(validityDate -> validityDate.toFields().stream()) + ) + .collect(Collectors.toList()); // filter out entries with a null validity date Optional columnDateRange = prerequisiteSelects.getValidityDate(); @@ -69,19 +92,18 @@ public QueryStep convertPrerequisite(Query query, ConversionContext context) { if (columnDateRange.isPresent()) { dateNotNullCondition = context.getFunctionProvider().isNotEmptyDateRange(columnDateRange.get()); - } - else { + } else { dateNotNullCondition = falseCondition(); } return QueryStep.builder() - .cteName(FormCteStep.EXTRACT_IDS.getSuffix()) - .selects(selects) - .fromTable(QueryStep.toTableLike(convertedPrerequisite.getCteName())) - .conditions(List.of(dateNotNullCondition)) - .groupBy(groupByFields) - .predecessors(List.of(convertedPrerequisite)) - .build(); + .cteName(FormCteStep.EXTRACT_IDS.getSuffix()) + .selects(selects) + .fromTable(QueryStep.toTableLike(convertedPrerequisite.getCteName())) + .conditions(List.of(dateNotNullCondition)) + .groupBy(groupByFields) + .predecessors(List.of(convertedPrerequisite)) + .build(); } public ConversionContext convertForm( @@ -127,51 +149,14 @@ private ConversionContext createFinalSelect( SqlFunctionProvider functionProvider = context.getFunctionProvider(); QueryStep finalStep = QueryStep.builder() - .cteName(null) // the final QueryStep won't be converted to a CTE - .selects(getFinalSelects(formType, stratificationTable, convertedFeatures, functionProvider).toFinalRepresentation()) - .fromTable(joinedTable) - .predecessors(queriesToJoin) - .build(); + .cteName(null) // the final QueryStep won't be converted to a CTE + .selects(getFinalSelects(formType, stratificationTable, convertedFeatures)) + .fromTable(joinedTable) + .predecessors(queriesToJoin) + .build(); - Select selectQuery = queryStepTransformer.toSelectQuery(finalStep); + Select selectQuery = queryStepTransformer.toSelectQuery(finalStep, functionProvider); return context.withFinalQuery(new SqlQuery(selectQuery, resultInfos)); } - /** - * Selects the ID, resolution, index and date range from stratification table plus all explicit selects from the converted features step. - * For {@link FormType#RELATIVE}, the {@link FeatureGroup} will be set too. - */ - private static Selects getFinalSelects( - FormType formType, - QueryStep stratificationTable, - QueryStep convertedFeatures, - SqlFunctionProvider functionProvider - ) { - Selects preFinalSelects = convertedFeatures.getQualifiedSelects(); - - Selects stratificationSelects = stratificationTable.getQualifiedSelects(); - SqlIdColumns ids = stratificationSelects.getIds().forFinalSelect(); - Field daterangeConcatenated = functionProvider.dateRangeToField(stratificationSelects.getStratificationDate().get()) - .as(SharedAliases.STRATIFICATION_BOUNDS.getAlias()); - - Selects.SelectsBuilder selects = Selects.builder() - .ids(ids) - .validityDate(Optional.empty()) - .stratificationDate(Optional.of(ColumnDateRange.of(daterangeConcatenated))); - - if (formType != FormType.RELATIVE) { - return selects.sqlSelects(preFinalSelects.getSqlSelects()).build(); - } - - // relative forms have FeatureGroup information after the stratification date and before all other selects - Field indexField = field(name(stratificationTable.getCteName(), SharedAliases.INDEX.getAlias()), Integer.class); - Field scope = when(indexField.isNull().or(indexField.lessThan(0)), inline(FeatureGroup.FEATURE.toString())) - .otherwise(inline(FeatureGroup.OUTCOME.toString())) - .as(SharedAliases.OBSERVATION_SCOPE.getAlias()); - - return selects.sqlSelect(new FieldWrapper<>(scope)) - .sqlSelects(preFinalSelects.getSqlSelects()) - .build(); - } - } diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/query/TableExportQueryConverter.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/query/TableExportQueryConverter.java index 0f356d9216..b859c9a024 100644 --- a/backend/src/main/java/com/bakdata/conquery/sql/conversion/query/TableExportQueryConverter.java +++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/query/TableExportQueryConverter.java @@ -1,15 +1,5 @@ package com.bakdata.conquery.sql.conversion.query; -import static org.jooq.impl.DSL.*; -import static org.jooq.impl.DSL.field; - -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import com.bakdata.conquery.apiv1.query.Query; import com.bakdata.conquery.apiv1.query.TableExportQuery; import com.bakdata.conquery.apiv1.query.concept.filter.CQTable; @@ -22,21 +12,22 @@ import com.bakdata.conquery.sql.conversion.cqelement.ConversionContext; import com.bakdata.conquery.sql.conversion.dialect.SqlFunctionProvider; import com.bakdata.conquery.sql.conversion.forms.FormCteStep; -import com.bakdata.conquery.sql.conversion.model.ColumnDateRange; -import com.bakdata.conquery.sql.conversion.model.QueryStep; -import com.bakdata.conquery.sql.conversion.model.QueryStepTransformer; -import com.bakdata.conquery.sql.conversion.model.Selects; -import com.bakdata.conquery.sql.conversion.model.SqlIdColumns; -import com.bakdata.conquery.sql.conversion.model.SqlQuery; +import com.bakdata.conquery.sql.conversion.model.*; import com.bakdata.conquery.sql.conversion.model.select.FieldWrapper; import com.bakdata.conquery.util.TablePrimaryColumnUtil; import com.google.common.base.Preconditions; import lombok.RequiredArgsConstructor; -import org.jooq.Condition; -import org.jooq.Field; +import org.jooq.*; import org.jooq.Record; -import org.jooq.Select; -import org.jooq.Table; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.jooq.impl.DSL.*; @RequiredArgsConstructor public class TableExportQueryConverter implements NodeConverter { @@ -60,16 +51,16 @@ private static QueryStep convertPrerequisite(TableExportQuery exportQuery, Conve final Selects prerequisiteSelects = convertedPrerequisite.getQualifiedSelects(); final Selects selects = Selects.builder() - .ids(new SqlIdColumns(prerequisiteSelects.getIds().getPrimaryColumn())) - .build(); + .ids(new SqlIdColumns(prerequisiteSelects.getIds().getPrimaryColumn())) + .build(); return QueryStep.builder() - .cteName(FormCteStep.EXTRACT_IDS.getSuffix()) - .selects(selects) - .fromTable(QueryStep.toTableLike(convertedPrerequisite.getCteName())) - .groupBy(selects.getIds().toFields()) // group by primary column to ensure max. 1 entry per subject - .predecessors(List.of(convertedPrerequisite)) - .build(); + .cteName(FormCteStep.EXTRACT_IDS.getSuffix()) + .selects(selects) + .fromTable(QueryStep.toTableLike(convertedPrerequisite.getCteName())) + .groupBy(selects.getIds().toFields()) // group by primary column to ensure max. 1 entry per subject + .predecessors(List.of(convertedPrerequisite)) + .build(); } /** @@ -85,7 +76,7 @@ private static QueryStep convertTable( ConversionContext context ) { final Field primaryColumn = TablePrimaryColumnUtil.findPrimaryColumn(cqTable.getConnector().resolve().getResolvedTable(), - context.getDefaultPrimaryColumn() + context.getDefaultPrimaryColumn() ); final SqlIdColumns ids = new SqlIdColumns(primaryColumn); final String conceptConnectorName = @@ -95,20 +86,21 @@ private static QueryStep convertTable( final List> exportColumns = initializeFields(cqTable, positions); final Selects selects = Selects.builder() - .ids(ids) - .validityDate(validityDate) - .sqlSelects(exportColumns) - .build(); + .ids(ids) + .validityDate(validityDate) + .sqlSelects(exportColumns) + .build(); final List filters = cqTable.getFilters().stream().map(filterValue -> filterValue.convertForTableExport(ids, context)).toList(); final Table joinedTable = joinConnectorTableWithPrerequisite(cqTable, ids, convertedPrerequisite, dateRestriction, context); return QueryStep.builder() - .cteName(conceptConnectorName) - .selects(selects) - .fromTable(joinedTable) - .conditions(filters) - .build(); + .cteName(conceptConnectorName) + .selects(selects) + .fromTable(joinedTable) + .conditions(filters) + .forTableExport(true) + .build(); } private static Optional convertTablesValidityDate(CQTable table, String alias, ConversionContext context) { @@ -119,9 +111,9 @@ private static Optional convertTablesValidityDate(CQTable table return Optional.of(functionProvider.emptyColumnDateRange()); } - final Field validityDateField = functionProvider.dateRangeToField(functionProvider.forValidityDate(table.findValidityDate())); + final ColumnDateRange validityDateField = functionProvider.forValidityDate(table.findValidityDate()); - return Optional.of(ColumnDateRange.of(validityDateField).asValidityDateRange(alias)); + return Optional.of(validityDateField); } private static List> initializeFields(CQTable cqTable, Map positions) { @@ -184,7 +176,7 @@ private static Field createSourceInfoSelect(CQTable cqTable) { private static Field createColumnSelect(Column column, int position) { final String columnName = "%s-%s".formatted(column.getName(), position); return field(name(column.getTable().getName(), column.getName())) - .as(columnName); + .as(columnName); } @Override @@ -200,23 +192,23 @@ public ConversionContext convert(TableExportQuery tableExportQuery, ConversionCo final CDateRange dateRestriction = CDateRange.of(tableExportQuery.getDateRange()); final List convertedTables = tableExportQuery.getConcepts().stream() - .flatMap(concept -> concept.getTables().stream().map(table -> convertTable( - table, - concept, - dateRestriction, - convertedPrerequisite, - positions, - context - ))) - .toList(); + .flatMap(concept -> concept.getTables().stream().map(table -> convertTable( + table, + concept, + dateRestriction, + convertedPrerequisite, + positions, + context + ))) + .toList(); final QueryStep unionedTables = QueryStep.createUnionAllStep( - convertedTables, - null, // no CTE name required as this step will be the final select - List.of(convertedPrerequisite), - context.isNegation() - ); - final Select selectQuery = queryStepTransformer.toSelectQuery(unionedTables); + convertedTables, + null, // no CTE name required as this step will be the final select + List.of(convertedPrerequisite), + context.isNegation(), context.getFunctionProvider() + ); + final Select selectQuery = queryStepTransformer.toSelectQuery(unionedTables, context.getFunctionProvider()); return context.withFinalQuery(new SqlQuery(selectQuery, tableExportQuery.getResultInfos())); } diff --git a/backend/src/main/java/com/bakdata/conquery/sql/execution/PgSqlCDateSetParser.java b/backend/src/main/java/com/bakdata/conquery/sql/execution/PgSqlCDateSetParser.java deleted file mode 100644 index 4046e4e262..0000000000 --- a/backend/src/main/java/com/bakdata/conquery/sql/execution/PgSqlCDateSetParser.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.bakdata.conquery.sql.execution; - -import java.util.Collections; -import java.util.Set; - -import com.bakdata.conquery.sql.conversion.dialect.pg.PostgreSqlFunctionProvider; -import com.bakdata.conquery.util.DateReader; - -public class PgSqlCDateSetParser extends DefaultCDateSetParser { - private static final String DATE_RANGE_SEP = ","; - - private static final String DATE_RANGE_END_EXCLUSIVE = ")"; - private static final String DATE_RANGE_END_INCLUSIVE = "]"; - private static final String DATE_RANGE_BEGIN_INCLUSIVE = "["; - - private static final String DATE_SET_START = "{"; - private static final String DATE_SET_END = "}"; - private static final String EMPTY_DATE_SET = "empty"; - - public PgSqlCDateSetParser() { - super( - new DateReader(Set.of("yyyy-MM-dd"), Collections.emptyList(), Collections.emptyList()), - DATE_RANGE_SEP, - DATE_RANGE_SEP, - PostgreSqlFunctionProvider.NEGATIVE_INFINITY_DATE_VALUE, - PostgreSqlFunctionProvider.INFINITY_DATE_VALUE, - DATE_RANGE_END_EXCLUSIVE, - DATE_RANGE_END_INCLUSIVE, - DATE_RANGE_BEGIN_INCLUSIVE, - DATE_SET_START, - DATE_SET_END, - EMPTY_DATE_SET - ); - } - -} diff --git a/backend/src/test/java/com/bakdata/conquery/execution/DefaultSqlCDateSetParserTest.java b/backend/src/test/java/com/bakdata/conquery/execution/DefaultSqlCDateSetParserTest.java deleted file mode 100644 index 897f65bd4f..0000000000 --- a/backend/src/test/java/com/bakdata/conquery/execution/DefaultSqlCDateSetParserTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.bakdata.conquery.execution; - -import java.util.stream.Stream; - -import com.bakdata.conquery.models.common.CDateSet; -import com.bakdata.conquery.models.common.daterange.CDateRange; -import com.bakdata.conquery.models.config.LocaleConfig; -import com.bakdata.conquery.sql.execution.PgSqlCDateSetParser; -import com.bakdata.conquery.sql.execution.SqlCDateSetParser; -import com.bakdata.conquery.util.DateReader; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -class DefaultSqlCDateSetParserTest { - - private static final SqlCDateSetParser DATE_SET_PARSER = new PgSqlCDateSetParser(); - - private static final DateReader DATE_READER = new LocaleConfig().getDateReader(); - - - public static Stream testToEpochDayRangeListProvider() { - return Stream.of( - Arguments.of("empty", "{}", "Empty datemultirange"), - Arguments.of("{[-infinity,infinity]}", "{/}", "Infinity datemultirange"), - Arguments.of("{[2012-01-01,2013-01-01)}", "{2012-01-01/2012-12-31}", "datemultirange with 1 daterange"), - Arguments.of("{[-infinity,2013-01-01),[2015-01-01,infinity]}", "{/2012-12-31,2015-01-01/}", "datemultirange with multiple ranges and infinity start and end value"), - Arguments.of("{[2014-01-01,2015-01-01),[2015-06-01,2016-01-01),[2017-01-01,2018-01-01)}", - "{2014-01-01/2014-12-31,2015-06-01/2015-12-31,2017-01-01/2017-12-31}", - "datemultirange with multiple ranges" - ) - ); - } - - @ParameterizedTest - @MethodSource("testToEpochDayRangeListProvider") - public void testToEpochDayRangeList(String input, String expectedRaw, String message) { - CDateSet actual = CDateSet.create(DATE_SET_PARSER.toEpochDayRangeList(input).stream() - .map(CDateRange::fromList) - .toList()); - - CDateSet expected = DATE_READER.parseToCDateSet(expectedRaw); - - Assertions.assertEquals(expected, actual, message); - } - -} diff --git a/backend/src/test/java/com/bakdata/conquery/integration/sql/dialect/PostgreSqlIntegrationTests.java b/backend/src/test/java/com/bakdata/conquery/integration/sql/dialect/PostgreSqlIntegrationTests.java deleted file mode 100644 index 537a00c3e9..0000000000 --- a/backend/src/test/java/com/bakdata/conquery/integration/sql/dialect/PostgreSqlIntegrationTests.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.bakdata.conquery.integration.sql.dialect; - -import java.util.Objects; -import java.util.stream.Stream; - -import com.bakdata.conquery.TestTags; -import com.bakdata.conquery.integration.ConqueryIntegrationTests; -import com.bakdata.conquery.integration.IntegrationTests; -import com.bakdata.conquery.integration.json.SqlTestDataImporter; -import com.bakdata.conquery.integration.sql.CsvTableImporter; -import com.bakdata.conquery.mode.local.ManagedConnection; -import com.bakdata.conquery.models.config.DatabaseConnectionConfig; -import com.bakdata.conquery.models.config.Dialect; -import com.bakdata.conquery.models.error.ConqueryError; -import com.bakdata.conquery.models.i18n.I18n; -import com.bakdata.conquery.sql.conversion.dialect.pg.PostgreDialectBundle; -import com.bakdata.conquery.sql.conversion.model.SqlQuery; -import com.bakdata.conquery.sql.execution.ResultSetProcessor; -import com.bakdata.conquery.sql.execution.SqlExecutionService; -import com.google.common.base.Strings; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import org.assertj.core.api.Assertions; -import org.jooq.DSLContext; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DynamicNode; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestFactory; -import org.testcontainers.containers.PostgreSQLContainer; -import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; -import org.testcontainers.utility.DockerImageName; - -@Testcontainers -@Slf4j -public class PostgreSqlIntegrationTests extends IntegrationTests { - - private static final DockerImageName postgreSqlImageName = DockerImageName.parse("postgres:alpine3.17"); - private static final String DATABASE_NAME = "test"; - private static final String USERNAME = "user"; - private static final String PASSWORD = "pass"; - - private static DSLContext dslContext; - private static DatabaseConnectionConfig databaseConfig; - private static TestSqlConnectorConfig sqlConfig; - private static TestDialectBundle testSqlDialect; - private static SqlTestDataImporter testDataImporter; - private static boolean useLocalPostgresDb = true; - private static ManagedConnection managedConnection; - - static { - final String USE_LOCAL_POSTGRES_DB = System.getenv("USE_LOCAL_POSTGRES_DB"); - if (!Strings.isNullOrEmpty(USE_LOCAL_POSTGRES_DB)) { - useLocalPostgresDb = Boolean.parseBoolean(USE_LOCAL_POSTGRES_DB); - } - } - - public PostgreSqlIntegrationTests() { - super(ConqueryIntegrationTests.DEFAULT_SQL_TEST_ROOT, "com.bakdata.conquery.integration"); - } - - - @BeforeAll - static void before() throws Exception{ - TestContextProvider provider = useLocalPostgresDb - ? new PortgresTestcontainerContextProvider() - : new RemotePostgresContextProvider(); - - databaseConfig = provider.getDatabaseConfig(); - sqlConfig = provider.getSqlConnectorConfig(); - - managedConnection = new ManagedConnection("test", sqlConfig, databaseConfig, null); - managedConnection.start(); - - dslContext = managedConnection.connect(); - - testSqlDialect = new TestPostgreDialectBundle(); - testDataImporter = new SqlTestDataImporter(new CsvTableImporter(dslContext, testSqlDialect, databaseConfig)); - } - - @AfterAll - static void after() throws Exception { - managedConnection.stop(); - } - - @Test - @Tag(TestTags.INTEGRATION_SQL_BACKEND) - @Order(0) - public void shouldThrowException() { - // This can be removed as soon as we switch to a full integration test including the REST API - I18n.init(); - ResultSetProcessor resultSetProcessor = testSqlDialect.getResultSetProcessor(config); - SqlExecutionService executionService = new SqlExecutionService(dslContext, resultSetProcessor); - SqlQuery validQuery = new TestSqlQuery(Dialect.POSTGRESQL.getDialectBundle().getConnectionTestString()); - Assertions.assertThatNoException().isThrownBy(() -> executionService.execute(validQuery)); - - // executing an empty query should throw an SQL error - SqlQuery emptyQuery = new TestSqlQuery(""); - Assertions.assertThatThrownBy(() -> executionService.execute(emptyQuery)) - .isInstanceOf(ConqueryError.SqlError.class) - .hasMessageContaining("$org.postgresql.util.PSQLException"); - } - - @TestFactory - @Tag(TestTags.INTEGRATION_SQL_BACKEND) - @Order(1) - public Stream sqlBackendTests() { - return Stream.concat( - super.sqlProgrammaticTests(databaseConfig, sqlConfig, testDataImporter), - super.sqlQueryTests(databaseConfig, sqlConfig, testDataImporter).stream() - ); - } - - public static class TestPostgreDialectBundle extends PostgreDialectBundle implements TestDialectBundle { - - public TestFunctionProvider getTestFunctionProvider() { - return new PostgreSqlTestFunctionProvider(); - } - } - - private static class PostgreSqlTestFunctionProvider implements TestFunctionProvider { - - } - - @Getter - private static class TestSqlQuery extends SqlQuery { - protected TestSqlQuery(String sql) { - super(sql); - } - } - - @Getter - private static class PortgresTestcontainerContextProvider implements TestContextProvider { - - private final DatabaseConnectionConfig databaseConfig; - private final TestSqlConnectorConfig sqlConnectorConfig; - - @Container - private final PostgreSQLContainer postgreSQLContainer; - - public PortgresTestcontainerContextProvider() { - this.postgreSQLContainer = new PostgreSQLContainer<>(postgreSqlImageName) - .withDatabaseName(DATABASE_NAME) - .withUsername(USERNAME) - .withPassword(PASSWORD); - this.postgreSQLContainer.start(); - this.databaseConfig = DatabaseConnectionConfig.builder() - .dialect(Dialect.POSTGRESQL) - .jdbcConnectionUrl(postgreSQLContainer.getJdbcUrl()) - .databaseUsername(USERNAME) - .databasePassword(PASSWORD) - .build(); - - this.sqlConnectorConfig = new TestSqlConnectorConfig(databaseConfig); - } - - } - - - @Getter - private static class RemotePostgresContextProvider implements TestContextProvider { - - private final static String PORT = Objects.requireNonNullElse(System.getenv("CONQUERY_SQL_PORT"), "5432"); - private final static String HOST = Objects.requireNonNullElse(System.getenv("CONQUERY_SQL_HOST"), "localhost"); - private final static String DATABASE = Objects.requireNonNullElse(System.getenv("CONQUERY_SQL_DATABASE"), DATABASE_NAME); - private final static String CONNECTION_URL = "jdbc:postgresql://%s:%s/%s".formatted(HOST, PORT, DATABASE); - private final static String USERNAME = Objects.requireNonNullElse(System.getenv("CONQUERY_SQL_USER"), PostgreSqlIntegrationTests.USERNAME); - private final static String PASSWORD = Objects.requireNonNullElse(System.getenv("CONQUERY_SQL_PASSWORD"), PostgreSqlIntegrationTests.PASSWORD); - private final DatabaseConnectionConfig databaseConfig; - private final TestSqlConnectorConfig sqlConnectorConfig; - - public RemotePostgresContextProvider() { - this.databaseConfig = DatabaseConnectionConfig.builder() - .dialect(Dialect.POSTGRESQL) - .jdbcConnectionUrl(CONNECTION_URL) - .databaseUsername(USERNAME) - .databasePassword(PASSWORD) - .build(); - - this.sqlConnectorConfig = new TestSqlConnectorConfig(databaseConfig); - } - - } -} diff --git a/backend/src/test/resources/tests/aggregator/COUNT_QUARTERS_RANGE/SIMPLE_VIRTUAL_CONCEPT_Query.test.json b/backend/src/test/resources/tests/aggregator/COUNT_QUARTERS_RANGE/SIMPLE_VIRTUAL_CONCEPT_Query.test.json deleted file mode 100644 index 71537a98ee..0000000000 --- a/backend/src/test/resources/tests/aggregator/COUNT_QUARTERS_RANGE/SIMPLE_VIRTUAL_CONCEPT_Query.test.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "type": "QUERY_TEST", - "label": "COUNT_QUARTERS_AGGREGATOR Test", - "sqlSpec": { - "isEnabled": true, - "comment": "Special case for PG only.", - "supportedDialects": [ - "POSTGRESQL" - ] - }, - "expectedCsv": "tests/aggregator/COUNT_QUARTERS_RANGE/expected.csv", - "query": { - "type": "CONCEPT_QUERY", - "root": { - "ids": [ - "concept" - ], - "type": "CONCEPT", - "tables": [ - { - "id": "concept.connector", - "selects": [ - "concept.connector.select" - ] - } - ] - } - }, - "concepts": [ - { - "name": "concept", - "type": "TREE", - "connectors": [ - { - "label": "connector", - "table": "table", - "validityDates": { - "label": "datum", - "column": "table.datum" - }, - "selects": { - "name": "select", - "type": "COUNT_QUARTERS", - "column": "table.behandlungsdatum" - } - } - ] - } - ], - "content": { - "tables": [ - { - "csv": "tests/aggregator/COUNT_QUARTERS_RANGE/content.csv", - "name": "table", - "primaryColumn": { - "name": "pid", - "type": "STRING" - }, - "columns": [ - { - "name": "behandlungsdatum", - "type": "DATE" - }, - { - "name": "datum", - "type": "DATE_RANGE" - } - ] - } - ] - } -} diff --git a/backend/src/test/resources/tests/filter/COUNT_QUARTERS_RANGE/COUNT_QUARTERS.test.json b/backend/src/test/resources/tests/filter/COUNT_QUARTERS_RANGE/COUNT_QUARTERS.test.json deleted file mode 100644 index 28975b1c4f..0000000000 --- a/backend/src/test/resources/tests/filter/COUNT_QUARTERS_RANGE/COUNT_QUARTERS.test.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "type": "FILTER_TEST", - "label": "COUNT_QUARTERS Test", - "sqlSpec": { - "isEnabled": true, - "comment": "Special test case for dateRanges / PG", - "supportedDialects": [ - "POSTGRESQL" - ] - }, - "expectedCsv": "tests/filter/COUNT_QUARTERS_RANGE/expected.csv", - "content": { - "tables": { - "csv": "tests/filter/COUNT_QUARTERS_RANGE/content.csv", - "primaryColumn": { - "name": "pid", - "type": "STRING" - }, - "columns": [ - { - "name": "behandlungsdatum", - "type": "DATE_RANGE" - }, - { - "name": "datum", - "type": "DATE" - } - ] - } - }, - "connector": { - "validityDates": { - "label": "Datum", - "column": "table.datum" - }, - "filters": { - "column": "table.behandlungsdatum", - "type": "COUNT_QUARTERS" - } - }, - "filterValue": { - "type": "INTEGER_RANGE", - "value": { - "min": 2, - "max": 3 - } - } -} diff --git a/backend/src/test/resources/tests/filter/DURATION_SUM_DISTINCT_FILTER/DURATION_SUM.test.json b/backend/src/test/resources/tests/filter/DURATION_SUM_DISTINCT_FILTER/DURATION_SUM.test.json deleted file mode 100644 index 9565688a53..0000000000 --- a/backend/src/test/resources/tests/filter/DURATION_SUM_DISTINCT_FILTER/DURATION_SUM.test.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "type": "QUERY_TEST", - "label": "DURATION_SUM_AGGREGATOR Test", - "sqlSpec": { - "isEnabled": false, - "comment": "Distinct not yet implemented.", - "supportedDialects": [ - "POSTGRESQL" - ] - }, - "expectedCsv": "tests/filter/DURATION_SUM_DISTINCT_FILTER/expected.csv", - "query": { - "type": "CONCEPT_QUERY", - "root": { - "ids": [ - "concept" - ], - "type": "CONCEPT", - "tables": [ - { - "id": "concept.connector", - "filters": [ - { - "type": "INTEGER_RANGE", - "filter": "concept.connector.filter", - "value": { - "min": 1, - "max": 1 - } - } - ] - } - ] - } - }, - "concepts": [ - { - "name": "concept", - "type": "TREE", - "connectors": [ - { - "name": "connector", - "table": "table", - "validityDates": { - "label": "datum", - "column": "table.datum" - }, - "filters": { - "type": "DURATION_SUM", - "name": "filter", - "column": "table.datum", - "distinctBy": [ - "table.val" - ] - } - } - ] - } - ], - "content": { - "tables": [ - { - "csv": "tests/filter/DURATION_SUM_DISTINCT_FILTER/content.csv", - "name": "table", - "primaryColumn": { - "name": "pid", - "type": "STRING" - }, - "columns": [ - { - "name": "datum", - "type": "DATE_RANGE" - }, - { - "name": "val", - "type": "STRING" - } - ] - } - ] - } -} diff --git a/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SECONDARY_ID/ABS_EXPORT_FORM_SECONDARY_ID.test.json b/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SECONDARY_ID/ABS_EXPORT_FORM_SECONDARY_ID.test.json index 0fb26bfce0..475eacbb8c 100644 --- a/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SECONDARY_ID/ABS_EXPORT_FORM_SECONDARY_ID.test.json +++ b/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SECONDARY_ID/ABS_EXPORT_FORM_SECONDARY_ID.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": true, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": { diff --git a/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE/ABS_EXPORT_FORM.test.json b/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE/ABS_EXPORT_FORM.test.json index d477afdd76..e31e708cca 100644 --- a/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE/ABS_EXPORT_FORM.test.json +++ b/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE/ABS_EXPORT_FORM.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": true, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": { diff --git a/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE/ABS_EXPORT_FORM_WITH_SELECT.test.json b/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE/ABS_EXPORT_FORM_WITH_SELECT.test.json index 1738d42582..ae77d2de61 100644 --- a/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE/ABS_EXPORT_FORM_WITH_SELECT.test.json +++ b/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE/ABS_EXPORT_FORM_WITH_SELECT.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": true, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": { diff --git a/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE_DATE_RESTRICTION/AND_DR.test.json b/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE_DATE_RESTRICTION/AND_DR.test.json index 8879a8be0e..cf3ab51687 100644 --- a/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE_DATE_RESTRICTION/AND_DR.test.json +++ b/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE_DATE_RESTRICTION/AND_DR.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": true, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": { diff --git a/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE_DATE_RESTRICTION/DR_AND.test.json b/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE_DATE_RESTRICTION/DR_AND.test.json index 1806575137..15f37b404c 100644 --- a/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE_DATE_RESTRICTION/DR_AND.test.json +++ b/backend/src/test/resources/tests/form/EXPORT_FORM/ABSOLUT/SIMPLE_DATE_RESTRICTION/DR_AND.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": true, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": { diff --git a/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/LOGICAL/ABS_EXPORT_FORM.test.json b/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/LOGICAL/ABS_EXPORT_FORM.test.json index d9b331b11b..99518f3849 100644 --- a/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/LOGICAL/ABS_EXPORT_FORM.test.json +++ b/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/LOGICAL/ABS_EXPORT_FORM.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": true, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": { diff --git a/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/LOGICAL_WITH_EXCLUDE/ABS_EXPORT_FORM.test.json b/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/LOGICAL_WITH_EXCLUDE/ABS_EXPORT_FORM.test.json index 854203318a..7a9e931bef 100644 --- a/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/LOGICAL_WITH_EXCLUDE/ABS_EXPORT_FORM.test.json +++ b/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/LOGICAL_WITH_EXCLUDE/ABS_EXPORT_FORM.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": true, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": { diff --git a/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/SECONDARY_ID/SECONDARY_ID.test.json b/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/SECONDARY_ID/SECONDARY_ID.test.json index e86078a7c3..a46fb4137d 100644 --- a/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/SECONDARY_ID/SECONDARY_ID.test.json +++ b/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/SECONDARY_ID/SECONDARY_ID.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": true, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": { diff --git a/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/SIMPLE/ABS_EXPORT_FORM.test.json b/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/SIMPLE/ABS_EXPORT_FORM.test.json index db147087c0..ae1a315959 100644 --- a/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/SIMPLE/ABS_EXPORT_FORM.test.json +++ b/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/SIMPLE/ABS_EXPORT_FORM.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": true, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": { diff --git a/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/SIMPLE/ABS_EXPORT_FORM_WITH_SELECT.test.json b/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/SIMPLE/ABS_EXPORT_FORM_WITH_SELECT.test.json index 5c397a71e3..238e5f938b 100644 --- a/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/SIMPLE/ABS_EXPORT_FORM_WITH_SELECT.test.json +++ b/backend/src/test/resources/tests/form/EXPORT_FORM/ENTITY_DATE/SIMPLE/ABS_EXPORT_FORM_WITH_SELECT.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": true, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": { diff --git a/backend/src/test/resources/tests/form/EXPORT_FORM/RELATIVE/SECONDARY_ID/SECONDARY_ID.test.json b/backend/src/test/resources/tests/form/EXPORT_FORM/RELATIVE/SECONDARY_ID/SECONDARY_ID.test.json index 686a84976b..10aaeef8db 100644 --- a/backend/src/test/resources/tests/form/EXPORT_FORM/RELATIVE/SECONDARY_ID/SECONDARY_ID.test.json +++ b/backend/src/test/resources/tests/form/EXPORT_FORM/RELATIVE/SECONDARY_ID/SECONDARY_ID.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": true, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": { diff --git a/backend/src/test/resources/tests/form/EXPORT_FORM/RELATIVE/SIMPLE/REL_EXPORT_FORM.test.json b/backend/src/test/resources/tests/form/EXPORT_FORM/RELATIVE/SIMPLE/REL_EXPORT_FORM.test.json index 3f5232e157..ffe6e0e3be 100644 --- a/backend/src/test/resources/tests/form/EXPORT_FORM/RELATIVE/SIMPLE/REL_EXPORT_FORM.test.json +++ b/backend/src/test/resources/tests/form/EXPORT_FORM/RELATIVE/SIMPLE/REL_EXPORT_FORM.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": true, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": { diff --git a/backend/src/test/resources/tests/form/FULL_EXPORT_FORM/FULL_EXPORT_FORM_SECONDARY_ID.test.json b/backend/src/test/resources/tests/form/FULL_EXPORT_FORM/FULL_EXPORT_FORM_SECONDARY_ID.test.json index bc4dbdb6a9..c7092576f6 100644 --- a/backend/src/test/resources/tests/form/FULL_EXPORT_FORM/FULL_EXPORT_FORM_SECONDARY_ID.test.json +++ b/backend/src/test/resources/tests/form/FULL_EXPORT_FORM/FULL_EXPORT_FORM_SECONDARY_ID.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": true, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": { diff --git a/backend/src/test/resources/tests/query/ABS_EXPORT/ABS_EXPORT_Query.test.json b/backend/src/test/resources/tests/query/ABS_EXPORT/ABS_EXPORT_Query.test.json index 6370900b27..d4274ea715 100644 --- a/backend/src/test/resources/tests/query/ABS_EXPORT/ABS_EXPORT_Query.test.json +++ b/backend/src/test/resources/tests/query/ABS_EXPORT/ABS_EXPORT_Query.test.json @@ -6,7 +6,7 @@ "isEnabled": true, "comment": "Clickhouse does not have Lateral joins at the moment. But fix is hopefully coming.", "supportedDialects": [ - "POSTGRESQL", + "HANA" ] }, diff --git a/backend/src/test/resources/tests/query/DATE_DISTANCE/DATE_DISTANCE.test.json b/backend/src/test/resources/tests/query/DATE_DISTANCE/DATE_DISTANCE.test.json deleted file mode 100644 index 1260800b0b..0000000000 --- a/backend/src/test/resources/tests/query/DATE_DISTANCE/DATE_DISTANCE.test.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "type": "QUERY_TEST", - "label": "DATE_DISTANCE_VERSICHERTENZEIT Test", - "sqlSpec": { - "isEnabled": true, - "supportedDialects": [ - "POSTGRESQL" - ] - }, - "expectedCsv": "tests/query/DATE_DISTANCE/expected-versichertenzeit.csv", - "query": { - "type": "CONCEPT_QUERY", - "root": { - "type": "DATE_RESTRICTION", - "dateRange": { - "min": "2011-01-01", - "max": "2011-01-01" - }, - "child": { - "type": "CONCEPT", - "ids": [ - "alter" - ], - "label": "Alter", - "excludeFromTimeAggregation": false, - "tables": [ - { - "id": "alter.alterxy", - "selects": [ - ], - "filters": [ - { - "filter": "alter.alterxy.alterseinschrankung", - "type": "INTEGER_RANGE", - "value": { - "min": "11", - "max": "11" - } - } - ] - } - ], - "selects": [ - ] - } - } - }, - "concepts": [ - { - "label": "alter", - "type": "TREE", - "connectors": [ - { - "label": "alterxy", - "table": "table1", - "validityDates": { - "label": "versichertenzeit", - "startColumn": "table1.erster", - "endColumn": "table1.letzter" - }, - "filters": { - "label": "alterseinschrankung", - "column": "table1.geburtsdatum", - "type": "DATE_DISTANCE" - } - } - ] - } - ], - "content": { - "tables": [ - { - "csv": "tests/query/DATE_DISTANCE/content.csv", - "name": "table1", - "primaryColumn": { - "name": "pid", - "type": "STRING" - }, - "columns": [ - { - "name": "geburtsdatum", - "type": "DATE" - }, - { - "name": "erster", - "type": "DATE" - }, - { - "name": "letzter", - "type": "DATE" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/backend/src/test/resources/tests/query/LOGICAL/AND_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json b/backend/src/test/resources/tests/query/LOGICAL/AND_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json index 987905abfc..e39ed0bfea 100644 --- a/backend/src/test/resources/tests/query/LOGICAL/AND_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json +++ b/backend/src/test/resources/tests/query/LOGICAL/AND_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json @@ -5,7 +5,7 @@ "comment" : "Logical will hopefully removed", "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/LOGICAL/AND_DATE_LOGICAL/expected.csv", diff --git a/backend/src/test/resources/tests/query/LOGICAL/AND_DURATION_SUM/SIMPLE_TREECONCEPT_Query.test.json b/backend/src/test/resources/tests/query/LOGICAL/AND_DURATION_SUM/SIMPLE_TREECONCEPT_Query.test.json index b7114adddf..c9dd6e2e6d 100644 --- a/backend/src/test/resources/tests/query/LOGICAL/AND_DURATION_SUM/SIMPLE_TREECONCEPT_Query.test.json +++ b/backend/src/test/resources/tests/query/LOGICAL/AND_DURATION_SUM/SIMPLE_TREECONCEPT_Query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/LOGICAL/AND_DURATION_SUM/expected.csv", diff --git a/backend/src/test/resources/tests/query/LOGICAL/AND_DURATION_SUM_MULTI_CONCEPT/SIMPLE_TREECONCEPT_Query.test.json b/backend/src/test/resources/tests/query/LOGICAL/AND_DURATION_SUM_MULTI_CONCEPT/SIMPLE_TREECONCEPT_Query.test.json index 8da38c9046..22dafc4b34 100644 --- a/backend/src/test/resources/tests/query/LOGICAL/AND_DURATION_SUM_MULTI_CONCEPT/SIMPLE_TREECONCEPT_Query.test.json +++ b/backend/src/test/resources/tests/query/LOGICAL/AND_DURATION_SUM_MULTI_CONCEPT/SIMPLE_TREECONCEPT_Query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/LOGICAL/AND_DURATION_SUM_MULTI_CONCEPT/expected.csv", diff --git a/backend/src/test/resources/tests/query/LOGICAL/AND_NEGATION_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json b/backend/src/test/resources/tests/query/LOGICAL/AND_NEGATION_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json index 32d27dee69..0ffc44e9b9 100644 --- a/backend/src/test/resources/tests/query/LOGICAL/AND_NEGATION_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json +++ b/backend/src/test/resources/tests/query/LOGICAL/AND_NEGATION_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/LOGICAL/AND_NEGATION_DATE_LOGICAL/expected.csv", diff --git a/backend/src/test/resources/tests/query/LOGICAL/AND_NEGATION_RESTRICTION_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json b/backend/src/test/resources/tests/query/LOGICAL/AND_NEGATION_RESTRICTION_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json index 73ed29e6fd..ff20e74bca 100644 --- a/backend/src/test/resources/tests/query/LOGICAL/AND_NEGATION_RESTRICTION_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json +++ b/backend/src/test/resources/tests/query/LOGICAL/AND_NEGATION_RESTRICTION_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/LOGICAL/AND_NEGATION_RESTRICTION_DATE_LOGICAL/expected.csv", diff --git a/backend/src/test/resources/tests/query/LOGICAL/NEGATION_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json b/backend/src/test/resources/tests/query/LOGICAL/NEGATION_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json index 687ec4efd9..2cf85c99cb 100644 --- a/backend/src/test/resources/tests/query/LOGICAL/NEGATION_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json +++ b/backend/src/test/resources/tests/query/LOGICAL/NEGATION_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json @@ -6,7 +6,7 @@ "isEnabled": true, "comment": "Logical will hopefully be kicked.", "supportedDialects": [ - "POSTGRESQL", + "HANA" ] }, diff --git a/backend/src/test/resources/tests/query/LOGICAL/OR/SIMPLE_TREECONCEPT_Query.test.json b/backend/src/test/resources/tests/query/LOGICAL/OR/SIMPLE_TREECONCEPT_Query.test.json index 7182348e4b..3596435489 100644 --- a/backend/src/test/resources/tests/query/LOGICAL/OR/SIMPLE_TREECONCEPT_Query.test.json +++ b/backend/src/test/resources/tests/query/LOGICAL/OR/SIMPLE_TREECONCEPT_Query.test.json @@ -6,7 +6,7 @@ "isEnabled": true, "comment": "Logical will hopefully be kicked.", "supportedDialects": [ - "POSTGRESQL", + "HANA" ] }, diff --git a/backend/src/test/resources/tests/query/LOGICAL/OR_AND/SIMPLE_TREECONCEPT_Query.test.json b/backend/src/test/resources/tests/query/LOGICAL/OR_AND/SIMPLE_TREECONCEPT_Query.test.json index 432d322545..c7eeab2394 100644 --- a/backend/src/test/resources/tests/query/LOGICAL/OR_AND/SIMPLE_TREECONCEPT_Query.test.json +++ b/backend/src/test/resources/tests/query/LOGICAL/OR_AND/SIMPLE_TREECONCEPT_Query.test.json @@ -6,7 +6,7 @@ "isEnabled": true, "comment": "Logical will hopefully be kicked.", "supportedDialects": [ - "POSTGRESQL", + "HANA" ] }, diff --git a/backend/src/test/resources/tests/query/LOGICAL/OR_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json b/backend/src/test/resources/tests/query/LOGICAL/OR_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json index de618aaec0..3963b88ce4 100644 --- a/backend/src/test/resources/tests/query/LOGICAL/OR_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json +++ b/backend/src/test/resources/tests/query/LOGICAL/OR_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json @@ -6,7 +6,7 @@ "isEnabled": true, "comment": "Logical will hopefully be kicked.", "supportedDialects": [ - "POSTGRESQL", + "HANA" ] }, diff --git a/backend/src/test/resources/tests/query/LOGICAL/OR_NEGATION_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json b/backend/src/test/resources/tests/query/LOGICAL/OR_NEGATION_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json index 3ffc528120..a41502ed2c 100644 --- a/backend/src/test/resources/tests/query/LOGICAL/OR_NEGATION_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json +++ b/backend/src/test/resources/tests/query/LOGICAL/OR_NEGATION_DATE_LOGICAL/SIMPLE_TREECONCEPT_Query.test.json @@ -6,7 +6,7 @@ "comment" : "Logical will hopefully be removed", "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "query": { diff --git a/backend/src/test/resources/tests/query/REL_EXPORT/PREREQUISITE_WITH_DATES/REL_EXPORT_Query.test.json b/backend/src/test/resources/tests/query/REL_EXPORT/PREREQUISITE_WITH_DATES/REL_EXPORT_Query.test.json index 227423a9f3..ad0df11e05 100644 --- a/backend/src/test/resources/tests/query/REL_EXPORT/PREREQUISITE_WITH_DATES/REL_EXPORT_Query.test.json +++ b/backend/src/test/resources/tests/query/REL_EXPORT/PREREQUISITE_WITH_DATES/REL_EXPORT_Query.test.json @@ -5,7 +5,7 @@ "isEnabled": true, "comment": "Lateral JOINS are not possible with Clickhouse yet.", "supportedDialects": [ - "POSTGRESQL", + "HANA" ] }, diff --git a/backend/src/test/resources/tests/query/SUM_EMPTY_DATE_CONCEPT_QUERY/SUM_EMPTY_DATE_CONCEPT_QUERY.test.json b/backend/src/test/resources/tests/query/SUM_EMPTY_DATE_CONCEPT_QUERY/SUM_EMPTY_DATE_CONCEPT_QUERY.test.json index 1bfc433444..12f25f92a3 100644 --- a/backend/src/test/resources/tests/query/SUM_EMPTY_DATE_CONCEPT_QUERY/SUM_EMPTY_DATE_CONCEPT_QUERY.test.json +++ b/backend/src/test/resources/tests/query/SUM_EMPTY_DATE_CONCEPT_QUERY/SUM_EMPTY_DATE_CONCEPT_QUERY.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": true, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/SUM_EMPTY_DATE_CONCEPT_QUERY/expected.csv", diff --git a/backend/src/test/resources/tests/query/TABLE_EXPORT/RAW_TABLE_EXPORT.test.json b/backend/src/test/resources/tests/query/TABLE_EXPORT/RAW_TABLE_EXPORT.test.json index d9c4710bdb..e148b77e75 100644 --- a/backend/src/test/resources/tests/query/TABLE_EXPORT/RAW_TABLE_EXPORT.test.json +++ b/backend/src/test/resources/tests/query/TABLE_EXPORT/RAW_TABLE_EXPORT.test.json @@ -5,7 +5,7 @@ "isEnabled": true, "comment": "Bug in Clickhouse converter", "supportedDialects": [ - "POSTGRESQL", + "HANA" ] }, diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ALL/ANY/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ALL/ANY/query.test.json index c4bae87495..7b7ddad1ac 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ALL/ANY/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ALL/ANY/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/ALL/ANY/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ALL/EARLIEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ALL/EARLIEST/query.test.json index 65395af76d..6dea35493a 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ALL/EARLIEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ALL/EARLIEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/ALL/EARLIEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ALL/LATEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ALL/LATEST/query.test.json index 4901e8a673..72b55679f1 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ALL/LATEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ALL/LATEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/ALL/LATEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/ALL/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/ALL/query.test.json index db282b5eab..f4cf0ebb5f 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/ALL/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/ALL/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/ANY/ALL/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/ANY/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/ANY/query.test.json index 37ae00d5f1..b9ec05252a 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/ANY/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/ANY/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/ANY/ANY/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/EARLIEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/EARLIEST/query.test.json index ef678d2db4..a34bd6c3e4 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/EARLIEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/EARLIEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/ANY/EARLIEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/LATEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/LATEST/query.test.json index 1c351ce764..d2677bd854 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/LATEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/ANY/LATEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/ANY/LATEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/ALL/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/ALL/query.test.json index ce3174cc80..e68c39486f 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/ALL/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/ALL/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/EARLIEST/ALL/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/ANY/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/ANY/query.test.json index 931711ba5c..dbc98eea2d 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/ANY/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/ANY/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/EARLIEST/ANY/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/EARLIEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/EARLIEST/query.test.json index 76330be12e..dfc8989648 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/EARLIEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/EARLIEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/EARLIEST/EARLIEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/LATEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/LATEST/query.test.json index 082989fb30..30793cfbed 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/LATEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/EARLIEST/LATEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/EARLIEST/LATEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/ALL/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/ALL/query.test.json index a1e43174c6..463d152703 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/ALL/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/ALL/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/LATEST/ALL/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/ANY/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/ANY/query.test.json index 2f11dfbdb2..56725159b8 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/ANY/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/ANY/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/LATEST/ANY/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/EARLIEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/EARLIEST/query.test.json index 07efef74fc..a1cf66149f 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/EARLIEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/EARLIEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/LATEST/EARLIEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/LATEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/LATEST/query.test.json index fd57bdd513..faf84b8264 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/LATEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AFTER/LATEST/LATEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AFTER/LATEST/LATEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/AGGREGATION/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/AGGREGATION/query.test.json index ee36a552fb..91e2e17e28 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/AGGREGATION/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/AGGREGATION/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/AGGREGATION/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/ALL/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/ALL/query.test.json index d28ab67598..40be025fcf 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/ALL/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/ALL/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/ALL/ALL/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/ANY/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/ANY/query.test.json index 3bcd5df907..74b401037c 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/ANY/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/ANY/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/ALL/ANY/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/EARLIEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/EARLIEST/query.test.json index 27b42c3ab4..9647674512 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/EARLIEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/EARLIEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/ALL/EARLIEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/LATEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/LATEST/query.test.json index d4ad78395c..5179b8563a 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/LATEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ALL/LATEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/ALL/LATEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/ALL/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/ALL/query.test.json index effd0fe4eb..9b9d37046e 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/ALL/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/ALL/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/ANY/ALL/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/ANY/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/ANY/query.test.json index 5e0728c05a..f59f28c854 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/ANY/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/ANY/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/ANY/ANY/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/EARLIEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/EARLIEST/query.test.json index fa79996000..22468b606c 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/EARLIEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/EARLIEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/ANY/EARLIEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/LATEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/LATEST/query.test.json index e596d71a25..594cf7a291 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/LATEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/ANY/LATEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/ANY/LATEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/ALL/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/ALL/query.test.json index 7393e820be..419abd9626 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/ALL/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/ALL/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/EARLIEST/ALL/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/ANY/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/ANY/query.test.json index 6132182d3a..08f53072ac 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/ANY/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/ANY/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/EARLIEST/ANY/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/EARLIEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/EARLIEST/query.test.json index 20e7edd02a..5019f5c184 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/EARLIEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/EARLIEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/EARLIEST/EARLIEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/LATEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/LATEST/query.test.json index c80b7b2456..23af23703b 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/LATEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/EARLIEST/LATEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/EARLIEST/LATEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/ALL/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/ALL/query.test.json index 87b7fdd943..a35a177494 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/ALL/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/ALL/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/LATEST/ALL/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/ANY/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/ANY/query.test.json index ef56f61944..26909ddc48 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/ANY/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/ANY/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/LATEST/ANY/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/EARLIEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/EARLIEST/query.test.json index b1f678ecd4..2558f3cb6f 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/EARLIEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/EARLIEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/LATEST/EARLIEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/LATEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/LATEST/query.test.json index 0142abdfff..bb26325f54 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/LATEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/BEFORE/LATEST/LATEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/BEFORE/LATEST/LATEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/ALL/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/ALL/query.test.json index 8ffd6265bb..88c2d289fa 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/ALL/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/ALL/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/ALL/ALL/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/ANY/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/ANY/query.test.json index e593d88611..88c9d0cdc4 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/ANY/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/ANY/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/ALL/ANY/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/EARLIEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/EARLIEST/query.test.json index 688552ae9a..b24af4a023 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/EARLIEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/EARLIEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/ALL/EARLIEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/LATEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/LATEST/query.test.json index 491b4e4732..2fe34be809 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/LATEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ALL/LATEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/ALL/LATEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/ALL/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/ALL/query.test.json index 34aa260150..15aab206b5 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/ALL/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/ALL/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/ANY/ALL/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/ANY/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/ANY/query.test.json index edc944a437..e4d1e70a92 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/ANY/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/ANY/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/ANY/ANY/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/EARLIEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/EARLIEST/query.test.json index fce2e634c3..958c63e137 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/EARLIEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/EARLIEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/ANY/EARLIEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/LATEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/LATEST/query.test.json index c6dc24ec4f..a2ae2a814b 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/LATEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/ANY/LATEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/ANY/LATEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/ALL/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/ALL/query.test.json index b5faa7763e..7051e1f3fa 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/ALL/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/ALL/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/EARLIEST/ALL/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/ANY/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/ANY/query.test.json index 0cf40a68f5..5669784a56 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/ANY/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/ANY/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/EARLIEST/ANY/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/EARLIEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/EARLIEST/query.test.json index 1cf7f8f070..b1b781c995 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/EARLIEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/EARLIEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/EARLIEST/EARLIEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/LATEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/LATEST/query.test.json index 7966bed3c4..e36a7e9b85 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/LATEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/EARLIEST/LATEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/EARLIEST/LATEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/ALL/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/ALL/query.test.json index dcca29b5a7..6b296455c1 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/ALL/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/ALL/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/LATEST/ALL/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/ANY/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/ANY/query.test.json index 2b16fc5588..23166dae67 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/ANY/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/ANY/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/LATEST/ANY/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/EARLIEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/EARLIEST/query.test.json index 5da04a85f6..6e95db77d0 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/EARLIEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/EARLIEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/LATEST/EARLIEST/expected.csv", diff --git a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/LATEST/query.test.json b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/LATEST/query.test.json index d046ead524..561394828d 100644 --- a/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/LATEST/query.test.json +++ b/backend/src/test/resources/tests/query/TEMPORAL/WHILE/LATEST/LATEST/query.test.json @@ -4,7 +4,7 @@ "sqlSpec": { "isEnabled": false, "supportedDialects": [ - "POSTGRESQL", "HANA" + "HANA" ] }, "expectedCsv": "tests/query/TEMPORAL/WHILE/LATEST/LATEST/expected.csv",