Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
cf4f21f
feat(sql): introduce resolved query model
thoniTUB Aug 26, 2026
2aad4d2
refactor(sql): decouple node conversion dispatch
thoniTUB Aug 26, 2026
a2eecb4
feat(sql): define validated resolved operations
thoniTUB Aug 28, 2026
9a4db7f
refactor(sql): separate model and validation packages
thoniTUB Aug 28, 2026
05f5488
refactor(sql): separate compiler runtime dependencies
thoniTUB Aug 28, 2026
16061d4
refactor(sql): decouple query steps from dialect
thoniTUB Aug 28, 2026
f50349c
refactor(sql): expose aggregation through compiler dialect
thoniTUB Aug 28, 2026
ab1b6e8
feat(sql): define compiled query output contract
thoniTUB Sep 1, 2026
dbffb7b
feat(sql): define compiler invocation boundary
thoniTUB Sep 1, 2026
2f0fba7
refactor(sql): move select IR contracts into connector
thoniTUB Sep 1, 2026
3bd0bad
refactor(sql): move select IR implementations into connector
thoniTUB Sep 1, 2026
2abae33
refactor(sql): move date range IR into connector
thoniTUB Sep 1, 2026
04aea92
refactor(sql): move ID column IR into connector
thoniTUB Sep 1, 2026
19bdd86
refactor(sql): move select projection IR into connector
thoniTUB Sep 1, 2026
c067cb1
refactor(sql): render select projections in connector
thoniTUB Sep 1, 2026
2b14316
refactor(sql): move query step IR into connector
thoniTUB Sep 2, 2026
f01c82d
refactor(sql): move query step rendering into connector
thoniTUB Sep 2, 2026
42c1d27
refactor(sql): move query step joins into connector
thoniTUB Sep 2, 2026
1fc63fe
refactor(sql): move date aggregation inputs into connector
thoniTUB Sep 3, 2026
cbed222
refactor(model): share date aggregation actions
thoniTUB Sep 3, 2026
6eb250c
refactor(sql): move CTE graph into connector
thoniTUB Sep 3, 2026
628136d
refactor(sql): move identifier generation into connector
thoniTUB Sep 7, 2026
5378dad
refactor(sql): move condition IR into connector
thoniTUB Sep 7, 2026
670544a
refactor(sql): move string value conditions into connector
thoniTUB Sep 8, 2026
132bd03
refactor(sql): move date restriction conditions into connector
thoniTUB Sep 8, 2026
ec1f4a2
refactor(sql): move inclusive range conditions into connector
thoniTUB Sep 8, 2026
e2d137c
refactor(sql): consolidate legacy range adapters
thoniTUB Sep 9, 2026
2541a50
refactor(sql): narrow date aggregation dependencies
thoniTUB Sep 9, 2026
4b0f0c6
refactor(sql): move interval packing into connector
thoniTUB Sep 9, 2026
22b78b5
refactor(sql): move date aggregation into connector
thoniTUB Sep 9, 2026
1866bc4
refactor(sql): remove legacy date aggregation adapter
thoniTUB Sep 10, 2026
6028df3
refactor(sql): move date range expressions into dialect
thoniTUB Sep 10, 2026
616de38
refactor(sql): move query step composition into connector
thoniTUB Sep 10, 2026
4dd07bc
refactor(sql): move final query composition into connector
thoniTUB Sep 11, 2026
ef98215
refactor(sql): move external node compilation into connector
thoniTUB Sep 11, 2026
72caab9
refactor(sql): move converter dispatch into connector
thoniTUB Sep 11, 2026
628f213
refactor(sql): move all-entities compilation into connector
thoniTUB Sep 14, 2026
6800893
refactor(sql): move logical node composition into connector
thoniTUB Sep 14, 2026
41285f5
refactor(sql): mark utility-only classes explicitly
thoniTUB Sep 14, 2026
03533b6
refactor(sql): move concept CTE steps into connector
thoniTUB Sep 14, 2026
9764393
refactor(sql): move concept compilation state into connector
thoniTUB Sep 14, 2026
8680840
refactor(sql): move aggregation select state into connector
thoniTUB Sep 14, 2026
77bf1da
refactor(sql): move interval vocabulary into connector
thoniTUB Sep 14, 2026
b8b912d
refactor(sql): move form compilation vocabulary into connector
thoniTUB Sep 14, 2026
2822ce1
refactor(sql): move connector aggregation CTE compilation
thoniTUB Sep 14, 2026
ec5a2ad
refactor(sql): move final concept CTE compilation
thoniTUB Sep 14, 2026
bca0541
refactor(sql): move connector preprocessing CTE compilation
thoniTUB Sep 15, 2026
9ff9818
refactor(sql): move interval select branch compilation
thoniTUB Sep 15, 2026
d35c892
refactor(sql): move connector branch composition
thoniTUB Sep 15, 2026
9c59b00
refactor(sql): move connector CTE orchestration
thoniTUB Sep 15, 2026
4b350ce
refactor(sql): move concept branch orchestration
thoniTUB Sep 15, 2026
3596f48
refactor(sql): move arbitrary interval select compilation
thoniTUB Sep 16, 2026
3435298
refactor(sql): move interval select preparation
thoniTUB Sep 16, 2026
84b1e79
refactor(sql): move concept CTE graph planning
thoniTUB Sep 16, 2026
d4a8461
refactor(sql): move connector pipeline assembly
thoniTUB Sep 16, 2026
fb16af6
refactor(sql): decouple filter table state
thoniTUB Sep 17, 2026
ae91f79
refactor(sql): retain resolved connector tables
thoniTUB Sep 17, 2026
b2d19cb
refactor(sql): keep query step builders internal
thoniTUB Sep 18, 2026
156d8a3
refactor(sql): convert resolved conditions in connector
thoniTUB Sep 18, 2026
6618931
refactor(sql): convert resolved column filters
thoniTUB Sep 18, 2026
fac8823
refactor(sql): convert remaining event filters
thoniTUB Sep 18, 2026
548a9ae
docs: define behavior-preserving SQL connector extraction
thoniTUB Sep 21, 2026
5d36a83
refactor: delegate SQL aggregations to the connector
thoniTUB Sep 21, 2026
ff05d9b
fix(sql): integrate concept mapping with extracted pipeline
thoniTUB Sep 23, 2026
aab5961
refactor(sql): delegate output selects to connector
thoniTUB Sep 23, 2026
810157e
refactor(sql): move dialect capabilities to connector
thoniTUB Sep 24, 2026
ac2df44
refactor(sql): add resolved query compiler
thoniTUB Sep 28, 2026
c6f17b5
refactor(sql): move concept mapping table lifecycle
thoniTUB Sep 28, 2026
aa2f94f
refactor(sql): resolve concept mapping rows in connector
thoniTUB Sep 28, 2026
13ef751
refactor(sql): route concept queries through shared compiler
thoniTUB Oct 1, 2026
4458691
refactor(sql): centralize resolved query adaptation
thoniTUB Oct 1, 2026
3158b3f
refactor(sql): extract table export compilation
thoniTUB Oct 2, 2026
d2c79c4
refactor(sql): extract form compilation
thoniTUB Oct 5, 2026
8a099ae
refactor(sql): remove legacy compiler path
thoniTUB Oct 6, 2026
2172d2b
refactor(sql): remove obsolete query wrapper APIs
thoniTUB Oct 6, 2026
596a032
Merge origin/develop into feat/sql-module
thoniTUB Oct 6, 2026
e83e5da
fix(sql): restore form stratification context
thoniTUB Oct 8, 2026
227358d
spotless apply
thoniTUB Oct 8, 2026
60233b2
fix rebuild dependent projects, so we don't fallback on cached version
thoniTUB Oct 8, 2026
89e8137
refactor(sql): reorganize compiler packages
thoniTUB Oct 13, 2026
f5ee6d0
use import instead of fqdn ref
thoniTUB Oct 13, 2026
5028db2
rename compile -> translate
thoniTUB Oct 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/workflows/test_backend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,4 @@ jobs:
java-version: '21'
overwrite-settings: false
- name: ${{ matrix.test-group.name }}
run: mvn test -T 1C -pl backend ${{ matrix.test-group.flags }}
run: mvn test -T 1C -pl backend -am ${{ matrix.test-group.flags }}
12 changes: 11 additions & 1 deletion backend/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,16 @@
</build>

