6
6
import java .util .Map .Entry ;
7
7
import java .util .concurrent .*;
8
8
import java .util .stream .Collectors ;
9
+ import java .util .stream .Stream ;
9
10
import java .util .zip .GZIPInputStream ;
10
11
11
12
import com .google .common .util .concurrent .UncheckedExecutionException ;
@@ -195,24 +196,27 @@ protected Set<Integer> applyBooleanLogic(List<Set<Integer>> filteredIdSets) {
195
196
* @return
196
197
*/
197
198
protected List <Set <Integer >> idSetsForEachFilter (Query query ) {
198
- ArrayList <Set <Integer >> filteredIdSets = new ArrayList <Set < Integer > >();
199
+ final ArrayList <Set <Integer >> filteredIdSets = new ArrayList <>();
199
200
200
201
try {
201
- addIdSetsForAnyRecordOf (query , filteredIdSets );
202
+ query .getAllAnyRecordOf ().forEach (anyRecordOfFilterList -> {
203
+ addIdSetsForAnyRecordOf (anyRecordOfFilterList , filteredIdSets );
204
+ });
202
205
addIdSetsForRequiredFields (query , filteredIdSets );
203
206
addIdSetsForNumericFilters (query , filteredIdSets );
204
207
addIdSetsForCategoryFilters (query , filteredIdSets );
205
208
} catch (InvalidCacheLoadException e ) {
206
209
log .warn ("Invalid query supplied: " + e .getLocalizedMessage ());
207
- filteredIdSets .add (new HashSet <Integer >()); // if an invalid path is supplied, no patients should match.
210
+ filteredIdSets .add (new HashSet <>()); // if an invalid path is supplied, no patients should match.
208
211
}
209
212
210
213
//AND logic to make sure all patients match each filter
211
214
if (filteredIdSets .size ()>1 ) {
212
- filteredIdSets = new ArrayList <Set <Integer >>(List .of (applyBooleanLogic (filteredIdSets )));
215
+ List <Set <Integer >> processedFilteredIdSets = new ArrayList <>(List .of (applyBooleanLogic (filteredIdSets )));
216
+ return addIdSetsForVariantInfoFilters (query , processedFilteredIdSets );
217
+ } else {
218
+ return addIdSetsForVariantInfoFilters (query , filteredIdSets );
213
219
}
214
-
215
- return addIdSetsForVariantInfoFilters (query , filteredIdSets );
216
220
}
217
221
218
222
/**
@@ -260,22 +264,19 @@ private void addIdSetsForRequiredFields(Query query, ArrayList<Set<Integer>> fil
260
264
}
261
265
}
262
266
263
- private void addIdSetsForAnyRecordOf (Query query , ArrayList <Set <Integer >> filteredIdSets ) {
264
- if (!query .getAnyRecordOf ().isEmpty ()) {
265
- Set <Integer > patientsInScope = new ConcurrentSkipListSet <Integer >();
266
- VariantBucketHolder <VariantMasks > bucketCache = new VariantBucketHolder <VariantMasks >();
267
- query .getAnyRecordOf ().parallelStream ().forEach (path ->{
268
- if (patientsInScope .size ()<Math .max (
269
- phenotypeMetaStore .getPatientIds ().size (),
270
- variantService .getPatientIds ().length )) {
271
- if (VariantUtils .pathIsVariantSpec (path )) {
272
- addIdSetsForVariantSpecCategoryFilters (new String []{"0/1" ,"1/1" }, path , patientsInScope , bucketCache );
273
- } else {
274
- patientsInScope .addAll (getCube (path ).keyBasedIndex ());
275
- }
267
+ private void addIdSetsForAnyRecordOf (List <String > anyRecordOfFilters , ArrayList <Set <Integer >> filteredIdSets ) {
268
+ if (!anyRecordOfFilters .isEmpty ()) {
269
+ VariantBucketHolder <VariantMasks > bucketCache = new VariantBucketHolder <>();
270
+ Set <Integer > anyRecordOfPatientSet = anyRecordOfFilters .parallelStream ().flatMap (path -> {
271
+ if (VariantUtils .pathIsVariantSpec (path )) {
272
+ TreeSet <Integer > patientsInScope = new TreeSet <>();
273
+ addIdSetsForVariantSpecCategoryFilters (new String []{"0/1" , "1/1" }, path , patientsInScope , bucketCache );
274
+ return patientsInScope .stream ();
275
+ } else {
276
+ return (Stream <Integer >) getCube (path ).keyBasedIndex ().stream ();
276
277
}
277
- });
278
- filteredIdSets .add (patientsInScope );
278
+ }). collect ( Collectors . toSet ()) ;
279
+ filteredIdSets .add (anyRecordOfPatientSet );
279
280
}
280
281
}
281
282
@@ -289,9 +290,9 @@ private void addIdSetsForNumericFilters(Query query, ArrayList<Set<Integer>> fil
289
290
290
291
private void addIdSetsForCategoryFilters (Query query , ArrayList <Set <Integer >> filteredIdSets ) {
291
292
if (!query .getCategoryFilters ().isEmpty ()) {
292
- VariantBucketHolder <VariantMasks > bucketCache = new VariantBucketHolder <VariantMasks >();
293
- Set <Set <Integer >> idsThatMatchFilters = ( Set < Set < Integer >>) query .getCategoryFilters ().entrySet ().parallelStream ().map (entry ->{
294
- Set <Integer > ids = new TreeSet <Integer >();
293
+ VariantBucketHolder <VariantMasks > bucketCache = new VariantBucketHolder <>();
294
+ Set <Set <Integer >> idsThatMatchFilters = query .getCategoryFilters ().entrySet ().parallelStream ().map (entry ->{
295
+ Set <Integer > ids = new TreeSet <>();
295
296
if (VariantUtils .pathIsVariantSpec (entry .getKey ())) {
296
297
addIdSetsForVariantSpecCategoryFilters (entry .getValue (), entry .getKey (), ids , bucketCache );
297
298
} else {
0 commit comments