20
20
import stroom .activity .api .FindActivityCriteria ;
21
21
import stroom .activity .shared .Activity ;
22
22
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 ;
23
29
import stroom .security .api .SecurityContext ;
24
30
import stroom .security .shared .AppPermission ;
25
31
import stroom .util .AuditUtil ;
26
- import stroom .util .filter .FilterFieldMapper ;
27
- import stroom .util .filter .FilterFieldMappers ;
28
- import stroom .util .filter .QuickFilterPredicateFactory ;
29
32
import stroom .util .logging .LambdaLogger ;
30
33
import stroom .util .logging .LambdaLoggerFactory ;
31
34
import stroom .util .logging .LogUtil ;
32
35
import stroom .util .shared .EntityServiceException ;
33
36
import stroom .util .shared .PermissionException ;
34
- import stroom .util .shared .QuickFilterResultPage ;
37
+ import stroom .util .shared .ResultPage ;
35
38
import stroom .util .shared .UserRef ;
36
39
import stroom .util .shared .filter .FilterFieldDefinition ;
37
40
38
41
import com .google .common .base .Strings ;
39
42
import jakarta .inject .Inject ;
40
43
41
44
import java .util .ArrayList ;
45
+ import java .util .Comparator ;
42
46
import java .util .List ;
43
47
import java .util .Objects ;
44
48
import java .util .Optional ;
49
+ import java .util .function .Function ;
45
50
import java .util .regex .Pattern ;
46
51
import java .util .regex .PatternSyntaxException ;
47
- import java .util .stream .Collectors ;
48
52
import java .util .stream .Stream ;
49
53
50
54
public class ActivityServiceImpl implements ActivityService {
@@ -53,12 +57,15 @@ public class ActivityServiceImpl implements ActivityService {
53
57
54
58
private final SecurityContext securityContext ;
55
59
private final ActivityDao dao ;
60
+ private final ExpressionPredicateFactory expressionPredicateFactory ;
56
61
57
62
@ Inject
58
63
public ActivityServiceImpl (final SecurityContext securityContext ,
59
- final ActivityDao dao ) {
64
+ final ActivityDao dao ,
65
+ final ExpressionPredicateFactory expressionPredicateFactory ) {
60
66
this .securityContext = securityContext ;
61
67
this .dao = dao ;
68
+ this .expressionPredicateFactory = expressionPredicateFactory ;
62
69
}
63
70
64
71
@ Override
@@ -132,41 +139,35 @@ public int deleteAllByOwner(final UserRef ownerRef) {
132
139
}
133
140
134
141
@ Override
135
- public QuickFilterResultPage <Activity > find (final String filter ) {
142
+ public ResultPage <Activity > find (final String filter ) {
136
143
return securityContext .secureResult (() -> {
137
144
// We have to deser all the activities to be able to search them but hopefully
138
145
// there are not that many to worry about
139
146
final List <Activity > allActivities = getAllUserActivities ();
140
147
141
148
final List <Activity > filteredActivities ;
142
- final String fullyQualifiedInput ;
143
149
if (!Strings .isNullOrEmpty (filter )) {
144
-
145
150
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 ( );
154
159
} else {
155
160
filteredActivities = allActivities ;
156
- fullyQualifiedInput = filter ;
157
161
}
158
162
159
- return QuickFilterResultPage .createCriterialBasedList (
163
+ return ResultPage .createCriterialBasedList (
160
164
filteredActivities ,
161
- new FindActivityCriteria (),
162
- filteredActivities .size (),
163
- fullyQualifiedInput );
165
+ new FindActivityCriteria ());
164
166
});
165
167
}
166
168
167
169
@ Override
168
170
public List <FilterFieldDefinition > listFieldDefinitions () {
169
-
170
171
return securityContext .secureResult (() -> {
171
172
final List <Activity > allActivities = getAllUserActivities ();
172
173
@@ -191,7 +192,7 @@ private List<FilterFieldDefinition> buildFieldDefinitions(final List<Activity> a
191
192
}
192
193
})
193
194
.distinct ()
194
- .collect ( Collectors . toList () );
195
+ .toList ();
195
196
}
196
197
197
198
private List <Activity > getAllUserActivities () {
@@ -240,26 +241,22 @@ public ActivityValidationResult validate(final Activity activity) {
240
241
return new ActivityValidationResult (valid , String .join ("\n " , messages ));
241
242
}
242
243
243
- private FilterFieldMappers <Activity > buildFieldMappers (final List <FilterFieldDefinition > fieldDefinitions ) {
244
+ private ValueFunctionFactories <Activity > buildValueFunctionFactories (
245
+ final List <FilterFieldDefinition > fieldDefinitions ) {
244
246
// Extracting the value out of the json details is not very efficient. May be better to use
245
247
// 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 ;
264
261
}
265
262
}
0 commit comments