-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathArrayConceptQuery.java
More file actions
122 lines (103 loc) · 4.22 KB
/
ArrayConceptQuery.java
File metadata and controls
122 lines (103 loc) · 4.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package com.bakdata.conquery.apiv1.query;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
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.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.ArrayConceptQueryPlan;
import com.bakdata.conquery.models.query.resultinfo.ResultInfo;
import com.bakdata.conquery.models.types.SemanticType;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonView;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
/**
* Query type that combines a set of {@link ConceptQuery}s which are separately evaluated
* and whose results are merged. If a SpecialDateUnion is required, the result will hold
* the union of all dates from the separate queries.
*/
@Getter
@Setter
@CPSType(id = "ARRAY_CONCEPT_QUERY", base = QueryDescription.class)
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE, onConstructor_ = {@JsonCreator})
@ToString
public class ArrayConceptQuery extends Query {
@NotEmpty
@Valid
private List<ConceptQuery> childQueries = new ArrayList<>();
@NotNull
protected DateAggregationMode dateAggregationMode = DateAggregationMode.NONE;
@JsonView(View.InternalCommunication.class)
protected DateAggregationMode resolvedDateAggregationMode;
public static ArrayConceptQuery createFromFeatures(List<CQElement> features) {
List<ConceptQuery> cqWraps = features.stream()
.map(ConceptQuery::new)
.collect(Collectors.toList());
return new ArrayConceptQuery(cqWraps);
}
public ArrayConceptQuery(@NonNull List<ConceptQuery> queries, @NonNull DateAggregationMode dateAggregationMode) {
this.childQueries = queries;
this.dateAggregationMode = dateAggregationMode;
}
public ArrayConceptQuery(List<ConceptQuery> queries) {
this(queries, DateAggregationMode.NONE);
}
@Override
public void resolve(QueryResolveContext context) {
resolvedDateAggregationMode = dateAggregationMode;
if (context.getDateAggregationMode() != null) {
log.trace("Overriding date aggregation mode ({}) with mode from context ({})", dateAggregationMode, context.getDateAggregationMode());
resolvedDateAggregationMode = context.getDateAggregationMode();
}
childQueries.forEach(c -> c.resolve(context.withDateAggregationMode(resolvedDateAggregationMode)));
}
@Override
public ArrayConceptQueryPlan createQueryPlan(QueryPlanContext context) {
// Make sure the constructor and the adding is called with the same context.
ArrayConceptQueryPlan aq = new ArrayConceptQueryPlan(resolvedDateAggregationMode != DateAggregationMode.NONE);
aq.addChildQueries(childQueries, context);
return aq;
}
@Override
public void collectRequiredQueries(Set<ManagedExecutionId> requiredQueries) {
childQueries.forEach(q -> q.collectRequiredQueries(requiredQueries));
}
@Override
public List<ResultInfo> getResultInfos() {
final List<ResultInfo> resultInfos = new ArrayList<>();
ResultInfo dateInfo = ResultHeaders.datesInfo();
if(getResolvedDateAggregationMode() != DateAggregationMode.NONE){
// Add one DateInfo for the whole Query
resultInfos.addFirst(dateInfo);
}
int lastIndex = resultInfos.size();
childQueries.forEach(q -> resultInfos.addAll(q.getResultInfos()));
if(!resultInfos.isEmpty()) {
// Remove DateInfo from each childQuery
resultInfos.subList(lastIndex, resultInfos.size())
.removeIf(resultInfo -> resultInfo.getSemantics().contains(new SemanticType.EventDateT()));
}
return resultInfos;
}
@Override
public void visit(Consumer<Visitable> visitor) {
visitor.accept(this);
childQueries.forEach(q -> q.visit(visitor));
}
}