Skip to content

Commit 7fcf0c5

Browse files
authored
Merge pull request #4794 from gchq/gh-4552_dynamic_fields_filter_merge
Gh 4552 dynamic fields filter merge
2 parents 7bf589d + af55a10 commit 7fcf0c5

File tree

265 files changed

+4812
-3988
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

265 files changed

+4812
-3988
lines changed

Diff for: stroom-activity/stroom-activity-api/src/main/java/stroom/activity/api/ActivityService.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import stroom.activity.shared.Activity;
2020
import stroom.activity.shared.ActivityValidationResult;
21-
import stroom.util.shared.QuickFilterResultPage;
21+
import stroom.util.shared.ResultPage;
2222
import stroom.util.shared.UserRef;
2323
import stroom.util.shared.filter.FilterFieldDefinition;
2424

@@ -36,7 +36,7 @@ public interface ActivityService {
3636

3737
int deleteAllByOwner(UserRef ownerRef);
3838

39-
QuickFilterResultPage<Activity> find(final String filter);
39+
ResultPage<Activity> find(final String filter);
4040

4141
List<FilterFieldDefinition> listFieldDefinitions();
4242

Diff for: stroom-activity/stroom-activity-impl-db/build.gradle

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ dependencies {
77
implementation project(':stroom-config:stroom-config-common')
88
implementation project(':stroom-core-shared')
99
implementation project(':stroom-db-util')
10+
implementation project(':stroom-query:stroom-query-api')
11+
implementation project(':stroom-query:stroom-query-language-api')
12+
implementation project(':stroom-query:stroom-query-common')
1013
implementation project(':stroom-util')
1114
implementation project(':stroom-util-shared')
1215

Diff for: stroom-activity/stroom-activity-impl-db/src/main/java/stroom/activity/impl/db/ActivityDaoImpl.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import java.util.Objects;
3939
import java.util.Optional;
4040
import java.util.function.Function;
41-
import java.util.stream.Collectors;
4241
import java.util.stream.Stream;
4342

4443
import static stroom.activity.impl.db.jooq.tables.Activity.ACTIVITY;
@@ -161,7 +160,7 @@ public List<Activity> find(final FindActivityCriteria criteria) {
161160
.fetch())
162161
.stream()
163162
.map(RECORD_TO_ACTIVITY_MAPPER)
164-
.collect(Collectors.toList());
163+
.toList();
165164
}
166165

167166
@Override
@@ -187,7 +186,7 @@ public List<Activity> find(
187186
return streamFunction.apply(activityStream)
188187
.skip(offset)
189188
.limit(limit)
190-
.collect(Collectors.toList());
189+
.toList();
191190
}
192191
});
193192
}