<dependencies>
<dependency>
<groupId>com.bakdata.conquery</groupId>
<artifactId>dataset-model</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.bakdata.conquery</groupId>
<artifactId>sql-connector</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
Expand Down Expand Up @@ -346,7 +356,7 @@
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
<version>3.20.2</version>
<version>${jooq.version}</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@
import com.bakdata.conquery.models.identifiable.ids.specific.ManagedExecutionId;
import com.bakdata.conquery.models.identifiable.mapping.IdPrinter;
import com.bakdata.conquery.models.query.*;
import com.bakdata.conquery.models.query.DateAggregationAction;
import com.bakdata.conquery.models.query.preview.EntityPreviewExecution;
import com.bakdata.conquery.models.query.preview.EntityPreviewForm;
import com.bakdata.conquery.models.query.queryplan.DateAggregationAction;
import com.bakdata.conquery.models.query.resultinfo.ResultInfo;
import com.bakdata.conquery.models.query.resultinfo.UniqueNamer;
import com.bakdata.conquery.models.query.resultinfo.printers.JavaResultPrinters;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,20 @@
import com.bakdata.conquery.models.common.Range.LongRange;
import com.bakdata.conquery.models.common.Range.MoneyRange;
import com.bakdata.conquery.models.config.ConqueryConfig;
import com.bakdata.conquery.models.datasets.concepts.filters.Filter;
import com.bakdata.conquery.models.identifiable.ids.specific.FilterId;
import com.bakdata.conquery.models.query.QueryResolveContext;
import com.bakdata.conquery.sql.conversion.cqelement.ConversionContext;
import com.bakdata.conquery.sql.conversion.cqelement.concept.ConnectorSqlTables;
import com.bakdata.conquery.sql.conversion.cqelement.concept.FilterContext;
import com.bakdata.conquery.sql.conversion.model.SqlIdColumns;
import com.bakdata.conquery.sql.conversion.model.filter.SqlFilters;
import com.bakdata.conquery.util.validation.ResolvableId;
import com.fasterxml.jackson.annotation.*;
import lombok.*;
import com.fasterxml.jackson.annotation.JacksonInject;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.OptBoolean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Setter;
import lombok.ToString;
import org.jetbrains.annotations.TestOnly;
import org.jooq.Condition;

