Skip to content

Commit

Permalink
Fix resolving conditions of all parents of concept tree children (#3309)
Browse files Browse the repository at this point in the history
  • Loading branch information
jnsrnhld authored Feb 27, 2024
1 parent a56d8fb commit c3cb374
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,10 @@
import com.bakdata.conquery.models.datasets.concepts.tree.ConceptTreeNode;
import com.bakdata.conquery.models.exceptions.ConceptConfigurationException;
import com.bakdata.conquery.sql.conversion.cqelement.concept.CTConditionContext;
import com.bakdata.conquery.sql.conversion.model.filter.ConditionType;
import com.bakdata.conquery.sql.conversion.model.filter.WhereCondition;
import com.bakdata.conquery.sql.conversion.model.filter.WhereConditionWrapper;
import com.bakdata.conquery.util.CalculatedValue;
import lombok.Getter;
import lombok.Setter;
import org.jooq.Condition;

/**
* This condition connects multiple conditions with an and.
Expand Down Expand Up @@ -51,9 +48,7 @@ public void init(ConceptTreeNode node) throws ConceptConfigurationException {
public WhereCondition convertToSqlCondition(CTConditionContext context) {
return conditions.stream()
.map(condition -> condition.convertToSqlCondition(context))
.map(WhereCondition::condition)
.reduce(Condition::and)
.map(condition -> new WhereConditionWrapper(condition, ConditionType.PREPROCESSING))
.reduce(WhereCondition::and)
.orElseThrow(
() -> new IllegalStateException("At least one condition is required to convert %s to a SQL condition.".formatted(getClass()))
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,10 @@
import com.bakdata.conquery.models.datasets.concepts.tree.ConceptTreeNode;
import com.bakdata.conquery.models.exceptions.ConceptConfigurationException;
import com.bakdata.conquery.sql.conversion.cqelement.concept.CTConditionContext;
import com.bakdata.conquery.sql.conversion.model.filter.ConditionType;
import com.bakdata.conquery.sql.conversion.model.filter.WhereCondition;
import com.bakdata.conquery.sql.conversion.model.filter.WhereConditionWrapper;
import com.bakdata.conquery.util.CalculatedValue;
import lombok.Getter;
import lombok.Setter;
import org.jooq.Condition;

/**
* This condition connects multiple conditions with an or.
Expand Down Expand Up @@ -51,9 +48,7 @@ public void init(ConceptTreeNode node) throws ConceptConfigurationException {
public WhereCondition convertToSqlCondition(CTConditionContext context) {
return conditions.stream()
.map(condition -> condition.convertToSqlCondition(context))
.map(WhereCondition::condition)
.reduce(Condition::or)
.map(condition -> new WhereConditionWrapper(condition, ConditionType.PREPROCESSING))
.reduce(WhereCondition::or)
.orElseThrow(
() -> new IllegalStateException("At least one condition is required to convert %s to a SQL condition.".formatted(getClass()))
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.bakdata.conquery.models.datasets.concepts.ConceptElement;
import com.bakdata.conquery.models.datasets.concepts.Connector;
import com.bakdata.conquery.models.datasets.concepts.tree.ConceptTreeChild;
import com.bakdata.conquery.models.datasets.concepts.tree.ConceptTreeNode;
import com.bakdata.conquery.models.query.queryplan.DateAggregationAction;
import com.bakdata.conquery.sql.conversion.NodeConverter;
import com.bakdata.conquery.sql.conversion.cqelement.ConversionContext;
Expand All @@ -30,7 +31,6 @@
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.filter.WhereConditionWrapper;
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.SqlSelect;
Expand Down Expand Up @@ -201,29 +201,41 @@ private static boolean dateRestrictionApplicable(boolean dateRestrictionRequired
private static Optional<SqlFilters> collectConditionFilters(List<ConceptElement<?>> conceptElements, CQTable cqTable, SqlFunctionProvider functionProvider) {
return collectConditions(conceptElements, cqTable, functionProvider)
.stream()
.map(WhereCondition::condition)
.reduce(Condition::or)
.map(condition -> new WhereConditionWrapper(condition, ConditionType.PREPROCESSING))
.reduce(WhereCondition::or)
.map(whereCondition -> new SqlFilters(
SqlSelects.builder().build(),
WhereClauses.builder().preprocessingCondition(whereCondition).build()
));
}

private static List<WhereCondition> collectConditions(List<ConceptElement<?>> conceptElements, CQTable cqTable, SqlFunctionProvider functionProvider) {

List<WhereCondition> conditions = new ArrayList<>();
convertConnectorCondition(cqTable, functionProvider).ifPresent(conditions::add);
conceptElements.stream()
.filter(conceptElement -> conceptElement instanceof ConceptTreeChild)
.forEach(conceptElement -> {
ConceptTreeChild child = (ConceptTreeChild) conceptElement;
Connector connector = cqTable.getConnector();
WhereCondition childCondition = child.getCondition().convertToSqlCondition(CTConditionContext.create(connector, functionProvider));
conditions.add(childCondition);
});

for (ConceptElement<?> conceptElement : conceptElements) {
collectConditions(cqTable, (ConceptTreeNode<?>) conceptElement, functionProvider)
.reduce(WhereCondition::and)
.ifPresent(conditions::add);
}

return conditions;
}

/**
* Collects all conditions of a given {@link ConceptTreeNode} by resolving the condition of the given node and all of its parent nodes.
*/
private static Stream<WhereCondition> collectConditions(CQTable cqTable, ConceptTreeNode<?> conceptElement, SqlFunctionProvider functionProvider) {
if (!(conceptElement instanceof ConceptTreeChild child)) {
return Stream.empty();
}
WhereCondition childCondition = child.getCondition().convertToSqlCondition(CTConditionContext.create(cqTable.getConnector(), functionProvider));
return Stream.concat(
collectConditions(cqTable, child.getParent(), functionProvider),
Stream.of(childCondition)
);
}

private static Optional<WhereCondition> convertConnectorCondition(CQTable cqTable, SqlFunctionProvider functionProvider) {
return Optional.ofNullable(cqTable.getConnector().getCondition())
.map(condition -> condition.convertToSqlCondition(CTConditionContext.create(cqTable.getConnector(), functionProvider)));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.bakdata.conquery.sql.conversion.model.filter;

import java.util.function.BiFunction;

import org.jooq.Condition;

public interface WhereCondition {
Expand All @@ -12,4 +14,17 @@ default WhereCondition negate() {
return new InvertedCondition(this);
}

default WhereCondition and(WhereCondition whereCondition) {
return combineConditions(whereCondition, Condition::and);
}

default WhereCondition or(WhereCondition whereCondition) {
return combineConditions(whereCondition, Condition::or);
}

private WhereCondition combineConditions(WhereCondition whereCondition, BiFunction<Condition, Condition, Condition> operation) {
Condition combinedCondition = operation.apply(this.condition(), whereCondition.condition());
return new WhereConditionWrapper(combinedCondition, ConditionType.PREPROCESSING);
}

}
5 changes: 0 additions & 5 deletions backend/src/test/resources/tests/sql/tree/simple/content.csv

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
pid,datum,test_column,present_column
1,2012-01-01,"A1",is_set
2,2010-07-15,"B2",is_set
3,2013-11-10,"A1",
4,2012-11-11,"B2",
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
result,dates
1,{2012-01-01/2012-01-01}
3,{2013-11-10/2013-11-10}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
"sqlSpec": {
"isEnabled": true
},
"label": "Simple TREE concept with 1 child with EQUAL CTCondition selected",
"expectedCsv": "tests/sql/tree/simple/expected.csv",
"label": "Tree concept resolving a deep child and it's parents",
"expectedCsv": "tests/sql/tree/with_parent/expected.csv",
"query": {
"type": "CONCEPT_QUERY",
"root": {
"type": "CONCEPT",
"ids": [
"test_tree.test_child1"
"test_tree.test_child1.test_child2"
],
"tables": [
{
Expand All @@ -36,33 +36,44 @@
"children": [
{
"label": "test_child1",
"description": " ",
"condition": {
"type": "EQUAL",
"values": [
"A1"
"type": "AND",
"conditions": [
{
"type": "EQUAL",
"values": [
"A1"
]
},
{
"type": "NOT",
"condition": {
"type": "EQUAL",
"values": [
"B2"
]
}
}
]
},
"children": []
},
{
"label": "test_child2",
"description": " ",
"condition": {
"type": "EQUAL",
"values": [
"B2"
]
},
"children": []
"children": [
{
"label": "test_child2",
"condition": {
"type": "PRESENT",
"column": "present_column"
},
"children": []
}
]
}
]
}
],
"content": {
"tables": [
{
"csv": "tests/sql/tree/simple/content.csv",
"csv": "tests/sql/tree/with_parent/content.csv",
"name": "test_table",
"primaryColumn": {
"name": "pid",
Expand All @@ -76,6 +87,10 @@
{
"name": "test_column",
"type": "STRING"
},
{
"name": "present_column",
"type": "STRING"
}
]
}
Expand Down

0 comments on commit c3cb374

Please sign in to comment.