Diff for: stroom-activity/stroom-activity-impl-db/src/test/java/stroom/activity/impl/db/TestActivityServiceImpl.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import stroom.activity.shared.Activity;
2525
import stroom.activity.shared.Activity.Prop;
2626
import stroom.activity.shared.ActivityValidationResult;
27+
import stroom.query.common.v2.ExpressionPredicateFactory;
2728
import stroom.security.api.SecurityContext;
2829
import stroom.security.mock.MockSecurityContext;
2930
import stroom.test.common.util.db.DbTestUtil;
@@ -54,9 +55,10 @@ class TestActivityServiceImpl {
5455
void before() {
5556
final ActivityDbConnProvider activityDbConnProvider = DbTestUtil.getTestDbDatasource(
5657
new ActivityDbModule(), new ActivityDbConfig());
58+
final ExpressionPredicateFactory expressionPredicateFactory = new ExpressionPredicateFactory();
5759

5860
final ActivityDao activityDao = new ActivityDaoImpl(activityDbConnProvider);
59-
activityService = new ActivityServiceImpl(securityContext, activityDao);
61+
activityService = new ActivityServiceImpl(securityContext, activityDao, expressionPredicateFactory);
6062
}
6163

6264
@Test

Diff for: stroom-activity/stroom-activity-impl/build.gradle

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ dependencies {
55
implementation project(':stroom-core-shared')
66
implementation project(':stroom-event-logging:stroom-event-logging-api')
77
implementation project(':stroom-event-logging-rs:stroom-event-logging-rs-api')
8+
implementation project(':stroom-query:stroom-query-api')
9+
implementation project(':stroom-query:stroom-query-language-api')
10+
implementation project(':stroom-query:stroom-query-common')
811
implementation project(':stroom-security:stroom-security-api')
912
implementation project(':stroom-util-shared')
1013
implementation project(':stroom-util')

Diff for: stroom-activity/stroom-activity-impl/src/main/java/stroom/activity/impl/ActivityResourceImpl.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import stroom.event.logging.rs.api.AutoLogged;
1313
import stroom.event.logging.rs.api.AutoLogged.OperationType;
1414
import stroom.util.rest.RestUtil;
15-
import stroom.util.shared.QuickFilterResultPage;
15+
import stroom.util.shared.ResultPage;
1616
import stroom.util.shared.filter.FilterFieldDefinition;
1717

1818
import com.google.common.base.Strings;
@@ -50,7 +50,7 @@ class ActivityResourceImpl implements ActivityResource {
5050

5151
@AutoLogged(value = OperationType.MANUALLY_LOGGED)
5252
@Override
53-
public QuickFilterResultPage<Activity> list(final String filter) {
53+
public ResultPage<Activity> list(final String filter) {
5454
final boolean loggingRequired = !Strings.isNullOrEmpty(filter);
5555
ThreadLocalLogState.setLogged(!loggingRequired);
5656

@@ -66,10 +66,10 @@ public QuickFilterResultPage<Activity> list(final String filter) {
6666
.build())
6767
.withComplexLoggedResult(searchEventAction -> {
6868
// Do the work
69-
final QuickFilterResultPage<Activity> result = activityServiceProvider.get().find(filter);
69+
final ResultPage<Activity> result = activityServiceProvider.get().find(filter);
7070

7171
final SearchEventAction newSearchEventAction = searchEventAction.newCopyBuilder()
72-
.withQuery(buildRawQuery(result.getQualifiedFilterInput()))
72+
.withQuery(buildRawQuery(filter))
7373
.withResultPage(StroomEventLoggingUtil.createResultPage(result))
7474
.withTotalResults(BigInteger.valueOf(result.size()))
7575
.build();

Diff for: stroom-activity/stroom-activity-impl/src/main/java/stroom/activity/impl/ActivityServiceImpl.java

+40-43
Original file line numberDiff line numberDiff line change
@@ -20,31 +20,35 @@
2020
import stroom.activity.api.FindActivityCriteria;
2121
import stroom.activity.shared.Activity;
2222
import stroom.activity.shared.ActivityValidationResult;
23+
import stroom.expression.api.DateTimeSettings;
24+
import stroom.query.common.v2.ExpressionPredicateFactory;
25+
import stroom.query.common.v2.ExpressionPredicateFactory.ValueFunctionFactories;
26+
import stroom.query.common.v2.FieldProviderImpl;
27+
import stroom.query.common.v2.SimpleStringExpressionParser.FieldProvider;
28+
import stroom.query.common.v2.ValueFunctionFactoriesImpl;
2329
import stroom.security.api.SecurityContext;
2430
import stroom.security.shared.AppPermission;
2531
import stroom.util.AuditUtil;
26-
import stroom.util.filter.FilterFieldMapper;
27-
import stroom.util.filter.FilterFieldMappers;
28-
import stroom.util.filter.QuickFilterPredicateFactory;
2932
import stroom.util.logging.LambdaLogger;
3033
import stroom.util.logging.LambdaLoggerFactory;
3134
import stroom.util.logging.LogUtil;
3235
import stroom.util.shared.EntityServiceException;
3336
import stroom.util.shared.PermissionException;
34-
import stroom.util.shared.QuickFilterResultPage;
37+
import stroom.util.shared.ResultPage;
3538
import stroom.util.shared.UserRef;
3639
import stroom.util.shared.filter.FilterFieldDefinition;
3740

3841
import com.google.common.base.Strings;
3942
import jakarta.inject.Inject;
4043

4144
import java.util.ArrayList;
45+
import java.util.Comparator;
4246
import java.util.List;
4347
import java.util.Objects;
4448
import java.util.Optional;
49+
import java.util.function.Function;
4550
import java.util.regex.Pattern;
4651
import java.util.regex.PatternSyntaxException;
47-
import java.util.stream.Collectors;
4852
import java.util.stream.Stream;
4953

5054
public class ActivityServiceImpl implements ActivityService {
@@ -53,12 +57,15 @@ public class ActivityServiceImpl implements ActivityService {
5357

5458
private final SecurityContext securityContext;
5559
private final ActivityDao dao;
60+
private final ExpressionPredicateFactory expressionPredicateFactory;
5661

5762
@Inject
5863
public ActivityServiceImpl(final SecurityContext securityContext,
59-
final ActivityDao dao) {
64+
final ActivityDao dao,
65+
final ExpressionPredicateFactory expressionPredicateFactory) {
6066
this.securityContext = securityContext;
6167
this.dao = dao;
68+
this.expressionPredicateFactory = expressionPredicateFactory;
6269
}
6370

6471
@Override
@@ -132,41 +139,35 @@ public int deleteAllByOwner(final UserRef ownerRef) {
132139
}
133140

134141
@Override
135-
public QuickFilterResultPage<Activity> find(final String filter) {
142+
public ResultPage<Activity> find(final String filter) {
136143
return securityContext.secureResult(() -> {
137144
// We have to deser all the activities to be able to search them but hopefully
138145
// there are not that many to worry about
139146
final List<Activity> allActivities = getAllUserActivities();
140147

141148
final List<Activity> filteredActivities;
142-
final String fullyQualifiedInput;
143149
if (!Strings.isNullOrEmpty(filter)) {
144-
145150
final List<FilterFieldDefinition> fieldDefinitions = buildFieldDefinitions(allActivities);
146-
147-
final FilterFieldMappers<Activity> fieldMappers = buildFieldMappers(fieldDefinitions);
148-
149-
filteredActivities = QuickFilterPredicateFactory.filterStream(
150-
filter, fieldMappers, allActivities.stream())
151-
.collect(Collectors.toList());
152-
153-
fullyQualifiedInput = QuickFilterPredicateFactory.fullyQualifyInput(filter, fieldMappers);
151+
final FieldProvider fieldProvider = new FieldProviderImpl(fieldDefinitions);
152+
final ValueFunctionFactories<Activity> valueFunctionFactories =
153+
buildValueFunctionFactories(fieldDefinitions);
154+
filteredActivities = expressionPredicateFactory.filterAndSortStream(
155+
allActivities.stream(),
156+
filter, fieldProvider, valueFunctionFactories,
157+
Optional.of(Comparator.comparingInt((Activity activity) -> activity.getId())))
158+
.toList();
154159
} else {
155160
filteredActivities = allActivities;
156-
fullyQualifiedInput = filter;
157161
}
158162

159-
return QuickFilterResultPage.createCriterialBasedList(
163+
return ResultPage.createCriterialBasedList(
160164
filteredActivities,
161-
new FindActivityCriteria(),
162-
filteredActivities.size(),
163-
fullyQualifiedInput);
165+
new FindActivityCriteria());
164166
});
165167
}
166168

167169
@Override
168170
public List<FilterFieldDefinition> listFieldDefinitions() {
169-
170171
return securityContext.secureResult(() -> {
171172
final List<Activity> allActivities = getAllUserActivities();
172173

@@ -191,7 +192,7 @@ private List<FilterFieldDefinition> buildFieldDefinitions(final List<Activity> a
191192
}
192193
})
193194
.distinct()
194-
.collect(Collectors.toList());
195+
.toList();
195196
}
196197

197198
private List<Activity> getAllUserActivities() {
@@ -240,26 +241,22 @@ public ActivityValidationResult validate(final Activity activity) {
240241
return new ActivityValidationResult(valid, String.join("\n", messages));
241242
}
242243

243-
private FilterFieldMappers<Activity> buildFieldMappers(final List<FilterFieldDefinition> fieldDefinitions) {
244+
private ValueFunctionFactories<Activity> buildValueFunctionFactories(
245+
final List<FilterFieldDefinition> fieldDefinitions) {
244246
// Extracting the value out of the json details is not very efficient. May be better to use
245247
// something like jsoniter on the raw json.
246-
final FilterFieldMappers<Activity> fieldMappers = FilterFieldMappers.of(fieldDefinitions.stream()
247-
.map(fieldDefinition ->
248-
FilterFieldMapper.of(fieldDefinition, (Activity activity) -> {
249-
250-
// Use the field displayname to look up the matching prop in the activity details
251-
final String value = Optional.ofNullable(activity)
252-
.flatMap(activity2 ->
253-
Optional.ofNullable(activity2.getDetails()))
254-
.map(details ->
255-
details.valueByName(fieldDefinition.getDisplayName()))
256-
.orElse(null);
257-
258-
LOGGER.trace("FilterFieldDefinition: {}, value {}",
259-
fieldDefinition, value);
260-
return value;
261-
}))
262-
.collect(Collectors.toList()));
263-
return fieldMappers;
248+
final ValueFunctionFactoriesImpl valueFunctionFactories = new ValueFunctionFactoriesImpl();
249+
fieldDefinitions.stream().forEach(fieldDefinition -> {
250+
final Function<Activity, String> function = activity -> {
251+
return Optional.ofNullable(activity)
252+
.flatMap(activity2 ->
253+
Optional.ofNullable(activity2.getDetails()))
254+
.map(details ->
255+
details.valueByName(fieldDefinition.getDisplayName()))
256+
.orElse(null);
257+
};
258+
valueFunctionFactories.put(fieldDefinition, function);
259+
});
260+
return valueFunctionFactories;
264261
}
265262
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<configuration>
2+
3+
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
4+
<!-- encoders are assigned the type
5+
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
6+
<encoder>
7+
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
8+
</encoder>
9+
</appender>
10+
11+
<logger name="stroom" level="debug" />
12+
13+
<!--<logger name="org.flywaydb.core.internal.sqlscript" level="debug" />-->
14+
15+
<root level="error">
16+
<appender-ref ref="STDOUT" />
17+
</root>
18+
19+
</configuration>

Diff for: stroom-analytics/stroom-analytics-impl-db/src/main/java/stroom/analytics/impl/db/ExecutionScheduleDaoImpl.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import stroom.analytics.shared.ExecutionTracker;
1212
import stroom.analytics.shared.ScheduleBounds;
1313
import stroom.db.util.JooqUtil;
14-
import stroom.db.util.StringMatchConditionUtil;
1514
import stroom.docref.DocRef;
1615
import stroom.security.api.SecurityContext;
1716
import stroom.security.shared.AppPermission;
@@ -64,8 +63,8 @@ public ResultPage<ExecutionSchedule> fetchExecutionSchedule(final ExecutionSched
6463
Optional.ofNullable(request.getOwnerDocRef())
6564
.map(DocRef::getUuid)
6665
.map(EXECUTION_SCHEDULE.DOC_UUID::eq),
67-
Optional.ofNullable(StringMatchConditionUtil
68-
.getCondition(EXECUTION_SCHEDULE.NODE_NAME, request.getNodeName())),
66+
Optional.ofNullable(request.getNodeName())
67+
.map(EXECUTION_SCHEDULE.NODE_NAME::eq),
6968
Optional.ofNullable(request.getEnabled())
7069
.map(EXECUTION_SCHEDULE.ENABLED::eq));
7170
final Collection<OrderField<?>> orderFields = createExecutionScheduleOrderFields(request);

Diff for: stroom-analytics/stroom-analytics-impl/src/main/java/stroom/analytics/impl/AbstractScheduledQueryExecutor.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import stroom.analytics.shared.ExecutionTracker;
2525
import stroom.analytics.shared.ScheduleBounds;
2626
import stroom.docref.DocRef;
27-
import stroom.docref.StringMatch;
2827
import stroom.docrefinfo.api.DocRefInfoService;
2928
import stroom.node.api.NodeInfo;
3029
import stroom.security.api.SecurityContext;
@@ -162,7 +161,7 @@ private void execRule(final T doc,
162161
.builder()
163162
.ownerDocRef(docRef)
164163
.enabled(true)
165-
.nodeName(StringMatch.equals(nodeInfo.getThisNodeName(), true))
164+
.nodeName(nodeInfo.getThisNodeName())
166165
.build();
167166

168167
final ResultPage<ExecutionSchedule> executionSchedules = executionScheduleDao.fetchExecutionSchedule(request);

Diff for: stroom-analytics/stroom-analytics-impl/src/main/java/stroom/analytics/impl/AnalyticsSearchProvider.java

+6-8
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import stroom.query.common.v2.CoprocessorsFactory;
3030
import stroom.query.common.v2.CoprocessorsImpl;
3131
import stroom.query.common.v2.DataStoreSettings;
32-
import stroom.query.common.v2.FieldInfoResultPageBuilder;
32+
import stroom.query.common.v2.FieldInfoResultPageFactory;
3333
import stroom.query.common.v2.ResultStore;
3434
import stroom.query.common.v2.ResultStoreFactory;
3535
import stroom.query.common.v2.SearchProvider;
@@ -51,26 +51,24 @@ public class AnalyticsSearchProvider implements SearchProvider, IsSpecialExplore
5151
private final ResultStoreFactory resultStoreFactory;
5252
private final FederatedSearchExecutor federatedSearchExecutor;
5353
private final AnalyticsNodeSearchTaskCreator nodeSearchTaskCreator;
54+
private final FieldInfoResultPageFactory fieldInfoResultPageFactory;
5455

5556
@Inject
5657
public AnalyticsSearchProvider(final CoprocessorsFactory coprocessorsFactory,
5758
final ResultStoreFactory resultStoreFactory,
5859
final FederatedSearchExecutor federatedSearchExecutor,
59-
final AnalyticsNodeSearchTaskCreator nodeSearchTaskCreator) {
60+
final AnalyticsNodeSearchTaskCreator nodeSearchTaskCreator,
61+
final FieldInfoResultPageFactory fieldInfoResultPageFactory) {
6062
this.coprocessorsFactory = coprocessorsFactory;
6163
this.resultStoreFactory = resultStoreFactory;
6264
this.federatedSearchExecutor = federatedSearchExecutor;
6365
this.nodeSearchTaskCreator = nodeSearchTaskCreator;
66+
this.fieldInfoResultPageFactory = fieldInfoResultPageFactory;
6467
}
6568

6669
@Override
6770
public ResultPage<QueryField> getFieldInfo(final FindFieldCriteria criteria) {
68-
// if (!getType().equals(criteria.getDataSourceRef().getType())) {
69-
// return ResultPage.empty();
70-
// }
71-
return FieldInfoResultPageBuilder.builder(criteria)
72-
.addAll(AnalyticFields.getFields())
73-
.build();
71+
return fieldInfoResultPageFactory.create(criteria, AnalyticFields.getFields());
7472
}
7573

7674
@Override

Diff for: stroom-analytics/stroom-analytics-impl/src/main/java/stroom/analytics/impl/Detection.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import java.util.Map;
1616
import java.util.Objects;
1717
import java.util.UUID;
18-
import java.util.stream.Collectors;
1918

2019
@JsonPropertyOrder({
2120
"detectTime",
@@ -444,7 +443,7 @@ public Builder withValues(final Map<String, String> values) {
444443
.stream()
445444
.filter(entry -> entry.getKey() != null)
446445
.map(entry -> new DetectionValue(entry.getKey(), entry.getValue()))
447-
.collect(Collectors.toList());
446+
.toList();
448447
return this;
449448
}
450449

0 commit comments

Comments
 (0)