/**
* @implNote The {@link JsonCreator} annos are necessary. Otherwise, Jackson will deserilaize all values as generic objects.
Expand Down Expand Up @@ -52,19 +53,6 @@ public VALUE readValue() {
return ((VALUE) value);
}

public SqlFilters convertToSqlFilter(SqlIdColumns ids, ConversionContext context, ConnectorSqlTables tables) {
FilterContext<VALUE> filterContext = FilterContext.forConceptConversion(ids, readValue(), context, tables);
final Filter<VALUE> resolve = (Filter<VALUE>) filter.resolve();
SqlFilters sqlFilters = resolve.createConverter().convertToSqlFilter(resolve, filterContext);
return sqlFilters;
}

public Condition convertForTableExport(SqlIdColumns ids, ConversionContext context) {
FilterContext<VALUE> filterContext = FilterContext.forTableExport(ids, readValue(), context);
final Filter<VALUE> resolve = (Filter<VALUE>) filter.resolve();
return resolve.createConverter().convertForTableExport(resolve, filterContext);
}

@CPSType(id = FrontendFilterType.Fields.MULTI_SELECT, base = FilterValue.class)
public static class CQMultiSelectFilter extends FilterValue<Set<String>> {
@JsonCreator
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@
import com.bakdata.conquery.io.jackson.View;
import com.bakdata.conquery.models.identifiable.ids.specific.ManagedExecutionId;
import com.bakdata.conquery.models.query.C10nCache;
import com.bakdata.conquery.models.query.DateAggregationAction;
import com.bakdata.conquery.models.query.PrintSettings;
import com.bakdata.conquery.models.query.QueryExecutionContext;
import com.bakdata.conquery.models.query.QueryPlanContext;
import com.bakdata.conquery.models.query.QueryResolveContext;
import com.bakdata.conquery.models.query.RequiredEntities;
import com.bakdata.conquery.models.query.Visitable;
import com.bakdata.conquery.models.query.queryplan.ConceptQueryPlan;
import com.bakdata.conquery.models.query.queryplan.DateAggregationAction;
import com.bakdata.conquery.models.query.queryplan.QPNode;
import com.bakdata.conquery.models.query.queryplan.aggregators.specific.ExistsAggregator;
import com.bakdata.conquery.models.query.queryplan.specific.AndNode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
import com.bakdata.conquery.models.identifiable.NamespacedIdentifiable;
import com.bakdata.conquery.models.identifiable.ids.specific.*;
import com.bakdata.conquery.models.query.*;
import com.bakdata.conquery.models.query.DateAggregationAction;
import com.bakdata.conquery.models.query.queryplan.ConceptQueryPlan;
import com.bakdata.conquery.models.query.queryplan.DateAggregationAction;
import com.bakdata.conquery.models.query.queryplan.QPNode;
import com.bakdata.conquery.models.query.queryplan.aggregators.Aggregator;
import com.bakdata.conquery.models.query.queryplan.aggregators.specific.EventDateUnionAggregator;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@
import com.bakdata.conquery.io.cps.CPSType;
import com.bakdata.conquery.io.jackson.View;
import com.bakdata.conquery.models.identifiable.ids.specific.ManagedExecutionId;
import com.bakdata.conquery.models.query.DateAggregationAction;
import com.bakdata.conquery.models.query.DateAggregationMode;
import com.bakdata.conquery.models.query.QueryPlanContext;
import com.bakdata.conquery.models.query.QueryResolveContext;
import com.bakdata.conquery.models.query.Visitable;
import com.bakdata.conquery.models.query.queryplan.ConceptQueryPlan;
import com.bakdata.conquery.models.query.queryplan.DateAggregationAction;
import com.bakdata.conquery.models.query.queryplan.QPNode;
import com.bakdata.conquery.models.query.queryplan.specific.NegatingNode;
import com.bakdata.conquery.models.query.resultinfo.ResultInfo;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@
import com.bakdata.conquery.io.jackson.View;
import com.bakdata.conquery.models.identifiable.ids.specific.ManagedExecutionId;
import com.bakdata.conquery.models.query.C10nCache;
import com.bakdata.conquery.models.query.DateAggregationAction;
import com.bakdata.conquery.models.query.PrintSettings;
import com.bakdata.conquery.models.query.QueryExecutionContext;
import com.bakdata.conquery.models.query.QueryPlanContext;
import com.bakdata.conquery.models.query.QueryResolveContext;
import com.bakdata.conquery.models.query.RequiredEntities;
import com.bakdata.conquery.models.query.Visitable;
import com.bakdata.conquery.models.query.queryplan.ConceptQueryPlan;
import com.bakdata.conquery.models.query.queryplan.DateAggregationAction;
import com.bakdata.conquery.models.query.queryplan.QPNode;
import com.bakdata.conquery.models.query.queryplan.aggregators.specific.ExistsAggregator;
import com.bakdata.conquery.models.query.queryplan.specific.OrNode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import jakarta.validation.constraints.NotEmpty;

import com.bakdata.conquery.apiv1.query.CQElement;
Expand All @@ -33,7 +33,6 @@
import com.bakdata.conquery.models.types.ResultType;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonView;
import com.google.common.collect.Streams;
import io.dropwizard.validation.ValidationMethod;
import lombok.AccessLevel;
import lombok.Getter;
Expand Down Expand Up @@ -106,13 +105,7 @@ public QPNode createQueryPlan(QueryPlanContext context, ConceptQueryPlan plan) {
throw new IllegalStateException("CQExternal needs to be resolved before creating a plan");
}

final String[] extraHeaders = Streams.zip(
Arrays.stream(headers),
format.stream(),
(header, format) -> format.equals(EntityResolverUtil.FORMAT_EXTRA) ? header : null
)
.filter(Objects::nonNull)
.toArray(String[]::new);
final String[] extraHeaders = getExtraHeaders().toArray(String[]::new);

if (onlySingles) {
return createExternalNodeOnlySingle(context, plan, extraHeaders);
Expand Down Expand Up @@ -218,19 +211,24 @@ public List<ResultInfo> getResultInfos() {
if (extra == null) {
return Collections.emptyList();
}
List<ResultInfo> resultInfos = new ArrayList<>();
for (int col = 0; col < format.size(); col++) {
if (!format.get(col).equals(EntityResolverUtil.FORMAT_EXTRA)) {
continue;
}

final String column = headers[col];
final ResultType type = onlySingles
? ResultType.Primitive.STRING
: new ResultType.ListT<>(ResultType.Primitive.STRING);
return getExtraHeaders().stream()
.<ResultInfo>map(column -> new ExternalResultInfo(column, type))
.toList();
}

final ResultType type = onlySingles ? ResultType.Primitive.STRING : new ResultType.ListT<>(ResultType.Primitive.STRING);
resultInfos.add(new ExternalResultInfo(column, type));
/** Ordered names of the resolved columns that are returned as external result values. */
@JsonIgnore
public List<String> getExtraHeaders() {
if (headers == null) {
return List.of();
}

return resultInfos;
return IntStream.range(0, format.size())
.filter(index -> EntityResolverUtil.FORMAT_EXTRA.equals(format.get(index)))
.mapToObj(index -> headers[index])
.toList();
}


