Added some helper methods and fixed the iterator by adding the correct removal.
Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/859d6bfd Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/859d6bfd Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/859d6bfd Branch: refs/heads/release-2.1.1 Commit: 859d6bfd3c189279fb750eb68502f75ed96d49bc Parents: 1491264 Author: George Reyes <g...@apache.org> Authored: Fri Mar 18 11:13:36 2016 -0700 Committer: George Reyes <g...@apache.org> Committed: Thu Mar 24 09:14:38 2016 -0700 ---------------------------------------------------------------------- .../corepersistence/index/IndexServiceImpl.java | 150 ++++++++++++------- 1 file changed, 100 insertions(+), 50 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/usergrid/blob/859d6bfd/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceImpl.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceImpl.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceImpl.java index 6722dbe..74776ac 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceImpl.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceImpl.java @@ -221,7 +221,6 @@ public class IndexServiceImpl implements IndexService { if(defaultProperties!=null) { final Set<String> finalDefaultProperties = defaultProperties; - //the iterator is based off of this valu Iterator collectionIterator = mapFields.iterator(); //TODO:I think there is a bug when we modify it and continue iterating then it fails @@ -233,19 +232,54 @@ public class IndexServiceImpl implements IndexService { //will only enter the loop for properties that aren't default properties so we only need to check //the properties that the user imposed. if ( !finalDefaultProperties.contains( fieldName ) ) { - innerLoop( fieldsToKeep, mapFields, testedField, fieldName ); + boolean toRemoveFlag = true; + String[] flattedStringArray = getStrings( fieldName ); + + Iterator fieldIterator = fieldsToKeep.iterator(); + + //goes through a loop of all the fields ( excluding default ) that we want to keep. + //if the toRemoveFlag is set to false then we want to keep the property, otherwise we set it to false + while(fieldIterator.hasNext()) { + String requiredInclusionString = ( String ) fieldIterator.next(); + String[] flattedRequirementString = getStrings( requiredInclusionString ); + + + //loop each split array value to see if it matches an equivalent value + //in the field. + for ( int index = 0; index < flattedRequirementString.length;index++){ + //if the array contains a string that it is equals to then set the remove flag to true + //otherwise remain false. + + if(flattedStringArray.length <= index){ + toRemoveFlag = true; + break; + } + //this has a condition issue where if we evaluate that it passes on the first pass, we dont' want to continue the while lo + if(flattedRequirementString[index].equals( flattedStringArray[index] )){ + toRemoveFlag=false; + } + else{ + toRemoveFlag=true; + } + } + if(toRemoveFlag==false){ + break; + } + } + + if(toRemoveFlag){ + collectionIterator.remove(); + //mapFields.remove( testedField ); + } } } } return map; } + - - private void innerLoop( final ArrayList fieldsToKeep, final HashSet mapFields, final EntityField testedField, - final String fieldName ) {//loop through and string split it all and if they still dont' match after that loop then remove them. - boolean toRemoveFlag = true; - String[] flattedStringArray = null; - + private String[] getStrings( final String fieldName ) { + final String[] flattedStringArray; if(!fieldName.contains( "." )){ //create a single array that is made of a the single value. flattedStringArray = new String[]{fieldName}; @@ -253,50 +287,66 @@ public class IndexServiceImpl implements IndexService { else { flattedStringArray= fieldName.split( "\\." ); } + return flattedStringArray; + } - Iterator fieldIterator = fieldsToKeep.iterator(); - - //goes through a loop of all the fields ( excluding default ) that we want to query on - while(fieldIterator.hasNext()) { - String requiredInclusionString = ( String ) fieldIterator.next(); - String[] flattedRequirementString; - - //in the case you only have a filter that is a single field.Otherwise split it. - if(!requiredInclusionString.contains( "." )){ - flattedRequirementString = new String[]{requiredInclusionString}; - } - else { - flattedRequirementString= requiredInclusionString.split( "\\." ); - } - - - //loop each split array value to see if it matches an equivalent value - //in the field. - for ( int index = 0; index < flattedRequirementString.length;index++){ - //if the array contains a string that it is equals to then set the remove flag to true - //otherwise remain false. - - if(flattedStringArray.length <= index){ - toRemoveFlag = true; - break; - } - //this has a condition issue where if we evaluate that it passes on the first pass, we dont' want to continue the while lo - if(flattedRequirementString[index].equals( flattedStringArray[index] )){ - toRemoveFlag=false; - } - else{ - toRemoveFlag=true; - } - } - if(toRemoveFlag==false){ - break; - } - } - if(toRemoveFlag){ - mapFields.remove( testedField ); - } - } + // private void innerLoop( final ArrayList fieldsToKeep, final HashSet mapFields, final EntityField testedField, +// final String fieldName ) {//loop through and string split it all and if they still dont' match after that loop then remove them. +// boolean toRemoveFlag = true; +// String[] flattedStringArray = null; +// +// if(!fieldName.contains( "." )){ +// //create a single array that is made of a the single value. +// flattedStringArray = new String[]{fieldName}; +// } +// else { +// flattedStringArray= fieldName.split( "\\." ); +// } +// +// Iterator fieldIterator = fieldsToKeep.iterator(); +// +// //goes through a loop of all the fields ( excluding default ) that we want to query on +// while(fieldIterator.hasNext()) { +// String requiredInclusionString = ( String ) fieldIterator.next(); +// String[] flattedRequirementString; +// +// //in the case you only have a filter that is a single field.Otherwise split it. +// if(!requiredInclusionString.contains( "." )){ +// flattedRequirementString = new String[]{requiredInclusionString}; +// } +// else { +// flattedRequirementString= requiredInclusionString.split( "\\." ); +// } +// +// +// //loop each split array value to see if it matches an equivalent value +// //in the field. +// for ( int index = 0; index < flattedRequirementString.length;index++){ +// //if the array contains a string that it is equals to then set the remove flag to true +// //otherwise remain false. +// +// if(flattedStringArray.length <= index){ +// toRemoveFlag = true; +// break; +// } +// //this has a condition issue where if we evaluate that it passes on the first pass, we dont' want to continue the while lo +// if(flattedRequirementString[index].equals( flattedStringArray[index] )){ +// toRemoveFlag=false; +// } +// else{ +// toRemoveFlag=true; +// } +// } +// if(toRemoveFlag==false){ +// break; +// } +// } +// +// if(toRemoveFlag){ +// mapFields.remove( testedField ); +// } +// } //Steps to delete an IndexEdge.