From 1ac4825d1bc6414a37180604788f297ad3415bfb Mon Sep 17 00:00:00 2001 From: uujava Date: Fri, 18 Nov 2016 17:44:20 +0300 Subject: [PATCH 1/5] unique query performance improvement --- .../cqengine/ConcurrentIndexedCollection.java | 11 +++++++---- .../engine/CollectionQueryEngine.java | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java b/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java index 8a8d381f5..df3a554dc 100644 --- a/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java +++ b/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java @@ -68,7 +68,7 @@ public class ConcurrentIndexedCollection implements IndexedCollection { protected final Persistence persistence; protected final ObjectStore objectStore; protected final QueryEngineInternal indexEngine; - + protected final QueryOptions defaultOptions; /** * Creates a new {@link ConcurrentIndexedCollection} with default settings, using {@link OnHeapPersistence}. */ @@ -86,6 +86,9 @@ public ConcurrentIndexedCollection() { */ public ConcurrentIndexedCollection(Persistence persistence) { this.persistence = persistence; + this.defaultOptions = new QueryOptions(); + this.defaultOptions.put(Persistence.class, persistence); + FlagsEnabled.forQueryOptions(this.defaultOptions).add(PersistenceFlags.READ_REQUEST); this.objectStore = persistence.createObjectStore(); QueryEngineInternal queryEngine = new CollectionQueryEngine(); QueryOptions queryOptions = openRequestScopeResourcesIfNecessary(null); @@ -106,7 +109,6 @@ public ConcurrentIndexedCollection(Persistence persiste @Override public ResultSet retrieve(Query query) { final QueryOptions queryOptions = openRequestScopeResourcesIfNecessary(null); - flagAsReadRequest(queryOptions); ResultSet results = indexEngine.retrieve(query, queryOptions); return new CloseableResultSet(results, query, queryOptions) { @Override @@ -487,12 +489,13 @@ boolean doRemoveAll(Iterable objects, QueryOptions queryOptions) { protected QueryOptions openRequestScopeResourcesIfNecessary(QueryOptions queryOptions) { if (queryOptions == null) { - queryOptions = new QueryOptions(); + queryOptions = defaultOptions; + } else { + queryOptions.put(Persistence.class, persistence); } if (!(persistence instanceof OnHeapPersistence)) { persistence.openRequestScopeResources(queryOptions); } - queryOptions.put(Persistence.class, persistence); return queryOptions; } diff --git a/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java b/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java index efdb8ed07..dcf3c2d02 100644 --- a/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java +++ b/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java @@ -28,6 +28,7 @@ import com.googlecode.cqengine.index.compound.support.CompoundQuery; import com.googlecode.cqengine.index.fallback.FallbackIndex; import com.googlecode.cqengine.index.standingquery.StandingQueryIndex; +import com.googlecode.cqengine.index.unique.UniqueIndex; import com.googlecode.cqengine.persistence.Persistence; import com.googlecode.cqengine.persistence.support.ObjectSet; import com.googlecode.cqengine.persistence.support.ObjectStore; @@ -86,6 +87,7 @@ public class CollectionQueryEngine implements QueryEngineInternal { // Map of attributes to set of indexes on that attribute... private final ConcurrentMap, Set>> attributeIndexes = new ConcurrentHashMap, Set>>(); + private final ConcurrentMap, Index> uniqueIndexes = new ConcurrentHashMap, Index>(); // Map of CompoundAttributes to compound index on that compound attribute... private final ConcurrentMap, CompoundIndex> compoundIndexes = new ConcurrentHashMap, CompoundIndex>(); // Map of queries to standing query index on that query... @@ -174,6 +176,9 @@ void addAttributeIndex(AttributeIndex attributeIndex, QueryOptions que if (indexesOnThisAttribute == null) { indexesOnThisAttribute = Collections.newSetFromMap(new ConcurrentHashMap, Boolean>()); attributeIndexes.put(attribute, indexesOnThisAttribute); + if(attributeIndex instanceof UniqueIndex) { + uniqueIndexes.put(attribute, attributeIndex); + } } if (attributeIndex instanceof SimplifiedSQLiteIndex) { // Ensure there is not already an identity index added for this attribute... @@ -299,6 +304,13 @@ public QueryOptions getQueryOptions() { * @return A {@link ResultSet} from the index with the lowest retrieval cost which supports the given query */ ResultSet getResultSetWithLowestRetrievalCost(SimpleQuery query, QueryOptions queryOptions) { + if(query instanceof Equal || query instanceof In) { + Index unique = uniqueIndexes.get(query.getAttribute()); + // unique indices definitely has better cost + if(unique!= null){ + return unique.retrieve(query, queryOptions); + } + } Iterable> indexesOnAttribute = getIndexesOnAttribute(query.getAttribute()); // Choose the index with the lowest retrieval cost for this query... @@ -332,6 +344,13 @@ ResultSet getResultSetWithLowestRetrievalCost(SimpleQuery query, Qu // to the #retrieveRecursive() method. @Override public ResultSet retrieve(final Query query, final QueryOptions queryOptions) { + + if (query instanceof Equal || query instanceof In) { + Index index = uniqueIndexes.get(((SimpleQuery) query).getAttribute()); + if (index != null) { + return index.retrieve(query, queryOptions); + } + } @SuppressWarnings("unchecked") OrderByOption orderByOption = (OrderByOption) queryOptions.get(OrderByOption.class); From fac5e0e7fe2b537b747bcc544e8da8a1d38a81b8 Mon Sep 17 00:00:00 2001 From: uujava Date: Fri, 18 Nov 2016 23:32:00 +0300 Subject: [PATCH 2/5] reverted defaultQueryOption feature as it cause memory leaks --- .../cqengine/ConcurrentIndexedCollection.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java b/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java index df3a554dc..8a8d381f5 100644 --- a/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java +++ b/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java @@ -68,7 +68,7 @@ public class ConcurrentIndexedCollection implements IndexedCollection { protected final Persistence persistence; protected final ObjectStore objectStore; protected final QueryEngineInternal indexEngine; - protected final QueryOptions defaultOptions; + /** * Creates a new {@link ConcurrentIndexedCollection} with default settings, using {@link OnHeapPersistence}. */ @@ -86,9 +86,6 @@ public ConcurrentIndexedCollection() { */ public ConcurrentIndexedCollection(Persistence persistence) { this.persistence = persistence; - this.defaultOptions = new QueryOptions(); - this.defaultOptions.put(Persistence.class, persistence); - FlagsEnabled.forQueryOptions(this.defaultOptions).add(PersistenceFlags.READ_REQUEST); this.objectStore = persistence.createObjectStore(); QueryEngineInternal queryEngine = new CollectionQueryEngine(); QueryOptions queryOptions = openRequestScopeResourcesIfNecessary(null); @@ -109,6 +106,7 @@ public ConcurrentIndexedCollection(Persistence persiste @Override public ResultSet retrieve(Query query) { final QueryOptions queryOptions = openRequestScopeResourcesIfNecessary(null); + flagAsReadRequest(queryOptions); ResultSet results = indexEngine.retrieve(query, queryOptions); return new CloseableResultSet(results, query, queryOptions) { @Override @@ -489,13 +487,12 @@ boolean doRemoveAll(Iterable objects, QueryOptions queryOptions) { protected QueryOptions openRequestScopeResourcesIfNecessary(QueryOptions queryOptions) { if (queryOptions == null) { - queryOptions = defaultOptions; - } else { - queryOptions.put(Persistence.class, persistence); + queryOptions = new QueryOptions(); } if (!(persistence instanceof OnHeapPersistence)) { persistence.openRequestScopeResources(queryOptions); } + queryOptions.put(Persistence.class, persistence); return queryOptions; } From 4131729358116702679fb4fe72a57c3e886adda6 Mon Sep 17 00:00:00 2001 From: uujava Date: Sat, 19 Nov 2016 23:16:57 +0300 Subject: [PATCH 3/5] improvement for https://github.com/npgall/cqengine/issues/106#issuecomment-261735591 --- .../googlecode/cqengine/ConcurrentIndexedCollection.java | 9 +++++++-- .../cqengine/engine/CollectionQueryEngine.java | 9 ++++----- .../googlecode/cqengine/query/option/QueryOptions.java | 6 ++++++ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java b/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java index 8a8d381f5..2d1b7af2c 100644 --- a/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java +++ b/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java @@ -492,7 +492,9 @@ protected QueryOptions openRequestScopeResourcesIfNecessary(QueryOptions queryOp if (!(persistence instanceof OnHeapPersistence)) { persistence.openRequestScopeResources(queryOptions); } - queryOptions.put(Persistence.class, persistence); + if(!queryOptions.contains(Persistence.class)) { + queryOptions.put(Persistence.class, persistence); + } return queryOptions; } @@ -554,6 +556,9 @@ public String toString() { * @param queryOptions The query options for the request */ protected static void flagAsReadRequest(QueryOptions queryOptions) { - FlagsEnabled.forQueryOptions(queryOptions).add(PersistenceFlags.READ_REQUEST); + FlagsEnabled flagsEnabled = FlagsEnabled.forQueryOptions(queryOptions); + if(!flagsEnabled.isFlagEnabled(PersistenceFlags.READ_REQUEST)) { + flagsEnabled.add(PersistenceFlags.READ_REQUEST); + } } } diff --git a/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java b/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java index dcf3c2d02..81106ce02 100644 --- a/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java +++ b/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java @@ -344,11 +344,10 @@ ResultSet getResultSetWithLowestRetrievalCost(SimpleQuery query, Qu // to the #retrieveRecursive() method. @Override public ResultSet retrieve(final Query query, final QueryOptions queryOptions) { - - if (query instanceof Equal || query instanceof In) { - Index index = uniqueIndexes.get(((SimpleQuery) query).getAttribute()); - if (index != null) { - return index.retrieve(query, queryOptions); + if(query instanceof Equal) { + Index uniqueIndex = uniqueIndexes.get(((Equal)query).getAttribute()); + if (uniqueIndex != null && uniqueIndex.supportsQuery(query, queryOptions)) { + return uniqueIndex.retrieve(query, queryOptions); } } @SuppressWarnings("unchecked") diff --git a/code/src/main/java/com/googlecode/cqengine/query/option/QueryOptions.java b/code/src/main/java/com/googlecode/cqengine/query/option/QueryOptions.java index 314dfbaca..c7b45fc98 100644 --- a/code/src/main/java/com/googlecode/cqengine/query/option/QueryOptions.java +++ b/code/src/main/java/com/googlecode/cqengine/query/option/QueryOptions.java @@ -15,6 +15,8 @@ */ package com.googlecode.cqengine.query.option; +import com.googlecode.cqengine.persistence.Persistence; + import java.util.HashMap; import java.util.Map; @@ -82,4 +84,8 @@ public boolean equals(Object o) { public int hashCode() { return options.hashCode(); } + + public boolean contains(Object key) { + return options.containsKey(key); + } } From 213b198f48c198f92d12dfedccff6f9d85dabb52 Mon Sep 17 00:00:00 2001 From: vkozyr Date: Mon, 21 Nov 2016 16:40:14 +0300 Subject: [PATCH 4/5] Merge branch 'master' into feature_unique_and_equals_performance Conflicts: code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java --- .../cqengine/engine/CollectionQueryEngine.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java b/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java index cf90e2212..76eaa12b1 100644 --- a/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java +++ b/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java @@ -176,9 +176,6 @@ void addAttributeIndex(AttributeIndex attributeIndex, QueryOptions que if (indexesOnThisAttribute == null) { indexesOnThisAttribute = Collections.newSetFromMap(new ConcurrentHashMap, Boolean>()); attributeIndexes.put(attribute, indexesOnThisAttribute); - if(attributeIndex instanceof UniqueIndex) { - uniqueIndexes.put(attribute, attributeIndex); - } } if (attributeIndex instanceof SimplifiedSQLiteIndex) { // Ensure there is not already an identity index added for this attribute... @@ -308,6 +305,13 @@ public QueryOptions getQueryOptions() { * @return A {@link ResultSet} from the index with the lowest retrieval cost which supports the given query */ ResultSet getResultSetWithLowestRetrievalCost(SimpleQuery query, QueryOptions queryOptions) { + // First check if a UniqueIndex is available, as this will have the lowest cost... + Index uniqueIndex = uniqueIndexes.get(query.getAttribute()); + if (uniqueIndex!= null && uniqueIndex.supportsQuery(query, queryOptions)){ + return uniqueIndex.retrieve(query, queryOptions); + } + + // Examine other (non-unique) indexes... Iterable> indexesOnAttribute = getIndexesOnAttribute(query.getAttribute()); // Choose the index with the lowest retrieval cost for this query... From 25c0da3900d0a496d57c3176cfaa6824ae0d31b5 Mon Sep 17 00:00:00 2001 From: vkozyr Date: Mon, 21 Nov 2016 16:44:28 +0300 Subject: [PATCH 5/5] QueryOptions and FlagsEnabled reworked to store know options as properties. --- .../cqengine/ConcurrentIndexedCollection.java | 10 +- .../TransactionalIndexedCollection.java | 8 +- .../engine/CollectionQueryEngine.java | 30 +- .../cqengine/index/sqlite/SQLiteIndex.java | 11 +- .../index/sqlite/SimplifiedSQLiteIndex.java | 4 +- .../sqlite/support/SQLiteIndexFlags.java | 15 - .../support/CloseableRequestResources.java | 6 +- .../cqengine/index/support/PartialIndex.java | 2 +- .../composite/CompositePersistence.java | 6 +- .../persistence/disk/DiskPersistence.java | 6 +- .../offheap/OffHeapPersistence.java | 10 +- .../persistence/support/PersistenceFlags.java | 24 -- .../cqengine/query/QueryFactory.java | 4 +- .../option/ArgumentValidationOption.java | 2 +- .../query/option/DeduplicationOption.java | 4 +- .../cqengine/query/option/EngineFlags.java | 30 +- .../cqengine/query/option/FlagsDisabled.java | 6 +- .../cqengine/query/option/FlagsEnabled.java | 60 +++- .../query/option/IsolationOption.java | 2 +- .../cqengine/query/option/QueryOptions.java | 315 +++++++++++++++++- .../cqengine/query/option/Thresholds.java | 2 +- .../IndexedCollectionFunctionalTest.java | 8 +- .../TransactionalIndexedCollectionTest.java | 5 +- .../engine/CollectionQueryEngineTest.java | 4 +- .../index/sqlite/PartialSQLiteIndexTest.java | 2 +- .../index/sqlite/SQLiteIndexTest.java | 4 +- .../PersistenceIndexingBenchmark.java | 3 +- .../cqengine/query/QueryFactoryTest.java | 4 +- .../query/option/FlagsEnabledTest.java | 8 +- 29 files changed, 445 insertions(+), 150 deletions(-) delete mode 100644 code/src/main/java/com/googlecode/cqengine/persistence/support/PersistenceFlags.java diff --git a/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java b/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java index 2d1b7af2c..34e82739b 100644 --- a/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java +++ b/code/src/main/java/com/googlecode/cqengine/ConcurrentIndexedCollection.java @@ -25,8 +25,8 @@ import com.googlecode.cqengine.persistence.support.ObjectSet; import com.googlecode.cqengine.persistence.support.ObjectStore; import com.googlecode.cqengine.persistence.support.ObjectStoreAsSet; -import com.googlecode.cqengine.persistence.support.PersistenceFlags; import com.googlecode.cqengine.query.Query; +import com.googlecode.cqengine.query.option.EngineFlags; import com.googlecode.cqengine.query.option.FlagsEnabled; import com.googlecode.cqengine.query.option.QueryOptions; import com.googlecode.cqengine.resultset.ResultSet; @@ -492,9 +492,7 @@ protected QueryOptions openRequestScopeResourcesIfNecessary(QueryOptions queryOp if (!(persistence instanceof OnHeapPersistence)) { persistence.openRequestScopeResources(queryOptions); } - if(!queryOptions.contains(Persistence.class)) { - queryOptions.put(Persistence.class, persistence); - } + queryOptions.setPersistence(persistence); return queryOptions; } @@ -557,8 +555,6 @@ public String toString() { */ protected static void flagAsReadRequest(QueryOptions queryOptions) { FlagsEnabled flagsEnabled = FlagsEnabled.forQueryOptions(queryOptions); - if(!flagsEnabled.isFlagEnabled(PersistenceFlags.READ_REQUEST)) { - flagsEnabled.add(PersistenceFlags.READ_REQUEST); - } + flagsEnabled.add(EngineFlags.READ_REQUEST); } } diff --git a/code/src/main/java/com/googlecode/cqengine/TransactionalIndexedCollection.java b/code/src/main/java/com/googlecode/cqengine/TransactionalIndexedCollection.java index 09016e7d6..b3b9763db 100644 --- a/code/src/main/java/com/googlecode/cqengine/TransactionalIndexedCollection.java +++ b/code/src/main/java/com/googlecode/cqengine/TransactionalIndexedCollection.java @@ -20,6 +20,7 @@ import com.googlecode.cqengine.persistence.support.ObjectStore; import com.googlecode.cqengine.query.Query; import com.googlecode.cqengine.query.option.ArgumentValidationOption; +import com.googlecode.cqengine.query.option.EngineFlags; import com.googlecode.cqengine.query.option.FlagsEnabled; import com.googlecode.cqengine.query.option.QueryOptions; import com.googlecode.cqengine.resultset.ResultSet; @@ -93,11 +94,6 @@ */ public class TransactionalIndexedCollection extends ConcurrentIndexedCollection { - /** - * A query option flag which can be supplied to the update method to control the replacement behaviour. - */ - public static final String STRICT_REPLACEMENT = "STRICT_REPLACEMENT"; - final Class objectType; volatile Version currentVersion; final Object writeMutex = new Object(); @@ -239,7 +235,7 @@ public boolean update(final Iterable objectsToRemove, final Iterable objec if (!objectsToRemoveIterator.hasNext() && !objectsToAddIterator.hasNext()) { return false; } - if (FlagsEnabled.isFlagEnabled(queryOptions, STRICT_REPLACEMENT)) { + if (FlagsEnabled.isFlagEnabled(queryOptions, EngineFlags.STRICT_REPLACEMENT)) { if (!objectStoreContainsAllIterable(objectStore, objectsToRemove, queryOptions)) { return false; } diff --git a/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java b/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java index 76eaa12b1..3465366b4 100644 --- a/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java +++ b/code/src/main/java/com/googlecode/cqengine/engine/CollectionQueryEngine.java @@ -117,8 +117,8 @@ public void init(final ObjectStore objectStore, final QueryOptions queryOptio forEachIndexDo(new IndexOperation() { @Override public boolean perform(Index index) { - queryOptions.put(QueryEngine.class, this); - queryOptions.put(Persistence.class, persistence); + queryOptions.setQueryEngine(CollectionQueryEngine.this); + queryOptions.setPersistence(persistence); index.init(objectStore, queryOptions); return true; } @@ -193,8 +193,8 @@ void addAttributeIndex(AttributeIndex attributeIndex, QueryOptions que // We put UniqueIndexes in a separate map too, to access directly... uniqueIndexes.put(attribute, attributeIndex); } - queryOptions.put(QueryEngine.class, this); - queryOptions.put(Persistence.class, persistence); + queryOptions.setQueryEngine(this); + queryOptions.setPersistence(persistence); attributeIndex.init(objectStore, queryOptions); } @@ -210,8 +210,8 @@ void addStandingQueryIndex(Index standingQueryIndex, Query standingQuery, if (existingIndex != null) { throw new IllegalStateException("An index has already been added for standing query: " + standingQuery); } - queryOptions.put(QueryEngine.class, this); - queryOptions.put(Persistence.class, persistence); + queryOptions.setQueryEngine(this); + queryOptions.setPersistence(persistence); standingQueryIndex.init(objectStore, queryOptions); } @@ -225,8 +225,8 @@ void addCompoundIndex(CompoundIndex compoundIndex, CompoundAttribute compo if (existingIndex != null) { throw new IllegalStateException("An index has already been added for compound attribute: " + compoundAttribute); } - queryOptions.put(QueryEngine.class, this); - queryOptions.put(Persistence.class, persistence); + queryOptions.setQueryEngine(this); + queryOptions.setPersistence(persistence); compoundIndex.init(objectStore, queryOptions); } @@ -352,15 +352,15 @@ public ResultSet retrieve(final Query query, final QueryOptions queryOptio } } @SuppressWarnings("unchecked") - OrderByOption orderByOption = (OrderByOption) queryOptions.get(OrderByOption.class); + OrderByOption orderByOption = (OrderByOption) queryOptions.getOrderByOption(); // Store the root query in the queryOptions, so that when retrieveRecursive() examines child branches, that // both the branch query and the root query will be available to PartialIndexes so they may determine if they // can be used to accelerate the overall query... - queryOptions.put(ROOT_QUERY, query); + queryOptions.setRootQuery(query); // Log decisions made to the query log, if provided... - final QueryLog queryLog = queryOptions.get(QueryLog.class); // might be null + final QueryLog queryLog = queryOptions.getQueryLog(); // might be null SortedKeyStatisticsAttributeIndex indexForOrdering = null; if (orderByOption != null) { @@ -756,7 +756,7 @@ public boolean isValid(O object, QueryOptions queryOptions) { static > Persistence getPersistenceFromQueryOptions(QueryOptions queryOptions) { @SuppressWarnings("unchecked") - Persistence persistence = (Persistence) queryOptions.get(Persistence.class); + Persistence persistence = (Persistence) queryOptions.getPersistence(); if (persistence == null) { throw new IllegalStateException("A required Persistence object was not supplied in query options"); } @@ -965,11 +965,15 @@ else if (query instanceof Or) { // The Or query is disjoint, so there is no need to perform deduplication on its results. // Wrap the QueryOptions object in another which omits the DeduplicationOption if it is requested // when evaluating this Or statement... - queryOptionsForOrUnion = new QueryOptions(queryOptions.getOptions()) { + queryOptionsForOrUnion = new QueryOptions(queryOptions) { @Override public Object get(Object key) { return DeduplicationOption.class.equals(key) ? null : super.get(key); } + @Override + public DeduplicationOption getDeduplicationOption() { + return null; + } }; } else { diff --git a/code/src/main/java/com/googlecode/cqengine/index/sqlite/SQLiteIndex.java b/code/src/main/java/com/googlecode/cqengine/index/sqlite/SQLiteIndex.java index 1fc3a6f9c..54a1400d1 100644 --- a/code/src/main/java/com/googlecode/cqengine/index/sqlite/SQLiteIndex.java +++ b/code/src/main/java/com/googlecode/cqengine/index/sqlite/SQLiteIndex.java @@ -32,6 +32,7 @@ import com.googlecode.cqengine.persistence.support.ObjectSet; import com.googlecode.cqengine.persistence.support.ObjectStore; import com.googlecode.cqengine.query.Query; +import com.googlecode.cqengine.query.option.EngineFlags; import com.googlecode.cqengine.query.option.FlagsEnabled; import com.googlecode.cqengine.query.option.QueryOptions; import com.googlecode.cqengine.query.simple.*; @@ -413,7 +414,7 @@ public QueryOptions getQueryOptions() { * {@inheritDoc} *

* Note objects can be imported into this index rapidly via this method, - * by setting flag {@link SQLiteIndexFlags#BULK_IMPORT}. See documentation on that flag for details and caveats. + * by setting flag {@link EngineFlags#BULK_IMPORT}. See documentation on that flag for details and caveats. */ @Override public boolean addAll(final ObjectSet objectSet, final QueryOptions queryOptions) { @@ -430,8 +431,8 @@ public boolean addAll(final ObjectSet objectSet, final QueryOptions queryOpti // Handle the SQLite indexes on the table final BulkImportExternallyManged bulkImportExternallyManged = queryOptions.get(BulkImportExternallyManged.class); - final boolean isBulkImport = bulkImportExternallyManged == null && FlagsEnabled.isFlagEnabled(queryOptions, SQLiteIndexFlags.BULK_IMPORT); - final boolean isSuspendSyncAndJournaling = FlagsEnabled.isFlagEnabled(queryOptions, SQLiteIndexFlags.BULK_IMPORT_SUSPEND_SYNC_AND_JOURNALING); + final boolean isBulkImport = bulkImportExternallyManged == null && FlagsEnabled.isFlagEnabled(queryOptions, EngineFlags.BULK_IMPORT); + final boolean isSuspendSyncAndJournaling = FlagsEnabled.isFlagEnabled(queryOptions, EngineFlags.BULK_IMPORT_SUSPEND_SYNC_AND_JOURNALING); if ((bulkImportExternallyManged != null || isBulkImport) && !objectSet.isEmpty()) { // Drop the SQLite index temporarily (if any) to speed up bulk import... DBQueries.dropIndexOnTable(tableName, connection); @@ -537,7 +538,7 @@ public boolean removeAll(final ObjectSet objectSet, final QueryOptions queryO } final Connection connection = connectionManager.getConnection(this, queryOptions); - final boolean isBulkImport = queryOptions.get(BulkImportExternallyManged.class) != null || FlagsEnabled.isFlagEnabled(queryOptions, SQLiteIndexFlags.BULK_IMPORT); + final boolean isBulkImport = queryOptions.get(BulkImportExternallyManged.class) != null || FlagsEnabled.isFlagEnabled(queryOptions, EngineFlags.BULK_IMPORT); if (isBulkImport) { // It's a bulk import, avoid creating the index on the SQLite table... DBQueries.createIndexTable(tableName, primaryKeyAttribute.getAttributeType(), getAttribute().getAttributeType(), connection); @@ -637,7 +638,7 @@ void createTableIndexIfNeeded(final Connection connection){ * @throws IllegalStateException if the ConnectionManager is not found. */ ConnectionManager getConnectionManager(final QueryOptions queryOptions){ - ConnectionManager connectionManager = queryOptions.get(ConnectionManager.class); + ConnectionManager connectionManager = queryOptions.getConnectionManager(); if (connectionManager == null) throw new IllegalStateException("A ConnectionManager is required but was not provided in the QueryOptions."); return connectionManager; diff --git a/code/src/main/java/com/googlecode/cqengine/index/sqlite/SimplifiedSQLiteIndex.java b/code/src/main/java/com/googlecode/cqengine/index/sqlite/SimplifiedSQLiteIndex.java index e5b7e88d5..3141600eb 100644 --- a/code/src/main/java/com/googlecode/cqengine/index/sqlite/SimplifiedSQLiteIndex.java +++ b/code/src/main/java/com/googlecode/cqengine/index/sqlite/SimplifiedSQLiteIndex.java @@ -81,7 +81,7 @@ public Index getEffectiveIndex() { static > Persistence getPersistenceFromQueryOptions(QueryOptions queryOptions) { @SuppressWarnings("unchecked") - Persistence persistence = (Persistence) queryOptions.get(Persistence.class); + Persistence persistence = (Persistence) queryOptions.getPersistence(); if (persistence == null) { throw new IllegalStateException("A required Persistence object was not supplied in query options"); } @@ -90,7 +90,7 @@ static > Persistence getPersistenceFromQueryOpt static QueryEngine getQueryEngineFromQueryOptions(QueryOptions queryOptions) { @SuppressWarnings("unchecked") - QueryEngine queryEngine = (QueryEngine) queryOptions.get(QueryEngine.class); + QueryEngine queryEngine = (QueryEngine) queryOptions.getQueryEngine(); if (queryEngine == null) { throw new IllegalStateException("The QueryEngine was not supplied in query options"); } diff --git a/code/src/main/java/com/googlecode/cqengine/index/sqlite/support/SQLiteIndexFlags.java b/code/src/main/java/com/googlecode/cqengine/index/sqlite/support/SQLiteIndexFlags.java index 99146a5c6..8678b0473 100644 --- a/code/src/main/java/com/googlecode/cqengine/index/sqlite/support/SQLiteIndexFlags.java +++ b/code/src/main/java/com/googlecode/cqengine/index/sqlite/support/SQLiteIndexFlags.java @@ -25,14 +25,6 @@ */ public class SQLiteIndexFlags { - /** - * A flag which if enabled causes the SQLiteIndex to temporarily drop the index on a table prior to adding objects, - * then to restore the index after objects have been added. - *

- * This should not be used if other concurrent operations might also be ongoing on the collection. It is intended - * for use when the collection is first being populated or similar, such as at application startup. - */ - public static String BULK_IMPORT = "BULK_IMPORT"; /** *

A 2-values flag that enables externally managed bulk import and specifies it's status. @@ -49,11 +41,4 @@ public enum BulkImportExternallyManged { LAST; }; - /** - *

Switches off the 'synchronous' and 'journal_mode' pragmas before executing a bulk import. - * Executing a bulk import with 'synchronous' and 'journal_mode' OFF can significantly increase the performances of the operation - * at a cost of a slightly higher risk of database corruption in case of system crashes or the power loses. - *

The default values will be re-instated after the import. - */ - public static String BULK_IMPORT_SUSPEND_SYNC_AND_JOURNALING = "BULK_IMPORT_SUSPEND_SYNC_AND_JOURNALING"; } diff --git a/code/src/main/java/com/googlecode/cqengine/index/support/CloseableRequestResources.java b/code/src/main/java/com/googlecode/cqengine/index/support/CloseableRequestResources.java index 02df297dc..d073d98ff 100644 --- a/code/src/main/java/com/googlecode/cqengine/index/support/CloseableRequestResources.java +++ b/code/src/main/java/com/googlecode/cqengine/index/support/CloseableRequestResources.java @@ -71,10 +71,10 @@ public void close() { * @return The existing QueryOptions's CloseableRequestResources or a new instance. */ public static CloseableRequestResources forQueryOptions(final QueryOptions queryOptions) { - CloseableRequestResources closeableRequestResources = queryOptions.get(CloseableRequestResources.class); + CloseableRequestResources closeableRequestResources = queryOptions.getCloseableRequestResources(); if (closeableRequestResources == null) { closeableRequestResources = new CloseableRequestResources(); - queryOptions.put(CloseableRequestResources.class, closeableRequestResources); + queryOptions.setCloseableRequestResources(closeableRequestResources); } return closeableRequestResources; } @@ -86,7 +86,7 @@ public static CloseableRequestResources forQueryOptions(final QueryOptions query * @param queryOptions The {@link QueryOptions} */ public static void closeForQueryOptions(QueryOptions queryOptions) { - closeQuietly(queryOptions.get(CloseableRequestResources.class)); + closeQuietly(queryOptions.getCloseableRequestResources()); } public static void closeQuietly(Closeable closeable) { diff --git a/code/src/main/java/com/googlecode/cqengine/index/support/PartialIndex.java b/code/src/main/java/com/googlecode/cqengine/index/support/PartialIndex.java index daf38ea43..16314fe7f 100644 --- a/code/src/main/java/com/googlecode/cqengine/index/support/PartialIndex.java +++ b/code/src/main/java/com/googlecode/cqengine/index/support/PartialIndex.java @@ -138,7 +138,7 @@ public AttributeIndex getBackingIndex() { public boolean supportsQuery(Query query, QueryOptions queryOptions) { // Extract the root query from the query options, and check if it contains the filter query... @SuppressWarnings("unchecked") - Query rootQuery = (Query) queryOptions.get(CollectionQueryEngine.ROOT_QUERY); + Query rootQuery = (Query) queryOptions.getRootQuery(); return supportsQueryInternal(backingIndex(), filterQuery, rootQuery, query, queryOptions); } diff --git a/code/src/main/java/com/googlecode/cqengine/persistence/composite/CompositePersistence.java b/code/src/main/java/com/googlecode/cqengine/persistence/composite/CompositePersistence.java index 10d755fc2..ae8823e9e 100644 --- a/code/src/main/java/com/googlecode/cqengine/persistence/composite/CompositePersistence.java +++ b/code/src/main/java/com/googlecode/cqengine/persistence/composite/CompositePersistence.java @@ -173,8 +173,8 @@ else if (!primaryKeyAttribute.equals(persistence.getPrimaryKeyAttribute())) { */ @Override public void openRequestScopeResources(QueryOptions queryOptions) { - if (queryOptions.get(ConnectionManager.class) == null) { - queryOptions.put(ConnectionManager.class, new RequestScopeConnectionManager(this)); + if (queryOptions.getConnectionManager() == null) { + queryOptions.setConnectionManager(new RequestScopeConnectionManager(this)); } } @@ -186,7 +186,7 @@ public void openRequestScopeResources(QueryOptions queryOptions) { */ @Override public void closeRequestScopeResources(QueryOptions queryOptions) { - ConnectionManager connectionManager = queryOptions.get(ConnectionManager.class); + ConnectionManager connectionManager = queryOptions.getConnectionManager(); if (connectionManager instanceof RequestScopeConnectionManager) { ((RequestScopeConnectionManager) connectionManager).close(); queryOptions.remove(ConnectionManager.class); diff --git a/code/src/main/java/com/googlecode/cqengine/persistence/disk/DiskPersistence.java b/code/src/main/java/com/googlecode/cqengine/persistence/disk/DiskPersistence.java index 6fe029b50..a69ecb6e8 100644 --- a/code/src/main/java/com/googlecode/cqengine/persistence/disk/DiskPersistence.java +++ b/code/src/main/java/com/googlecode/cqengine/persistence/disk/DiskPersistence.java @@ -190,8 +190,8 @@ public SQLiteDiskIdentityIndex createIdentityIndex() { */ @Override public void openRequestScopeResources(QueryOptions queryOptions) { - if (queryOptions.get(ConnectionManager.class) == null) { - queryOptions.put(ConnectionManager.class, new RequestScopeConnectionManager(this)); + if (queryOptions.getConnectionManager() == null) { + queryOptions.setConnectionManager(new RequestScopeConnectionManager(this)); } } @@ -203,7 +203,7 @@ public void openRequestScopeResources(QueryOptions queryOptions) { */ @Override public void closeRequestScopeResources(QueryOptions queryOptions) { - ConnectionManager connectionManager = queryOptions.get(ConnectionManager.class); + ConnectionManager connectionManager = queryOptions.getConnectionManager(); if (connectionManager instanceof RequestScopeConnectionManager) { ((RequestScopeConnectionManager) connectionManager).close(); queryOptions.remove(ConnectionManager.class); diff --git a/code/src/main/java/com/googlecode/cqengine/persistence/offheap/OffHeapPersistence.java b/code/src/main/java/com/googlecode/cqengine/persistence/offheap/OffHeapPersistence.java index 8816248dd..2a90ec665 100644 --- a/code/src/main/java/com/googlecode/cqengine/persistence/offheap/OffHeapPersistence.java +++ b/code/src/main/java/com/googlecode/cqengine/persistence/offheap/OffHeapPersistence.java @@ -27,6 +27,7 @@ import com.googlecode.cqengine.persistence.disk.DiskPersistence; import com.googlecode.cqengine.persistence.support.sqlite.SQLiteObjectStore; import com.googlecode.cqengine.persistence.support.sqlite.SQLiteOffHeapIdentityIndex; +import com.googlecode.cqengine.query.option.EngineFlags; import com.googlecode.cqengine.query.option.QueryOptions; import org.sqlite.SQLiteConfig; import org.sqlite.SQLiteDataSource; @@ -43,7 +44,6 @@ import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; -import static com.googlecode.cqengine.persistence.support.PersistenceFlags.READ_REQUEST; import static com.googlecode.cqengine.query.QueryFactory.noQueryOptions; import static com.googlecode.cqengine.query.option.FlagsEnabled.isFlagEnabled; @@ -136,7 +136,7 @@ public String getInstanceName() { @Override public Connection getConnection(Index index, QueryOptions queryOptions) { // Acquire a read lock IFF the READ_REQUEST flag has been set, otherwise acquire a write lock by default... - final Lock connectionLock = isFlagEnabled(queryOptions, READ_REQUEST) + final Lock connectionLock = isFlagEnabled(queryOptions, EngineFlags.READ_REQUEST) ? readWriteLock.readLock() : readWriteLock.writeLock(); connectionLock.lock(); @@ -268,8 +268,8 @@ public SQLiteOffHeapIdentityIndex createIdentityIndex() { */ @Override public void openRequestScopeResources(QueryOptions queryOptions) { - if (queryOptions.get(ConnectionManager.class) == null) { - queryOptions.put(ConnectionManager.class, new RequestScopeConnectionManager(this)); + if (queryOptions.getConnectionManager() == null) { + queryOptions.setConnectionManager(new RequestScopeConnectionManager(this)); } } @@ -281,7 +281,7 @@ public void openRequestScopeResources(QueryOptions queryOptions) { */ @Override public void closeRequestScopeResources(QueryOptions queryOptions) { - ConnectionManager connectionManager = queryOptions.get(ConnectionManager.class); + ConnectionManager connectionManager = queryOptions.getConnectionManager(); if (connectionManager instanceof RequestScopeConnectionManager) { ((RequestScopeConnectionManager) connectionManager).close(); queryOptions.remove(ConnectionManager.class); diff --git a/code/src/main/java/com/googlecode/cqengine/persistence/support/PersistenceFlags.java b/code/src/main/java/com/googlecode/cqengine/persistence/support/PersistenceFlags.java deleted file mode 100644 index 2bf6027b7..000000000 --- a/code/src/main/java/com/googlecode/cqengine/persistence/support/PersistenceFlags.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright 2012-2015 Niall Gallagher - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.googlecode.cqengine.persistence.support; - -/** - * Constants for flags which may be set into query options by the query engine internally. - */ -public class PersistenceFlags { - - public static String READ_REQUEST = "READ_REQUEST"; -} diff --git a/code/src/main/java/com/googlecode/cqengine/query/QueryFactory.java b/code/src/main/java/com/googlecode/cqengine/query/QueryFactory.java index b5eaea0a7..75b1b697a 100644 --- a/code/src/main/java/com/googlecode/cqengine/query/QueryFactory.java +++ b/code/src/main/java/com/googlecode/cqengine/query/QueryFactory.java @@ -638,9 +638,9 @@ public static QueryOptions noQueryOptions() { * @param flags Arbitrary objects which represent flags which may be interpreted by indexes etc. * @return A populated {@link FlagsEnabled} object which may be added to query options */ - public static FlagsEnabled enableFlags(Object... flags) { + public static FlagsEnabled enableFlags(EngineFlags... flags) { FlagsEnabled result = new FlagsEnabled(); - for (Object flag: flags) { + for (EngineFlags flag: flags) { result.add(flag); } return result; diff --git a/code/src/main/java/com/googlecode/cqengine/query/option/ArgumentValidationOption.java b/code/src/main/java/com/googlecode/cqengine/query/option/ArgumentValidationOption.java index b5a8878d1..6614d58eb 100644 --- a/code/src/main/java/com/googlecode/cqengine/query/option/ArgumentValidationOption.java +++ b/code/src/main/java/com/googlecode/cqengine/query/option/ArgumentValidationOption.java @@ -40,7 +40,7 @@ public ArgumentValidationStrategy getStrategy() { * {@link com.googlecode.cqengine.query.option.ArgumentValidationStrategy#SKIP} */ public static boolean isSkip(QueryOptions queryOptions) { - ArgumentValidationOption option = queryOptions.get(ArgumentValidationOption.class); + ArgumentValidationOption option = queryOptions.getArgumentValidationOption(); return option != null && ArgumentValidationStrategy.SKIP.equals(option.getStrategy()); } diff --git a/code/src/main/java/com/googlecode/cqengine/query/option/DeduplicationOption.java b/code/src/main/java/com/googlecode/cqengine/query/option/DeduplicationOption.java index c7e4bdc8c..704a35d5d 100644 --- a/code/src/main/java/com/googlecode/cqengine/query/option/DeduplicationOption.java +++ b/code/src/main/java/com/googlecode/cqengine/query/option/DeduplicationOption.java @@ -41,7 +41,7 @@ public DeduplicationStrategy getStrategy() { * {@link DeduplicationStrategy#LOGICAL_ELIMINATION} */ public static boolean isLogicalElimination(QueryOptions queryOptions) { - DeduplicationOption option = queryOptions.get(DeduplicationOption.class); + DeduplicationOption option = queryOptions.getDeduplicationOption(); return option != null && DeduplicationStrategy.LOGICAL_ELIMINATION.equals(option.getStrategy()); } @@ -54,7 +54,7 @@ public static boolean isLogicalElimination(QueryOptions queryOptions) { * {@link DeduplicationStrategy#MATERIALIZE} */ public static boolean isMaterialize(QueryOptions queryOptions) { - DeduplicationOption option = queryOptions.get(DeduplicationOption.class); + DeduplicationOption option = queryOptions.getDeduplicationOption(); return option != null && DeduplicationStrategy.MATERIALIZE.equals(option.getStrategy()); } diff --git a/code/src/main/java/com/googlecode/cqengine/query/option/EngineFlags.java b/code/src/main/java/com/googlecode/cqengine/query/option/EngineFlags.java index d86ed4aa3..d5ca53879 100644 --- a/code/src/main/java/com/googlecode/cqengine/query/option/EngineFlags.java +++ b/code/src/main/java/com/googlecode/cqengine/query/option/EngineFlags.java @@ -77,5 +77,33 @@ public enum EngineFlags { * ordering. This will improve retrieval speed, at the expense of allowing the relative ordering of objects having * one attribute value in common, and having other differing attribute values, to be slightly inexact. */ - INDEX_ORDERING_ALLOW_FAST_ORDERING_OF_MULTI_VALUED_ATTRIBUTES + INDEX_ORDERING_ALLOW_FAST_ORDERING_OF_MULTI_VALUED_ATTRIBUTES, + + /** + * A flag which if enabled causes the SQLiteIndex to temporarily drop the index on a table prior to adding objects, + * then to restore the index after objects have been added. + *

+ * This should not be used if other concurrent operations might also be ongoing on the collection. It is intended + * for use when the collection is first being populated or similar, such as at application startup. + */ + + BULK_IMPORT, + + /** + *

Switches off the 'synchronous' and 'journal_mode' pragmas before executing a bulk import. + * Executing a bulk import with 'synchronous' and 'journal_mode' OFF can significantly increase the performances of the operation + * at a cost of a slightly higher risk of database corruption in case of system crashes or the power loses. + *

The default values will be re-instated after the import. + */ + BULK_IMPORT_SUSPEND_SYNC_AND_JOURNALING, + + /** + * PersistenceFlags + */ + READ_REQUEST, + + /** + * A query option flag which can be supplied to the update method to control the replacement behaviour. + */ + STRICT_REPLACEMENT; } diff --git a/code/src/main/java/com/googlecode/cqengine/query/option/FlagsDisabled.java b/code/src/main/java/com/googlecode/cqengine/query/option/FlagsDisabled.java index ca6929650..f2299677b 100644 --- a/code/src/main/java/com/googlecode/cqengine/query/option/FlagsDisabled.java +++ b/code/src/main/java/com/googlecode/cqengine/query/option/FlagsDisabled.java @@ -57,16 +57,16 @@ public String toString() { * @return The existing QueryOptions's FlagsDisabled or a new instance. */ public static FlagsDisabled forQueryOptions(final QueryOptions queryOptions) { - FlagsDisabled flags = queryOptions.get(FlagsDisabled.class); + FlagsDisabled flags = queryOptions.getFlagsDisabled(); if (flags == null) { flags = new FlagsDisabled(); - queryOptions.put(FlagsDisabled.class, flags); + queryOptions.setFlagsDisabled(flags); } return flags; } public static boolean isFlagDisabled(QueryOptions queryOptions, Object flag) { - FlagsDisabled flagsDisabled = queryOptions.get(FlagsDisabled.class); + FlagsDisabled flagsDisabled = queryOptions.getFlagsDisabled(); return flagsDisabled != null && flagsDisabled.isFlagDisabled(flag); } } diff --git a/code/src/main/java/com/googlecode/cqengine/query/option/FlagsEnabled.java b/code/src/main/java/com/googlecode/cqengine/query/option/FlagsEnabled.java index 6d9cc0a3a..d69af2f0d 100644 --- a/code/src/main/java/com/googlecode/cqengine/query/option/FlagsEnabled.java +++ b/code/src/main/java/com/googlecode/cqengine/query/option/FlagsEnabled.java @@ -1,12 +1,12 @@ /** * Copyright 2012-2015 Niall Gallagher - * + *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -30,23 +30,51 @@ */ public class FlagsEnabled { - final Set flags = new HashSet(); + private Set flags; + private boolean readRequest; - public void add(Object flag) { - flags.add(flag); + public void add(EngineFlags flag) { + switch (flag) { + case READ_REQUEST: + readRequest = true; + return; + default: + if (flags == null) { + flags = new HashSet(); + } + flags.add(flag); + } } - public void remove(Object flag) { - flags.remove(flag); + public void remove(EngineFlags flag) { + switch (flag) { + case READ_REQUEST: + readRequest = false; + return; + default: + if (flags != null) { + flags.remove(flag); + } + flags.add(flag); + } } - public boolean isFlagEnabled(Object flag) { - return flags.contains(flag); + public boolean isFlagEnabled(EngineFlags flag) { + switch (flag) { + case READ_REQUEST: + return readRequest; + default: + if (flags == null) { + return false; + } else { + return flags.contains(flag); + } + } } @Override public String toString() { - return "flagsEnabled=" + flags; + return "flagsEnabled=" + flags + ",readRequest=" + readRequest; } /** @@ -57,16 +85,16 @@ public String toString() { * @return The existing QueryOptions's FlagsEnabled or a new instance. */ public static FlagsEnabled forQueryOptions(final QueryOptions queryOptions) { - FlagsEnabled flags = queryOptions.get(FlagsEnabled.class); + FlagsEnabled flags = queryOptions.getFlagsEnabled(); if (flags == null) { flags = new FlagsEnabled(); - queryOptions.put(FlagsEnabled.class, flags); + queryOptions.setFlagsEnabled(flags); } return flags; } - public static boolean isFlagEnabled(QueryOptions queryOptions, Object flag) { - FlagsEnabled flagsDisabled = queryOptions.get(FlagsEnabled.class); + public static boolean isFlagEnabled(QueryOptions queryOptions, EngineFlags flag) { + FlagsEnabled flagsDisabled = queryOptions.getFlagsEnabled(); return flagsDisabled != null && flagsDisabled.isFlagEnabled(flag); } } diff --git a/code/src/main/java/com/googlecode/cqengine/query/option/IsolationOption.java b/code/src/main/java/com/googlecode/cqengine/query/option/IsolationOption.java index 183a07532..e7cac2c79 100644 --- a/code/src/main/java/com/googlecode/cqengine/query/option/IsolationOption.java +++ b/code/src/main/java/com/googlecode/cqengine/query/option/IsolationOption.java @@ -44,7 +44,7 @@ public String toString() { * @return True if {@link IsolationOption} object is contained in those provided and its level matches that given */ public static boolean isIsolationLevel(QueryOptions queryOptions, IsolationLevel level) { - IsolationOption option = queryOptions.get(IsolationOption.class); + IsolationOption option = queryOptions.getIsolationOption(); return option != null && level.equals(option.getIsolationLevel()); } } \ No newline at end of file diff --git a/code/src/main/java/com/googlecode/cqengine/query/option/QueryOptions.java b/code/src/main/java/com/googlecode/cqengine/query/option/QueryOptions.java index c7b45fc98..5783ad4b9 100644 --- a/code/src/main/java/com/googlecode/cqengine/query/option/QueryOptions.java +++ b/code/src/main/java/com/googlecode/cqengine/query/option/QueryOptions.java @@ -15,13 +15,18 @@ */ package com.googlecode.cqengine.query.option; +import com.googlecode.cqengine.engine.CollectionQueryEngine; +import com.googlecode.cqengine.engine.QueryEngine; +import com.googlecode.cqengine.index.sqlite.ConnectionManager; +import com.googlecode.cqengine.index.support.CloseableRequestResources; import com.googlecode.cqengine.persistence.Persistence; +import com.googlecode.cqengine.query.Query; import java.util.HashMap; import java.util.Map; /** - * Encapsulates a map of optional key-value parameters supplied by the application to the query engine, attributes + * Encapsulates optional key-value parameters supplied by the application to the query engine, attributes * and indexes. *

* These parameters can request specific behaviour from the query engine such as specifying transaction @@ -31,18 +36,111 @@ */ public class QueryOptions { - final Map options; + protected Persistence persistenceOption = null; + protected ConnectionManager connectionManagerOption = null; + protected QueryEngine queryEngineOption = null; + protected DeduplicationOption deduplicationOption = null; + protected IsolationOption isolationOption = null; + protected FlagsEnabled flagsEnabledOption = null; + protected FlagsDisabled flagsDisabledOption = null; + protected Thresholds thresholdsOption = null; + protected CloseableRequestResources closeableRequestResourcesOption = null; + protected OrderByOption orderByOption = null; + protected Query rootQueryOption = null; + protected QueryLog queryLogOption = null; - public QueryOptions(Map options) { - this.options = options; - } + protected Map extraOptions = null; + private ArgumentValidationOption argumentValidationOption; public QueryOptions() { - this.options = new HashMap(); } - public Map getOptions() { - return this.options; + public QueryOptions(QueryOptions other) { + this.persistenceOption = other.getPersistence(); + this.connectionManagerOption = other.connectionManagerOption; + this.queryEngineOption = other.queryEngineOption; + this.deduplicationOption = other.deduplicationOption; + this.isolationOption = other.isolationOption; + this.flagsEnabledOption = other.flagsEnabledOption; + this.flagsDisabledOption = other.flagsDisabledOption; + this.thresholdsOption = other.thresholdsOption; + this.closeableRequestResourcesOption = other.closeableRequestResourcesOption; + this.orderByOption = other.orderByOption; + this.rootQueryOption = other.rootQueryOption; + this.extraOptions = other.extraOptions; + this.queryLogOption = other.queryLogOption; + this.argumentValidationOption = other.argumentValidationOption; + } + + public Persistence getPersistence() { + return persistenceOption; + } + + public void setPersistence(Persistence persistence) { + this.persistenceOption = persistence; + } + + public ConnectionManager getConnectionManager() { + return connectionManagerOption; + } + public void setConnectionManager(ConnectionManager connectionManager) { + this.connectionManagerOption=connectionManager; + } + + public QueryEngine getQueryEngine() { + return queryEngineOption; + } + public void setQueryEngine(QueryEngine queryEngine) { + this.queryEngineOption=queryEngine; + } + + public DeduplicationOption getDeduplicationOption() { + return deduplicationOption; + } + + public IsolationOption getIsolationOption() { + return isolationOption; + } + + public FlagsEnabled getFlagsEnabled() { + return flagsEnabledOption; + } + public void setFlagsEnabled(FlagsEnabled flagsEnabled) { + this.flagsEnabledOption = flagsEnabled; + } + + public FlagsDisabled getFlagsDisabled() { + return flagsDisabledOption; + } + public void setFlagsDisabled(FlagsDisabled flagsDisabled) { + this.flagsDisabledOption = flagsDisabled; + } + + public Thresholds getThresholds() { + return thresholdsOption; + } + + public CloseableRequestResources getCloseableRequestResources() { + return closeableRequestResourcesOption; + } + public void setCloseableRequestResources(CloseableRequestResources closeableRequestResources) { + this.closeableRequestResourcesOption = closeableRequestResources; + } + + public OrderByOption getOrderByOption() { + return orderByOption; + } + + public Query getRootQuery() { + return rootQueryOption; + } + + public QueryLog getQueryLog() { + return queryLogOption; + } + + public void setQueryLog(QueryLog queryLog) { + this.queryLogOption = queryLog; } public T get(Class optionType) { @@ -52,20 +150,160 @@ public T get(Class optionType) { } public Object get(Object key) { - return options.get(key); + if (Persistence.class.equals(key)) { + return this.persistenceOption; + } + else if (ConnectionManager.class.equals(key)) { + return this.connectionManagerOption; + } + else if (QueryEngine.class.equals(key)) { + return this.queryEngineOption; + } + else if (DeduplicationOption.class.equals(key)) { + return this.deduplicationOption; + } + else if (IsolationOption.class.equals(key)) { + return this.isolationOption; + } + else if (FlagsEnabled.class.equals(key)) { + return this.flagsEnabledOption; + } + else if (FlagsDisabled.class.equals(key)) { + return this.flagsDisabledOption; + } + else if (Thresholds.class.equals(key)) { + return this.thresholdsOption; + } + else if (CloseableRequestResources.class.equals(key)) { + return this.closeableRequestResourcesOption; + } + else if (OrderByOption.class.equals(key)) { + return this.orderByOption; + } + else if (CollectionQueryEngine.ROOT_QUERY.equals(key)) { + return this.rootQueryOption; + } + else if (QueryLog.class.equals(key)) { + return this.queryLogOption; + } + else if (ArgumentValidationOption.class.equals(key)) { + return this.argumentValidationOption; + } + else { + return extraOptions == null ? null : extraOptions.get(key); + } } public void put(Object key, Object value) { - options.put(key, value); + if (Persistence.class.equals(key)) { + this.persistenceOption = (Persistence) value; + } + else if (ConnectionManager.class.equals(key)) { + this.connectionManagerOption = (ConnectionManager) value; + } + else if (QueryEngine.class.equals(key)) { + this.queryEngineOption = (QueryEngine) value; + } + else if (DeduplicationOption.class.equals(key)) { + this.deduplicationOption = (DeduplicationOption) value; + } + else if (IsolationOption.class.equals(key)) { + this.isolationOption = (IsolationOption) value; + } + else if (FlagsEnabled.class.equals(key)) { + this.flagsEnabledOption = (FlagsEnabled) value; + } + else if (FlagsDisabled.class.equals(key)) { + this.flagsDisabledOption = (FlagsDisabled) value; + } + else if (Thresholds.class.equals(key)) { + this.thresholdsOption = (Thresholds) value; + } + else if (CloseableRequestResources.class.equals(key)) { + this.closeableRequestResourcesOption = (CloseableRequestResources) value; + } + else if (OrderByOption.class.equals(key)) { + this.orderByOption = (OrderByOption) value; + } + else if (CollectionQueryEngine.ROOT_QUERY.equals(key)) { + this.rootQueryOption = (Query) value; + } + else if (QueryLog.class.equals(key)) { + this.queryLogOption = (QueryLog) value; + } + else if (ArgumentValidationOption.class.equals(key)) { + this.argumentValidationOption = (ArgumentValidationOption) value; + } + else { + if (extraOptions == null) { + extraOptions = createExtraOptionsMap(); + } + extraOptions.put(key, value); + } } public void remove(Object key) { - options.remove(key); + if (Persistence.class.equals(key)) { + this.persistenceOption = null; + } + else if (ConnectionManager.class.equals(key)) { + this.connectionManagerOption = null; + } + else if (QueryEngine.class.equals(key)) { + this.queryEngineOption = null; + } + else if (DeduplicationOption.class.equals(key)) { + this.deduplicationOption = null; + } + else if (IsolationOption.class.equals(key)) { + this.isolationOption = null; + } + else if (FlagsEnabled.class.equals(key)) { + this.flagsEnabledOption = null; + } + else if (FlagsDisabled.class.equals(key)) { + this.flagsDisabledOption = null; + } + else if (Thresholds.class.equals(key)) { + this.thresholdsOption = null; + } + else if (CloseableRequestResources.class.equals(key)) { + this.closeableRequestResourcesOption = null; + } + else if (OrderByOption.class.equals(key)) { + this.orderByOption = null; + } + else if (CollectionQueryEngine.ROOT_QUERY.equals(key)) { + this.rootQueryOption = null; + } + else { + if (extraOptions != null) { + extraOptions.remove(key); + } + } + } + + protected HashMap createExtraOptionsMap() { + return new HashMap(); } @Override public String toString() { - return "queryOptions(" + options + ')'; + Map allOptions = new HashMap(); + if (persistenceOption != null) allOptions.put(Persistence.class, persistenceOption); + if (connectionManagerOption != null) allOptions.put(ConnectionManager.class, connectionManagerOption); + if (queryEngineOption != null) allOptions.put(QueryEngine.class, queryEngineOption); + if (deduplicationOption != null) allOptions.put(DeduplicationOption.class, deduplicationOption); + if (isolationOption != null) allOptions.put(IsolationOption.class, isolationOption); + if (flagsEnabledOption != null) allOptions.put(FlagsEnabled.class, flagsEnabledOption); + if (flagsDisabledOption != null) allOptions.put(FlagsDisabled.class, flagsDisabledOption); + if (thresholdsOption != null) allOptions.put(Thresholds.class, thresholdsOption); + if (closeableRequestResourcesOption != null) allOptions.put(CloseableRequestResources.class, closeableRequestResourcesOption); + if (orderByOption != null) allOptions.put(OrderByOption.class, orderByOption); + if (rootQueryOption != null) allOptions.put(CollectionQueryEngine.ROOT_QUERY, rootQueryOption); + if (extraOptions != null) allOptions.putAll(extraOptions); + + return "queryOptions(" + allOptions + ')'; } @Override @@ -75,17 +313,58 @@ public boolean equals(Object o) { QueryOptions that = (QueryOptions) o; - if (!options.equals(that.options)) return false; + if (persistenceOption != null ? !persistenceOption.equals(that.persistenceOption) : that.persistenceOption != null) + return false; + if (connectionManagerOption != null ? !connectionManagerOption.equals(that.connectionManagerOption) : that.connectionManagerOption != null) + return false; + if (queryEngineOption != null ? !queryEngineOption.equals(that.queryEngineOption) : that.queryEngineOption != null) + return false; + if (deduplicationOption != null ? !deduplicationOption.equals(that.deduplicationOption) : that.deduplicationOption != null) + return false; + if (isolationOption != null ? !isolationOption.equals(that.isolationOption) : that.isolationOption != null) + return false; + if (flagsEnabledOption != null ? !flagsEnabledOption.equals(that.flagsEnabledOption) : that.flagsEnabledOption != null) + return false; + if (flagsDisabledOption != null ? !flagsDisabledOption.equals(that.flagsDisabledOption) : that.flagsDisabledOption != null) + return false; + if (thresholdsOption != null ? !thresholdsOption.equals(that.thresholdsOption) : that.thresholdsOption != null) + return false; + if (closeableRequestResourcesOption != null ? !closeableRequestResourcesOption.equals(that.closeableRequestResourcesOption) : that.closeableRequestResourcesOption != null) + return false; + if (orderByOption != null ? !orderByOption.equals(that.orderByOption) : that.orderByOption != null) + return false; + if (rootQueryOption != null ? !rootQueryOption.equals(that.rootQueryOption) : that.rootQueryOption != null) + return false; + return extraOptions != null ? extraOptions.equals(that.extraOptions) : that.extraOptions == null; - return true; } @Override public int hashCode() { - return options.hashCode(); + int result = persistenceOption != null ? persistenceOption.hashCode() : 0; + result = 31 * result + (connectionManagerOption != null ? connectionManagerOption.hashCode() : 0); + result = 31 * result + (queryEngineOption != null ? queryEngineOption.hashCode() : 0); + result = 31 * result + (deduplicationOption != null ? deduplicationOption.hashCode() : 0); + result = 31 * result + (isolationOption != null ? isolationOption.hashCode() : 0); + result = 31 * result + (flagsEnabledOption != null ? flagsEnabledOption.hashCode() : 0); + result = 31 * result + (flagsDisabledOption != null ? flagsDisabledOption.hashCode() : 0); + result = 31 * result + (thresholdsOption != null ? thresholdsOption.hashCode() : 0); + result = 31 * result + (closeableRequestResourcesOption != null ? closeableRequestResourcesOption.hashCode() : 0); + result = 31 * result + (orderByOption != null ? orderByOption.hashCode() : 0); + result = 31 * result + (rootQueryOption != null ? rootQueryOption.hashCode() : 0); + result = 31 * result + (extraOptions != null ? extraOptions.hashCode() : 0); + return result; + } + + public ArgumentValidationOption getArgumentValidationOption() { + return argumentValidationOption; + } + + public void setArgumentValidationOption(ArgumentValidationOption argumentValidationOption) { + this.argumentValidationOption = argumentValidationOption; } - public boolean contains(Object key) { - return options.containsKey(key); + public void setRootQuery(Query rootQuery) { + this.rootQueryOption = rootQuery; } -} +} \ No newline at end of file diff --git a/code/src/main/java/com/googlecode/cqengine/query/option/Thresholds.java b/code/src/main/java/com/googlecode/cqengine/query/option/Thresholds.java index b60468dcc..78f2e42f0 100644 --- a/code/src/main/java/com/googlecode/cqengine/query/option/Thresholds.java +++ b/code/src/main/java/com/googlecode/cqengine/query/option/Thresholds.java @@ -66,7 +66,7 @@ public String toString() { } public static Double getThreshold(QueryOptions queryOptions, Object key) { - Thresholds thresholds = queryOptions.get(Thresholds.class); + Thresholds thresholds = queryOptions.getThresholds(); return thresholds == null ? null : thresholds.getThreshold(key); } } diff --git a/code/src/test/java/com/googlecode/cqengine/IndexedCollectionFunctionalTest.java b/code/src/test/java/com/googlecode/cqengine/IndexedCollectionFunctionalTest.java index eced4ab16..dd00643ad 100644 --- a/code/src/test/java/com/googlecode/cqengine/IndexedCollectionFunctionalTest.java +++ b/code/src/test/java/com/googlecode/cqengine/IndexedCollectionFunctionalTest.java @@ -1487,7 +1487,7 @@ else if (OffHeapConcurrentIndexedCollection.class.isAssignableFrom(scenario.coll indexedCollection.clear(); } - FlagsEnabled flagsEnabled = scenario.queryOptions.get(FlagsEnabled.class); + FlagsEnabled flagsEnabled = scenario.queryOptions.getFlagsEnabled(); if (flagsEnabled == null) { flagsEnabled = new FlagsEnabled(); } @@ -1497,7 +1497,7 @@ else if (OffHeapConcurrentIndexedCollection.class.isAssignableFrom(scenario.coll else { flagsEnabled.remove(EngineFlags.PREFER_INDEX_MERGE_STRATEGY); } - scenario.queryOptions.put(FlagsEnabled.class, flagsEnabled); + scenario.queryOptions.setFlagsEnabled(flagsEnabled); try { evaluateQuery(indexedCollection, scenario.query, scenario.queryOptions, scenario.expectedResults); @@ -1568,7 +1568,7 @@ static void evaluateQuery(IndexedCollection indexedCollection, Query q } try { if (expectedResults.containsQueryLogMessages != null) { - queryOptions.put(QueryLog.class, new QueryLog(new AppendableCollection())); + queryOptions.setQueryLog(new QueryLog(new AppendableCollection())); } ResultSet results = indexedCollection.retrieve(query, queryOptions); try { @@ -1618,7 +1618,7 @@ static void evaluateQuery(IndexedCollection indexedCollection, Query q } } if (expectedResults.containsQueryLogMessages != null) { - QueryLog queryLog = queryOptions.get(QueryLog.class); + QueryLog queryLog = queryOptions.getQueryLog(); AppendableCollection messages = (AppendableCollection)queryLog.getSink(); for (String expectedMessage : expectedResults.containsQueryLogMessages) { assertTrue("QueryLog does not contain message '" + expectedMessage + "' for query: " + query + ", messages contained: " + messages, messages.contains(expectedMessage)); diff --git a/code/src/test/java/com/googlecode/cqengine/TransactionalIndexedCollectionTest.java b/code/src/test/java/com/googlecode/cqengine/TransactionalIndexedCollectionTest.java index 0ca111e52..7d57013bf 100644 --- a/code/src/test/java/com/googlecode/cqengine/TransactionalIndexedCollectionTest.java +++ b/code/src/test/java/com/googlecode/cqengine/TransactionalIndexedCollectionTest.java @@ -24,6 +24,7 @@ import com.googlecode.cqengine.persistence.support.CollectionWrappingObjectStore; import com.googlecode.cqengine.persistence.support.ObjectStore; import com.googlecode.cqengine.query.QueryFactory; +import com.googlecode.cqengine.query.option.EngineFlags; import com.googlecode.cqengine.resultset.ResultSet; import com.googlecode.cqengine.resultset.stored.StoredSetBasedResultSet; import com.googlecode.cqengine.testutil.Car; @@ -234,7 +235,7 @@ public void testStrictReplacement() { // Verify that with STRICT_REPLACEMENT, when some objects to be replaced are not stored, collection is not modified... TransactionalIndexedCollection indexedCollection = new TransactionalIndexedCollection(Integer.class); indexedCollection.addAll(asSet(1, 2, 3)); - assertFalse(indexedCollection.update(asSet(3, 4), asSet(5, 6), queryOptions(enableFlags(TransactionalIndexedCollection.STRICT_REPLACEMENT)))); + assertFalse(indexedCollection.update(asSet(3, 4), asSet(5, 6), queryOptions(enableFlags(EngineFlags.STRICT_REPLACEMENT)))); assertEquals(indexedCollection, asSet(1, 2, 3)); } { @@ -248,7 +249,7 @@ public void testStrictReplacement() { // Verify that with STRICT_REPLACEMENT, when no objects are to be replaced, collection is modified... TransactionalIndexedCollection indexedCollection = new TransactionalIndexedCollection(Integer.class); indexedCollection.addAll(asSet(1, 2, 3)); - assertTrue(indexedCollection.update(Collections.emptySet(), asSet(4, 5), queryOptions(enableFlags(TransactionalIndexedCollection.STRICT_REPLACEMENT)))); + assertTrue(indexedCollection.update(Collections.emptySet(), asSet(4, 5), queryOptions(enableFlags(EngineFlags.STRICT_REPLACEMENT)))); assertEquals(indexedCollection, asSet(1, 2, 3, 4, 5)); } } diff --git a/code/src/test/java/com/googlecode/cqengine/engine/CollectionQueryEngineTest.java b/code/src/test/java/com/googlecode/cqengine/engine/CollectionQueryEngineTest.java index 1cca114ed..bfe244db6 100644 --- a/code/src/test/java/com/googlecode/cqengine/engine/CollectionQueryEngineTest.java +++ b/code/src/test/java/com/googlecode/cqengine/engine/CollectionQueryEngineTest.java @@ -92,7 +92,7 @@ public void testAddDuplicateCompoundIndex() throws Exception { public void testIsMutable() throws Exception { CollectionQueryEngine queryEngine = new CollectionQueryEngine(); QueryOptions queryOptions = new QueryOptions(); - queryOptions.put(Persistence.class, OnHeapPersistence.withoutPrimaryKey()); + queryOptions.setPersistence(OnHeapPersistence.withoutPrimaryKey()); queryEngine.init(emptyObjectStore(), queryOptions); Assert.assertTrue(queryEngine.isMutable()); @@ -122,7 +122,7 @@ public void testAddDuplicateIndex() throws Exception { public void testAddNonDuplicateIndex() throws Exception { CollectionQueryEngine queryEngine = new CollectionQueryEngine(); QueryOptions queryOptions = new QueryOptions(); - queryOptions.put(Persistence.class, OnHeapPersistence.withoutPrimaryKey()); + queryOptions.setPersistence(OnHeapPersistence.withoutPrimaryKey()); queryEngine.init(emptyObjectStore(), queryOptions); queryEngine.addIndex(HashIndex.onAttribute(Car.MANUFACTURER), noQueryOptions()); diff --git a/code/src/test/java/com/googlecode/cqengine/index/sqlite/PartialSQLiteIndexTest.java b/code/src/test/java/com/googlecode/cqengine/index/sqlite/PartialSQLiteIndexTest.java index 853d7f455..9755c19c5 100644 --- a/code/src/test/java/com/googlecode/cqengine/index/sqlite/PartialSQLiteIndexTest.java +++ b/code/src/test/java/com/googlecode/cqengine/index/sqlite/PartialSQLiteIndexTest.java @@ -50,7 +50,7 @@ public void testPartialSQLiteIndex() { IndexedCollection indexedCollection = new ConcurrentIndexedCollection(); ConnectionManager connectionManager = temporaryInMemoryDatabase.getConnectionManager(true); QueryOptions queryOptions = new QueryOptions(); - queryOptions.put(ConnectionManager.class, connectionManager); + queryOptions.setConnectionManager(connectionManager); PartialSQLiteIndex index = PartialSQLiteIndex.onAttributeWithFilterQuery(Car.MANUFACTURER, OBJECT_TO_ID, ID_TO_OBJECT, between(Car.CAR_ID, 2, 4)); indexedCollection.addIndex(index, queryOptions); indexedCollection.update(Collections.emptySet(), CarFactory.createCollectionOfCars(10), queryOptions); diff --git a/code/src/test/java/com/googlecode/cqengine/index/sqlite/SQLiteIndexTest.java b/code/src/test/java/com/googlecode/cqengine/index/sqlite/SQLiteIndexTest.java index 66211cfba..351385a01 100644 --- a/code/src/test/java/com/googlecode/cqengine/index/sqlite/SQLiteIndexTest.java +++ b/code/src/test/java/com/googlecode/cqengine/index/sqlite/SQLiteIndexTest.java @@ -107,7 +107,7 @@ public void testGetConnectionManager(){ ConnectionManager connectionManager = mock(ConnectionManager.class); QueryOptions queryOptions = mock(QueryOptions.class); - when(queryOptions.get(ConnectionManager.class)).thenReturn(connectionManager); + when(queryOptions.getConnectionManager()).thenReturn(connectionManager); SQLiteIndex carFeaturesOffHeapIndex = new SQLiteIndex( Car.FEATURES, @@ -1318,7 +1318,7 @@ public Boolean answer(InvocationOnMock invocationOnMock) throws Throwable { static QueryOptions createQueryOptions(ConnectionManager connectionManager) { QueryOptions queryOptions = new QueryOptions(); - queryOptions.put(ConnectionManager.class, connectionManager); + queryOptions.setConnectionManager(connectionManager); return queryOptions; } diff --git a/code/src/test/java/com/googlecode/cqengine/persistence/PersistenceIndexingBenchmark.java b/code/src/test/java/com/googlecode/cqengine/persistence/PersistenceIndexingBenchmark.java index b7dfba4b9..fa544b0bd 100644 --- a/code/src/test/java/com/googlecode/cqengine/persistence/PersistenceIndexingBenchmark.java +++ b/code/src/test/java/com/googlecode/cqengine/persistence/PersistenceIndexingBenchmark.java @@ -26,6 +26,7 @@ import com.googlecode.cqengine.persistence.disk.DiskPersistence; import com.googlecode.cqengine.persistence.offheap.OffHeapPersistence; import com.googlecode.cqengine.query.QueryFactory; +import com.googlecode.cqengine.query.option.EngineFlags; import com.googlecode.cqengine.query.option.QueryOptions; import com.googlecode.cqengine.testutil.Car; import com.googlecode.cqengine.testutil.CarFactory; @@ -158,7 +159,7 @@ static void populateCollection(IndexedCollection collection, int total, int for (Car next : CarFactory.createIterableOfCars(total)) { if (!batch.offer(next)) { if (BULK_IMPORT_FLAG) { - collection.update(Collections.emptySet(), batch, QueryFactory.queryOptions(enableFlags(SQLiteIndexFlags.BULK_IMPORT))); + collection.update(Collections.emptySet(), batch, QueryFactory.queryOptions(enableFlags(EngineFlags.BULK_IMPORT))); } else { collection.update(Collections.emptySet(), batch); diff --git a/code/src/test/java/com/googlecode/cqengine/query/QueryFactoryTest.java b/code/src/test/java/com/googlecode/cqengine/query/QueryFactoryTest.java index 95f6fad37..d16851fdb 100644 --- a/code/src/test/java/com/googlecode/cqengine/query/QueryFactoryTest.java +++ b/code/src/test/java/com/googlecode/cqengine/query/QueryFactoryTest.java @@ -88,8 +88,8 @@ public void testOrMethodOverloading() { @Test public void testQueryOptionsMethodOverloading() { QueryOptions queryOptions = queryOptions(orderBy(descending(Car.CAR_ID)), deduplicate(DeduplicationStrategy.MATERIALIZE)); - assertEquals(orderBy(descending(Car.CAR_ID)), queryOptions.get(OrderByOption.class)); - assertEquals(deduplicate(DeduplicationStrategy.MATERIALIZE), queryOptions.get(DeduplicationOption.class)); + assertEquals(orderBy(descending(Car.CAR_ID)), queryOptions.getOrderByOption()); + assertEquals(deduplicate(DeduplicationStrategy.MATERIALIZE), queryOptions.getDeduplicationOption()); assertEquals(queryOptions(new Object[] {"foo", "bar"}), queryOptions("foo", "bar")); } diff --git a/code/src/test/java/com/googlecode/cqengine/query/option/FlagsEnabledTest.java b/code/src/test/java/com/googlecode/cqengine/query/option/FlagsEnabledTest.java index 9712d4b60..3100d8f91 100644 --- a/code/src/test/java/com/googlecode/cqengine/query/option/FlagsEnabledTest.java +++ b/code/src/test/java/com/googlecode/cqengine/query/option/FlagsEnabledTest.java @@ -29,9 +29,9 @@ public class FlagsEnabledTest { @Test public void testFlagsEnabled() { - QueryOptions queryOptions = queryOptions(enableFlags("a", "b")); - assertTrue(isFlagEnabled(queryOptions, "a")); - assertTrue(isFlagEnabled(queryOptions, "b")); - assertFalse(isFlagEnabled(queryOptions, "c")); + QueryOptions queryOptions = queryOptions(enableFlags(EngineFlags.BULK_IMPORT, EngineFlags.READ_REQUEST)); + assertTrue(isFlagEnabled(queryOptions, EngineFlags.READ_REQUEST)); + assertTrue(isFlagEnabled(queryOptions, EngineFlags.BULK_IMPORT)); + assertFalse(isFlagEnabled(queryOptions, EngineFlags.STRICT_REPLACEMENT)); } } \ No newline at end of file