Expand Down Expand Up @@ -268,6 +266,9 @@ public boolean isWithExtras() {
}

public List<Map.Entry<String, List<String>>> getExtrasForId(String id) {
if (extra == null) {
return List.of();
}
Map<String, List<String>> extras = extra.getOrDefault(id, Collections.emptyMap());
// we need to bring the extras in the correct order
List<Map.Entry<String, List<String>>> inOrder = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,16 @@
import com.bakdata.conquery.models.query.ExecutionManager;
import com.bakdata.conquery.models.worker.DatasetRegistry;
import com.bakdata.conquery.models.worker.LocalNamespace;
import com.bakdata.conquery.sql.translate.DefaultSqlTranslator;
import com.bakdata.conquery.sql.translate.FormSqlTranslator;
import com.bakdata.conquery.sql.translate.TableExportSqlTranslator;
import com.bakdata.conquery.sql.conquery.SqlExecutionManager;
import com.bakdata.conquery.sql.conversion.NodeConversions;
import com.bakdata.conquery.sql.conversion.ResolvedFormAdapter;
import com.bakdata.conquery.sql.conversion.ResolvedFormMapper;
import com.bakdata.conquery.sql.conversion.ResolvedQueryAdapter;
import com.bakdata.conquery.sql.conversion.ResolvedQueryMapper;
import com.bakdata.conquery.sql.conversion.ResolvedTableExportAdapter;
import com.bakdata.conquery.sql.conversion.ResolvedTableExportMapper;
import com.bakdata.conquery.sql.conversion.SqlConverter;
import com.bakdata.conquery.sql.conversion.dialect.DialectBundle;
import com.bakdata.conquery.sql.execution.ResultSetProcessor;
Expand Down Expand Up @@ -49,8 +57,18 @@ public LocalNamespace createNamespace(
ResultSetProcessor resultSetProcessor = dialectBundle.getResultSetProcessor(config);
SqlExecutionService sqlExecutionService = new SqlExecutionService(dslContext, resultSetProcessor);

NodeConversions nodeConversions = new NodeConversions(config.getIdColumns(), dialectBundle, dslContext, sqlExecutionService, clock, connection.getConnection().getPrimaryColumn());
SqlConverter sqlConverter = new SqlConverter(nodeConversions, config);
ResolvedQueryMapper resolvedQueryMapper = new ResolvedQueryMapper(
config.getIdColumns(), dialectBundle.getFunctionProvider(), clock,
connection.getConnection().getPrimaryColumn());
ResolvedQueryAdapter resolvedQueryAdapter = new ResolvedQueryAdapter(
environment.getValidator(), new DefaultSqlTranslator(dslContext), resolvedQueryMapper);
ResolvedTableExportAdapter tableExportAdapter = new ResolvedTableExportAdapter(
new ResolvedTableExportMapper(resolvedQueryMapper, clock, connection.getConnection().getPrimaryColumn()),
new TableExportSqlTranslator(dslContext));
ResolvedFormAdapter formAdapter = new ResolvedFormAdapter(
new ResolvedFormMapper(resolvedQueryMapper), new FormSqlTranslator(dslContext));
SqlConverter sqlConverter = new SqlConverter(
resolvedQueryAdapter, tableExportAdapter, formAdapter, dialectBundle.getTranslatorDialect());
ExecutionManager executionManager = new SqlExecutionManager(sqlConverter, sqlExecutionService, metaStorage, datasetRegistry, config);
SqlStorageHandler sqlStorageHandler = new SqlStorageHandler(sqlExecutionService);
SqlEntityResolver sqlEntityResolver = new SqlEntityResolver(config.getIdColumns(), dslContext, dialectBundle, sqlExecutionService);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import com.bakdata.conquery.models.config.IdColumnConfig;
import com.bakdata.conquery.models.identifiable.mapping.EntityIdMap;
import com.bakdata.conquery.models.identifiable.mapping.ExternalId;
import com.bakdata.conquery.sql.conversion.SharedAliases;
import com.bakdata.conquery.sql.translate.ir.SharedAliases;
import com.bakdata.conquery.sql.conversion.dialect.DialectBundle;
import com.bakdata.conquery.sql.execution.SqlExecutionService;
import com.bakdata.conquery.util.DateReader;
Expand Down Expand Up @@ -152,7 +152,7 @@ private Map<Integer, IdResolveInfo> resolveIds(String[][] values, List<Function<
SelectConditionStep<Record3<Integer, String, Boolean>> resolveIdsQuery =
context.with(unresolvedCte)
.select(rowIndex, externalPrimaryColumn, isResolved)
.from(dialect.getFunctionProvider().innerJoin(allIdsTable, unresolvedCte, List.of(externalPrimaryColumn.eq(innerPrimaryColumn))))
.from(allIdsTable.innerJoin(unresolvedCte).on(externalPrimaryColumn.eq(innerPrimaryColumn)))
.where(externalPrimaryColumn.eq(innerPrimaryColumn));

return executionService.fetchStream(resolveIdsQuery)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,25 @@
package com.bakdata.conquery.models.common;

import java.util.Optional;

import lombok.NonNull;

public interface IRange<VALUE extends Comparable, CLASS extends IRange<VALUE, CLASS>> {
public interface IRange<VALUE extends Comparable<? super VALUE>, CLASS extends IRange<VALUE, CLASS>> extends InclusiveRange<VALUE> {

VALUE getMin();

VALUE getMax();

@Override
default Optional<VALUE> minimum() {
return Optional.ofNullable(getMin());
}

@Override
default Optional<VALUE> maximum() {
return Optional.ofNullable(getMax());
}

boolean contains(VALUE value);

boolean contains(CLASS other);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
@With
@Getter
@EqualsAndHashCode
public class Range<T extends Comparable> implements IRange<T, Range<T>> {
public class Range<T extends Comparable<? super T>> implements IRange<T, Range<T>> {

private final T min;
private final T max;
Expand All @@ -42,24 +42,24 @@ public boolean isOpen() {
return max == null || min == null;
}

public static <T extends Comparable<?>> Range<T> exactly(T exactly) {
public static <T extends Comparable<? super T>> Range<T> exactly(T exactly) {
return new Range<>(exactly, exactly);
}

@JsonCreator
public static <T extends Comparable<?>> Range<T> of(@JsonProperty("min") T min, @JsonProperty("max") T max) {
public static <T extends Comparable<? super T>> Range<T> of(@JsonProperty("min") T min, @JsonProperty("max") T max) {
return new Range<>(min, max);
}

public static <T extends Comparable<?>> Range<T> atMost(T bound) {
public static <T extends Comparable<? super T>> Range<T> atMost(T bound) {
return new Range<>(null, bound);
}

public static <T extends Comparable<?>> Range<T> atLeast(T bound) {
public static <T extends Comparable<? super T>> Range<T> atLeast(T bound) {
return new Range<>(bound, null);
}

public static <T extends Comparable<?>> Range<T> all() {
public static <T extends Comparable<? super T>> Range<T> all() {
return new Range<>(null, null);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import com.bakdata.conquery.io.cps.CPSType;
import com.bakdata.conquery.models.datasets.concepts.ConceptElement;
import com.bakdata.conquery.models.exceptions.ConceptConfigurationException;
import com.bakdata.conquery.sql.translate.ir.condition.WhereCondition;
import com.bakdata.conquery.sql.conversion.cqelement.concept.CTConditionContext;
import com.bakdata.conquery.sql.conversion.model.filter.WhereCondition;
import com.bakdata.conquery.util.CalculatedValue;
import lombok.Getter;
import lombok.Setter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
import com.bakdata.conquery.io.cps.CPSBase;
import com.bakdata.conquery.models.datasets.concepts.ConceptElement;
import com.bakdata.conquery.models.exceptions.ConceptConfigurationException;
import com.bakdata.conquery.sql.translate.ir.condition.WhereCondition;
import com.bakdata.conquery.sql.conversion.cqelement.concept.CTConditionContext;
import com.bakdata.conquery.sql.conversion.model.filter.WhereCondition;
import com.bakdata.conquery.util.CalculatedValue;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.google.common.collect.Sets;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@

import com.bakdata.conquery.io.cps.CPSType;
import com.bakdata.conquery.models.datasets.concepts.ConceptElement;
import com.bakdata.conquery.sql.translate.ir.condition.StringValuesCondition;
import com.bakdata.conquery.sql.translate.ir.condition.WhereCondition;
import com.bakdata.conquery.sql.conversion.cqelement.concept.CTConditionContext;
import com.bakdata.conquery.sql.conversion.model.filter.MultiSelectCondition;
import com.bakdata.conquery.sql.conversion.model.filter.WhereCondition;
import com.bakdata.conquery.util.CalculatedValue;
import com.bakdata.conquery.util.CollectionsUtil;
import com.fasterxml.jackson.annotation.JsonCreator;
Expand Down Expand Up @@ -58,7 +58,7 @@ public boolean matches(String value, CalculatedValue<Map<String, Object>> rowMap
@Override
public WhereCondition convertToSqlCondition(CTConditionContext context) {
Field<String> field = field(name(column), String.class);
return new MultiSelectCondition(field, values.toArray(String[]::new), context.getFunctionProvider());
return new StringValuesCondition(field, values.toArray(String[]::new));
}

private int fieldLength() {
Expand Down
Loading