private List < IndexSearchDescriptor > commonFactor ( List < IndexSearchDescriptor > indexSearchDescriptors ) { //index, key condition, additional filter (to aggregate in OR) Map < OIndex , Map < IndexCondPair , OOrBlock > > aggregation = new HashMap <> ( ) ; for ( IndexSearchDescriptor item : indexSearchDescriptors ) { Map < IndexCondPair , OOrBlock > filtersForIndex = aggregation . get ( item . idx ) ; if ( filtersForIndex == null ) { filtersForIndex = new HashMap <> ( ) ; aggregation . put ( item . idx , filtersForIndex ) ; } IndexCondPair extendedCond = new IndexCondPair ( item . keyCondition , item . additionalRangeCondition ) ; OOrBlock existingAdditionalConditions = filtersForIndex . get ( extendedCond ) ; if ( existingAdditionalConditions == null ) { existingAdditionalConditions = new OOrBlock ( - 1 ) ; filtersForIndex . put ( extendedCond , existingAdditionalConditions ) ; } existingAdditionalConditions . getSubBlocks ( ) . add ( item . remainingCondition ) ; } List < IndexSearchDescriptor > result = new ArrayList <> ( ) ; for ( Map . Entry < OIndex , Map < IndexCondPair , OOrBlock > > item : aggregation . entrySet ( ) ) { for ( Map . Entry < IndexCondPair , OOrBlock > filters : item . getValue ( ) . entrySet ( ) ) { result . add ( new IndexSearchDescriptor ( item . getKey ( ) , filters . getKey ( ) . mainCondition , filters . getKey ( ) . additionalRange , filters . getValue ( ) ) ) ; } } return result ; }
aggregates multiple index conditions that refer to the same key search