public List<Map<String, Object>> execute(String columnNames[]) { List<Map<String, Object>> combinedRowList = null; Set<NoSqlPredicate> inefficientPredicates = new HashSet<NoSqlPredicate>(); for (NoSqlPredicate predicate : predicateList) { if (predicate.canExecuteEfficiently()) { List<Map<String, Object>> rowList = predicate.execute(columnNames); if (combinedRowList != null) { String primaryKeyName = storageSource.getTablePrimaryKeyName(tableName); combinedRowList = combineRowLists(primaryKeyName, combinedRowList, rowList, operator); } else { combinedRowList = rowList; } } else { inefficientPredicates.add(predicate); } } if (inefficientPredicates.isEmpty()) return combinedRowList; List<Map<String, Object>> filteredRowList = new ArrayList<Map<String, Object>>(); for (Map<String, Object> row : combinedRowList) { for (NoSqlPredicate predicate : inefficientPredicates) { if (predicate.matchesRow(row)) { filteredRowList.add(row); } } } return filteredRowList; }
public boolean canExecuteEfficiently() { if (operator == CompoundPredicate.Operator.AND) { for (NoSqlPredicate predicate : predicateList) { if (predicate.canExecuteEfficiently()) { return true; } } return false; } else { for (NoSqlPredicate predicate : predicateList) { if (!predicate.canExecuteEfficiently()) { return false; } } return true; } }
private NoSqlResultSet executeParameterizedQuery( String tableName, String[] columnNameList, IPredicate predicate, RowOrdering rowOrdering, Map<String, Comparable<?>> parameterMap) { NoSqlPredicate noSqlPredicate = convertPredicate(predicate, tableName, parameterMap); List<Map<String, Object>> rowList; if ((noSqlPredicate != null) && noSqlPredicate.canExecuteEfficiently()) { rowList = noSqlPredicate.execute(columnNameList); } else { rowList = new ArrayList<Map<String, Object>>(); Collection<Map<String, Object>> allRowList = getAllRows(tableName, columnNameList); for (Map<String, Object> row : allRowList) { if ((noSqlPredicate == null) || noSqlPredicate.matchesRow(row)) { rowList.add(row); } } } if (rowOrdering != null) Collections.sort(rowList, new RowComparator(rowOrdering)); return new NoSqlResultSet(this, tableName, rowList); }