Initial work to add feature flags to Usergrid allowing different runtime features/injections
Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/5b42c0a6 Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/5b42c0a6 Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/5b42c0a6 Branch: refs/heads/feature-flags Commit: 5b42c0a60d69dc2d47f6fd31a95a5aecd055bce0 Parents: 867060f Author: Michael Russo <[email protected]> Authored: Tue Sep 6 18:50:20 2016 -0700 Committer: Michael Russo <[email protected]> Committed: Tue Sep 6 18:50:20 2016 -0700 ---------------------------------------------------------------------- .../main/resources/usergrid-default.properties | 13 +- .../usergrid/corepersistence/CoreModule.java | 87 +++-- .../corepersistence/CpEntityManagerFactory.java | 35 +- .../corepersistence/CpManagerCache.java | 30 +- .../usergrid/corepersistence/CpSetup.java | 17 +- .../usergrid/corepersistence/ManagerCache.java | 6 - .../asyncevents/AsyncEventServiceImpl.java | 46 +-- .../asyncevents/AsyncIndexProvider.java | 46 ++- .../asyncevents/EventBuilderImpl.java | 60 +++- .../corepersistence/index/EventServiceFig.java | 121 +++++++ .../index/IndexProcessorFig.java | 121 ------- .../index/ReIndexServiceImpl.java | 10 +- .../pipeline/PipelineModule.java | 12 +- .../pipeline/builder/CandidateBuilder.java | 8 +- .../pipeline/builder/IdBuilder.java | 26 +- .../pipeline/builder/PipelineBuilder.java | 19 +- .../pipeline/read/FilterFactory.java | 23 -- .../pipeline/read/SearchFilterFactory.java | 53 +++ .../read/search/CandidateEntityFilter.java | 31 +- .../pipeline/read/search/CandidateIdFilter.java | 26 +- .../org/apache/usergrid/persistence/Query.java | 9 +- .../usergrid/system/UsergridFeatures.java | 69 ++++ .../index/AsyncEventServiceImplTest.java | 10 +- .../core/datastax/impl/DataStaxClusterImpl.java | 3 +- stack/corepersistence/pom.xml | 4 +- .../persistence/index/guice/IndexModule.java | 2 - stack/pom.xml | 2 +- .../query/validator/users/UserQueryIT.java | 19 +- .../usergrid/rest/AbstractContextResource.java | 9 + .../usergrid/rest/JobServiceBoostrap.java | 3 +- .../org/apache/usergrid/rest/RootResource.java | 7 +- .../rest/applications/ApplicationResource.java | 7 + .../rest/applications/ServiceResource.java | 2 +- .../rest/applications/kvm/KvmResource.java | 358 +++++++++++++++++++ .../UnsupportedOperationExceptionMapper.java | 3 +- .../usergrid/rest/system/IndexResource.java | 7 + .../usergrid/rest/system/SystemResource.java | 1 - .../rest/test/resource/AbstractRestIT.java | 1 - .../cassandra/ManagementServiceImpl.java | 11 +- 39 files changed, 998 insertions(+), 319 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/config/src/main/resources/usergrid-default.properties ---------------------------------------------------------------------- diff --git a/stack/config/src/main/resources/usergrid-default.properties b/stack/config/src/main/resources/usergrid-default.properties index 34d46ad..3209ae4 100644 --- a/stack/config/src/main/resources/usergrid-default.properties +++ b/stack/config/src/main/resources/usergrid-default.properties @@ -49,6 +49,17 @@ usergrid.persistence=CP +################### Usergrid Feature Implementation #################### +# +# Set the features that should be enabled. This will optionally inject certain dependencies. +# +# Valid values: all or kvm +# +# all - all features available including graph and query +# graph - only graph and key-value map features available ( no query and no Elasticsearch required ) +# +usergrid.features.enabled=all + ########################### Cassandra (Datastore) ########################### @@ -64,7 +75,7 @@ cassandra.version=2.1 # Set the Cassandra cluster name that this instance of Usergrid should use. # -cassandra.cluster=Test Cluster +cassandra.cluster=CassandraClientCluster # Set a comma-separated list of one or more Cassandra hosts (host:port) that Usergrid will connect to. # If no port is provided, the default Cassandra port of 9160 will be used. http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/CoreModule.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CoreModule.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CoreModule.java index 781eede..b5926eb 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CoreModule.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CoreModule.java @@ -41,7 +41,11 @@ import org.apache.usergrid.persistence.core.rx.RxTaskSchedulerImpl; import org.apache.usergrid.persistence.core.scope.ApplicationScope; import org.apache.usergrid.persistence.graph.guice.GraphModule; import org.apache.usergrid.persistence.graph.serialization.impl.migration.GraphNode; +import org.apache.usergrid.persistence.index.IndexFig; import org.apache.usergrid.persistence.index.guice.IndexModule; +import org.apache.usergrid.persistence.map.guice.MapModule; +import org.apache.usergrid.persistence.queue.guice.QueueModule; +import org.apache.usergrid.system.UsergridFeatures; import org.safehaus.guicyfig.GuicyFigModule; import java.util.concurrent.ThreadPoolExecutor; @@ -79,14 +83,59 @@ public class CoreModule extends AbstractModule { bind( new TypeLiteral<MigrationDataProvider<GraphNode>>() {} ).to( AllNodesInGraphImpl.class ); } } ); - install( new IndexModule() { - @Override - public void configureMigrationProvider() { - bind( new TypeLiteral<MigrationDataProvider<ApplicationScope>>() {} ) - .to( AllApplicationsObservableImpl.class ); - } - } ); - // install(new MapModule()); TODO, re-enable when index module doesn't depend on queue + + // figs are just properties, load em always + install( new GuicyFigModule( EventServiceFig.class ) ); + install( new GuicyFigModule( CoreIndexFig.class ) ); + + install(new QueueModule()); + + + //bind the async queue provider + bind( AsyncEventService.class ).toProvider( AsyncIndexProvider.class ); + + //bind the event handlers + bind( EventBuilder.class ).to( EventBuilderImpl.class ); + + // requires indexing dependencies to be available + bind( ApplicationService.class ).to( ApplicationServiceImpl.class ); + + if(UsergridFeatures.isQueryFeatureEnabled()) { + + install( new IndexModule() { + @Override + public void configureMigrationProvider() { + bind( new TypeLiteral<MigrationDataProvider<ApplicationScope>>() {} ) + .to( AllApplicationsObservableImpl.class ); + } + } ); + + /***** + * Indexing service + *****/ + + // This just uses figs to come up with named instances. Doesn't require all of indexing, but used injected + // in places that may or may not need this. + bind( IndexLocationStrategyFactory.class ).to( IndexLocationStrategyFactoryImpl.class ); + + + bind( IndexService.class ).to( IndexServiceImpl.class ); + + bind( ApplicationIndexBucketLocator.class ); + + + bind( ReIndexService.class ).to( ReIndexServiceImpl.class ); + + install( new FactoryModuleBuilder().implement( AggregationService.class, AggregationServiceImpl.class ) + .build( AggregationServiceFactory.class ) ); + + + } + + + + + install(new MapModule()); //TODO, re-enable when index module doesn't depend on queue // install(new QueueModule()); bind( ManagerCache.class ).to( CpManagerCache.class ); @@ -113,31 +162,11 @@ public class CoreModule extends AbstractModule { bind( AllEntityIdsObservable.class ).to( AllEntityIdsObservableImpl.class ); - /***** - * Indexing service - *****/ - bind( IndexService.class ).to( IndexServiceImpl.class ); - //bind the event handlers - bind( EventBuilder.class ).to( EventBuilderImpl.class ); - bind( ApplicationIndexBucketLocator.class ); - - //bind the queue provider - bind( AsyncEventService.class ).toProvider( AsyncIndexProvider.class ); - - - bind( ReIndexService.class ).to( ReIndexServiceImpl.class ); - install( new FactoryModuleBuilder().implement( AggregationService.class, AggregationServiceImpl.class ) - .build( AggregationServiceFactory.class ) ); - bind( IndexLocationStrategyFactory.class ).to( IndexLocationStrategyFactoryImpl.class ); - - install( new GuicyFigModule( IndexProcessorFig.class ) ); - - install( new GuicyFigModule( CoreIndexFig.class ) ); install( new GuicyFigModule( ApplicationIdCacheFig.class ) ); @@ -161,7 +190,7 @@ public class CoreModule extends AbstractModule { bind( ConnectionService.class ).to( ConnectionServiceImpl.class ); - bind( ApplicationService.class ).to( ApplicationServiceImpl.class ); + bind( StatusService.class ).to( StatusServiceImpl.class ); } http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java index 2a88302..89d07cc 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java @@ -60,6 +60,7 @@ import org.apache.usergrid.persistence.index.EntityIndex; import org.apache.usergrid.persistence.model.entity.Id; import org.apache.usergrid.persistence.model.entity.SimpleId; import org.apache.usergrid.persistence.model.util.UUIDGenerator; +import org.apache.usergrid.system.UsergridFeatures; import org.apache.usergrid.utils.UUIDUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -105,7 +106,7 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application private CassandraService cassandraService; private CounterUtils counterUtils; private Injector injector; - private final ReIndexService reIndexService; + private ReIndexService reIndexService = null; private final MetricsFactory metricsFactory; private final AsyncEventService indexService; private final CollectionService collectionService; @@ -128,7 +129,6 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application this.cassandraService = cassandraService; this.counterUtils = counterUtils; this.injector = injector; - this.reIndexService = injector.getInstance(ReIndexService.class); this.entityManagerFig = injector.getInstance(EntityManagerFig.class); this.actorSystemFig = injector.getInstance( ActorSystemFig.class ); this.managerCache = injector.getInstance( ManagerCache.class ); @@ -169,6 +169,12 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application getManagementEntityManager() ); checkManagementApp( properties ); + + if(UsergridFeatures.isQueryFeatureEnabled()) { + + this.reIndexService = this.injector.getInstance(ReIndexService.class); + + } } @@ -329,7 +335,11 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application private void initMgmtAppInternal() { EntityManager em = getEntityManager(getManagementAppId()); - indexService.queueInitializeApplicationIndex(CpNamingUtils.getApplicationScope(getManagementAppId())); + + if( UsergridFeatures.isQueryFeatureEnabled() ) { + + indexService.queueInitializeApplicationIndex(CpNamingUtils.getApplicationScope(getManagementAppId())); + } try { if ( em.getApplication() == null ) { @@ -440,9 +450,14 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application throw new ApplicationAlreadyExistsException( appName ); } - // Initialize the index for this new application - appEm.initializeIndex(); - indexService.queueInitializeApplicationIndex(CpNamingUtils.getApplicationScope(applicationId)); + + if( UsergridFeatures.isQueryFeatureEnabled() ) { + + // Initialize the index for this new application + appEm.initializeIndex(); + + indexService.queueInitializeApplicationIndex(CpNamingUtils.getApplicationScope(applicationId)); + } if ( properties == null ) { properties = new TreeMap<>( CASE_INSENSITIVE_ORDER); } @@ -507,9 +522,11 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application CpNamingUtils.APPLICATION_INFOS , CpNamingUtils.APPLICATION_INFO ).lastOrDefault( null ) .map( appInfo -> { - //start the index rebuild - final ReIndexRequestBuilder builder = reIndexService.getBuilder().withApplicationId( applicationId ); - reIndexService.rebuildIndex( builder ); + if( UsergridFeatures.isQueryFeatureEnabled() ) { + //start the index rebuild + final ReIndexRequestBuilder builder = reIndexService.getBuilder().withApplicationId(applicationId); + reIndexService.rebuildIndex(builder); + } //load the entity final EntityManager managementEm = getEntityManager( getManagementAppId() ); http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpManagerCache.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpManagerCache.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpManagerCache.java index 4e1f5e3..af64a4f 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpManagerCache.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpManagerCache.java @@ -16,6 +16,7 @@ package org.apache.usergrid.corepersistence; +import com.google.inject.Injector; import org.apache.usergrid.corepersistence.index.IndexLocationStrategyFactory; import org.apache.usergrid.persistence.collection.EntityCollectionManager; import org.apache.usergrid.persistence.collection.EntityCollectionManagerFactory; @@ -31,6 +32,7 @@ import org.apache.usergrid.persistence.map.MapManagerFactory; import org.apache.usergrid.persistence.map.MapScope; import com.google.inject.Inject; +import org.apache.usergrid.system.UsergridFeatures; /** @@ -40,30 +42,35 @@ import com.google.inject.Inject; public class CpManagerCache implements ManagerCache { private final EntityCollectionManagerFactory ecmf; - private final EntityIndexFactory eif; + private EntityIndexFactory eif = null; private final GraphManagerFactory gmf; private final MapManagerFactory mmf; - private final IndexLocationStrategyFactory indexLocationStrategyFactory; - private final IndexProducer indexProducer; + private IndexLocationStrategyFactory indexLocationStrategyFactory; + private final Injector injector; // TODO: consider making these cache sizes and timeouts configurable @Inject public CpManagerCache( final EntityCollectionManagerFactory ecmf, - final EntityIndexFactory eif, final GraphManagerFactory gmf, final MapManagerFactory mmf, - final IndexLocationStrategyFactory indexLocationStrategyFactory, - final IndexProducer indexProducer + final Injector injector ) { + this.ecmf = ecmf; - this.eif = eif; + if(UsergridFeatures.isQueryFeatureEnabled()) { + + this.eif = injector.getInstance(EntityIndexFactory.class); + this.indexLocationStrategyFactory = injector.getInstance(IndexLocationStrategyFactory.class); + + + } + this.gmf = gmf; this.mmf = mmf; - this.indexLocationStrategyFactory = indexLocationStrategyFactory; - this.indexProducer = indexProducer; + this.injector = injector; } @@ -93,11 +100,6 @@ public class CpManagerCache implements ManagerCache { return mmf.createMapManager( mapScope ); } - @Override - public IndexProducer getIndexProducer() { - return indexProducer; - } - @Override public void invalidate() { http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java index 28b1ccc..5203e32 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java @@ -17,6 +17,7 @@ package org.apache.usergrid.corepersistence; +import org.apache.usergrid.system.UsergridFeatures; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,7 +52,6 @@ public class CpSetup implements Setup { private static final Logger logger = LoggerFactory.getLogger( CpSetup.class ); - private final Injector injector; @@ -77,8 +77,13 @@ public class CpSetup implements Setup { @Override public void initSchema() throws Exception { - // Initialize the management app index in Elasticsearch - this.emf.initializeManagementIndex(); + if(UsergridFeatures.isQueryFeatureEnabled()) { + + // Initialize the management app index in Elasticsearch + this.emf.initializeManagementIndex(); + + } + // Create the schema (including keyspace) in Cassandra setupSchema(); @@ -125,8 +130,10 @@ public class CpSetup implements Setup { cass.createColumnFamilies( getApplicationKeyspace(), getCfDefs( ApplicationCF.class, getApplicationKeyspace() ) ); - cass.createColumnFamilies( getApplicationKeyspace(), - getCfDefs( QueuesCF.class, getApplicationKeyspace() ) ); + if( UsergridFeatures.isQueryFeatureEnabled() || UsergridFeatures.isGraphFeatureEnabled() ) { + cass.createColumnFamilies(getApplicationKeyspace(), + getCfDefs(QueuesCF.class, getApplicationKeyspace())); + } logger.info( "Keyspace and legacy column families initialized" ); } http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/ManagerCache.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/ManagerCache.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/ManagerCache.java index 60212df..ddcd997 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/ManagerCache.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/ManagerCache.java @@ -67,12 +67,6 @@ public interface ManagerCache { MapManager getMapManager(MapScope mapScope); /** - * gets index producer - * @return - */ - IndexProducer getIndexProducer(); - - /** * invalidate the cache */ void invalidate(); http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncEventServiceImpl.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncEventServiceImpl.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncEventServiceImpl.java index 0bff887..1febe5b 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncEventServiceImpl.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncEventServiceImpl.java @@ -28,15 +28,14 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; import java.util.stream.Stream; +import com.google.inject.Injector; import org.apache.usergrid.corepersistence.asyncevents.model.*; +import org.apache.usergrid.corepersistence.index.*; import org.apache.usergrid.persistence.index.impl.*; +import org.apache.usergrid.system.UsergridFeatures; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.usergrid.corepersistence.index.EntityIndexOperation; -import org.apache.usergrid.corepersistence.index.IndexLocationStrategyFactory; -import org.apache.usergrid.corepersistence.index.IndexProcessorFig; -import org.apache.usergrid.corepersistence.index.ReplicatedIndexLocationStrategy; import org.apache.usergrid.corepersistence.rx.impl.EdgeScope; import org.apache.usergrid.corepersistence.util.CpNamingUtils; import org.apache.usergrid.corepersistence.util.ObjectJsonSerializer; @@ -97,7 +96,6 @@ import rx.schedulers.Schedulers; @Singleton public class AsyncEventServiceImpl implements AsyncEventService { - private static final Logger logger = LoggerFactory.getLogger(AsyncEventServiceImpl.class); // SQS maximum receive messages is 10 @@ -105,12 +103,12 @@ public class AsyncEventServiceImpl implements AsyncEventService { public static final String QUEUE_NAME = "index"; //keep this short as AWS limits queue name size to 80 chars private final QueueManager queue; - private final IndexProcessorFig indexProcessorFig; + private final EventServiceFig eventServiceFig; private final QueueFig queueFig; - private final IndexProducer indexProducer; + private IndexProducer indexProducer = null; private final EntityCollectionManagerFactory entityCollectionManagerFactory; - private final IndexLocationStrategyFactory indexLocationStrategyFactory; - private final EntityIndexFactory entityIndexFactory; + private IndexLocationStrategyFactory indexLocationStrategyFactory; + private EntityIndexFactory entityIndexFactory = null; private final EventBuilder eventBuilder; private final RxTaskScheduler rxTaskScheduler; @@ -132,25 +130,33 @@ public class AsyncEventServiceImpl implements AsyncEventService { //the actively running subscription private List<Subscription> subscriptions = new ArrayList<>(); + private final Injector injector; + @Inject public AsyncEventServiceImpl(final QueueManagerFactory queueManagerFactory, - final IndexProcessorFig indexProcessorFig, - final IndexProducer indexProducer, + final EventServiceFig eventServiceFig, final MetricsFactory metricsFactory, final EntityCollectionManagerFactory entityCollectionManagerFactory, - final IndexLocationStrategyFactory indexLocationStrategyFactory, final EntityIndexFactory entityIndexFactory, final EventBuilder eventBuilder, final MapManagerFactory mapManagerFactory, final QueueFig queueFig, @EventExecutionScheduler - final RxTaskScheduler rxTaskScheduler ) { - this.indexProducer = indexProducer; + final RxTaskScheduler rxTaskScheduler, + final Injector injector ) { this.entityCollectionManagerFactory = entityCollectionManagerFactory; - this.indexLocationStrategyFactory = indexLocationStrategyFactory; this.entityIndexFactory = entityIndexFactory; + this.injector = injector; + if(UsergridFeatures.isQueryFeatureEnabled() ) { + + this.entityIndexFactory = this.injector.getInstance(EntityIndexFactory.class); + this.indexProducer = this.injector.getInstance(IndexProducer.class); + this.indexLocationStrategyFactory = this.injector.getInstance(IndexLocationStrategyFactory.class); + } + + this.eventBuilder = eventBuilder; final MapScope mapScope = new MapScopeImpl( CpNamingUtils.getManagementApplicationId(), "indexEvents"); @@ -162,7 +168,7 @@ public class AsyncEventServiceImpl implements AsyncEventService { QueueScope queueScope = new QueueScopeImpl(QUEUE_NAME, QueueScope.RegionImplementation.ALL); this.queue = queueManagerFactory.getQueueManager(queueScope); - this.indexProcessorFig = indexProcessorFig; + this.eventServiceFig = eventServiceFig; this.queueFig = queueFig; this.writeTimer = metricsFactory.getTimer(AsyncEventServiceImpl.class, "async_event.write"); @@ -528,7 +534,7 @@ public class AsyncEventServiceImpl implements AsyncEventService { final UUID newMessageId = UUIDGenerator.newTimeUUID(); final int expirationTimeInSeconds = - ( int ) TimeUnit.MILLISECONDS.toSeconds( indexProcessorFig.getIndexMessageTtl() ); + ( int ) TimeUnit.MILLISECONDS.toSeconds( eventServiceFig.getIndexMessageTtl() ); //write to the map in ES esMapPersistence.putString( newMessageId.toString(), jsonValue, expirationTimeInSeconds ); @@ -716,7 +722,7 @@ public class AsyncEventServiceImpl implements AsyncEventService { * Loop through and start the workers */ public void start() { - final int count = indexProcessorFig.getWorkerCount(); + final int count = eventServiceFig.getWorkerCount(); for (int i = 0; i < count; i++) { startWorker(); @@ -761,7 +767,7 @@ public class AsyncEventServiceImpl implements AsyncEventService { inFlight.addAndGet( drainList.size() ); } catch ( Throwable t ) { - final long sleepTime = indexProcessorFig.getFailureRetryTime(); + final long sleepTime = eventServiceFig.getFailureRetryTime(); logger.error( "Failed to dequeue. Sleeping for {} milliseconds", sleepTime, t ); @@ -820,7 +826,7 @@ public class AsyncEventServiceImpl implements AsyncEventService { } } ).subscribeOn( rxTaskScheduler.getAsyncIOScheduler() ); //end flatMap - }, indexProcessorFig.getEventConcurrencyFactor() ); + }, eventServiceFig.getEventConcurrencyFactor() ); //start in the background http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncIndexProvider.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncIndexProvider.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncIndexProvider.java index abd4ce1..7d7be38 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncIndexProvider.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/AsyncIndexProvider.java @@ -20,8 +20,9 @@ package org.apache.usergrid.corepersistence.asyncevents; +import com.google.inject.Injector; import org.apache.usergrid.corepersistence.index.IndexLocationStrategyFactory; -import org.apache.usergrid.corepersistence.index.IndexProcessorFig; +import org.apache.usergrid.corepersistence.index.EventServiceFig; import org.apache.usergrid.persistence.collection.EntityCollectionManagerFactory; import org.apache.usergrid.persistence.core.rx.RxTaskScheduler; import org.apache.usergrid.persistence.core.metrics.MetricsFactory; @@ -35,6 +36,7 @@ import org.apache.usergrid.persistence.queue.QueueManagerFactory; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; +import org.apache.usergrid.system.UsergridFeatures; /** @@ -43,46 +45,52 @@ import com.google.inject.Singleton; @Singleton public class AsyncIndexProvider implements Provider<AsyncEventService> { - private final IndexProcessorFig indexProcessorFig; + private final EventServiceFig eventServiceFig; private final QueueManagerFactory queueManagerFactory; private final MetricsFactory metricsFactory; private final RxTaskScheduler rxTaskScheduler; private final EntityCollectionManagerFactory entityCollectionManagerFactory; private final EventBuilder eventBuilder; - private final IndexLocationStrategyFactory indexLocationStrategyFactory; - private final EntityIndexFactory entityIndexFactory; - private final IndexProducer indexProducer; + private IndexLocationStrategyFactory indexLocationStrategyFactory; + private EntityIndexFactory entityIndexFactory = null; + private IndexProducer indexProducer = null; private final MapManagerFactory mapManagerFactory; private final QueueFig queueFig; private AsyncEventService asyncEventService; + private final Injector injector; @Inject - public AsyncIndexProvider(final IndexProcessorFig indexProcessorFig, + public AsyncIndexProvider(final EventServiceFig eventServiceFig, final QueueManagerFactory queueManagerFactory, final MetricsFactory metricsFactory, @EventExecutionScheduler final RxTaskScheduler rxTaskScheduler, final EntityCollectionManagerFactory entityCollectionManagerFactory, final EventBuilder eventBuilder, - final IndexLocationStrategyFactory indexLocationStrategyFactory, - final EntityIndexFactory entityIndexFactory, - final IndexProducer indexProducer, final MapManagerFactory mapManagerFactory, - final QueueFig queueFig) { + final QueueFig queueFig, + final Injector injector) { - this.indexProcessorFig = indexProcessorFig; + this.eventServiceFig = eventServiceFig; this.queueManagerFactory = queueManagerFactory; this.metricsFactory = metricsFactory; this.rxTaskScheduler = rxTaskScheduler; this.entityCollectionManagerFactory = entityCollectionManagerFactory; this.eventBuilder = eventBuilder; - this.indexLocationStrategyFactory = indexLocationStrategyFactory; - this.entityIndexFactory = entityIndexFactory; - this.indexProducer = indexProducer; this.mapManagerFactory = mapManagerFactory; this.queueFig = queueFig; + this.injector = injector; + + if(UsergridFeatures.isQueryFeatureEnabled()) { + + this.entityIndexFactory = this.injector.getInstance(EntityIndexFactory.class); + this.indexProducer = this.injector.getInstance(IndexProducer.class); + this.indexLocationStrategyFactory = this.injector.getInstance(IndexLocationStrategyFactory.class); + + + } } @@ -98,21 +106,21 @@ public class AsyncIndexProvider implements Provider<AsyncEventService> { private AsyncEventService getIndexService() { - final String value = indexProcessorFig.getQueueImplementation(); + final String value = eventServiceFig.getQueueImplementation(); final Implementations impl = Implementations.valueOf(value); switch (impl) { case LOCAL: - AsyncEventServiceImpl eventService = new AsyncEventServiceImpl(scope -> new LocalQueueManager(), indexProcessorFig, indexProducer, metricsFactory, - entityCollectionManagerFactory, indexLocationStrategyFactory, entityIndexFactory, eventBuilder,mapManagerFactory, queueFig,rxTaskScheduler); + AsyncEventServiceImpl eventService = new AsyncEventServiceImpl(scope -> new LocalQueueManager(), eventServiceFig, metricsFactory, + entityCollectionManagerFactory, entityIndexFactory, eventBuilder,mapManagerFactory, queueFig,rxTaskScheduler, injector); eventService.MAX_TAKE = 1000; return eventService; case SQS: throw new IllegalArgumentException("Configuration value of SQS is no longer allowed. Use SNS instead with only a single region"); case SNS: - return new AsyncEventServiceImpl(queueManagerFactory, indexProcessorFig, indexProducer, metricsFactory, - entityCollectionManagerFactory, indexLocationStrategyFactory,entityIndexFactory, eventBuilder, mapManagerFactory, queueFig, rxTaskScheduler ); + return new AsyncEventServiceImpl(queueManagerFactory, eventServiceFig, metricsFactory, + entityCollectionManagerFactory,entityIndexFactory, eventBuilder, mapManagerFactory, queueFig, rxTaskScheduler, injector ); default: throw new IllegalArgumentException("Configuration value of " + getErrorValues() + " are allowed"); } http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/EventBuilderImpl.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/EventBuilderImpl.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/EventBuilderImpl.java index bbdce5a..7136022 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/EventBuilderImpl.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/asyncevents/EventBuilderImpl.java @@ -24,6 +24,9 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; +import com.google.inject.Injector; +import org.apache.usergrid.persistence.index.impl.IndexOperation; +import org.apache.usergrid.system.UsergridFeatures; import org.apache.usergrid.utils.UUIDUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,20 +61,28 @@ public class EventBuilderImpl implements EventBuilder { private static final Logger logger = LoggerFactory.getLogger( EventBuilderImpl.class ); - private final IndexService indexService; + private IndexService indexService = null; private final EntityCollectionManagerFactory entityCollectionManagerFactory; private final GraphManagerFactory graphManagerFactory; private final SerializationFig serializationFig; + private final Injector injector; + @Inject - public EventBuilderImpl( final IndexService indexService, - final EntityCollectionManagerFactory entityCollectionManagerFactory, - final GraphManagerFactory graphManagerFactory, final SerializationFig serializationFig ) { - this.indexService = indexService; + public EventBuilderImpl( final EntityCollectionManagerFactory entityCollectionManagerFactory, + final GraphManagerFactory graphManagerFactory, final SerializationFig serializationFig, + final Injector injector ) { + this.entityCollectionManagerFactory = entityCollectionManagerFactory; this.graphManagerFactory = graphManagerFactory; this.serializationFig = serializationFig; + this.injector = injector; + + if(UsergridFeatures.isQueryFeatureEnabled()) { + + this.indexService = injector.getInstance(IndexService.class); + } } @@ -85,6 +96,10 @@ public class EventBuilderImpl implements EventBuilder { applicationScope, entity, newEdge); } + if( indexService == null ){ + return Observable.just(new IndexOperationMessage()); + } + return indexService.indexEdge( applicationScope, entity, newEdge ); } @@ -98,7 +113,15 @@ public class EventBuilderImpl implements EventBuilder { final GraphManager gm = graphManagerFactory.createEdgeManager( applicationScope ); return gm.deleteEdge( edge ) - .flatMap( deletedEdge -> indexService.deleteIndexEdge( applicationScope, deletedEdge )); + .flatMap( deletedEdge -> { + + if ( indexService != null ) { + return indexService.deleteIndexEdge(applicationScope, deletedEdge); + }else{ + return Observable.just(new IndexOperationMessage()); + } + + }); } @@ -127,9 +150,14 @@ public class EventBuilderImpl implements EventBuilder { if(mostRecentlyMarked != null){ // fetch entity versions to be de-index by looking in cassandra - deIndexObservable = - indexService.deIndexEntity(applicationScope, entityId, mostRecentlyMarked.getVersion(), - getVersionsOlderThanMarked(ecm, entityId, mostRecentlyMarked.getVersion())); + if(indexService != null ) { + deIndexObservable = + indexService.deIndexEntity(applicationScope, entityId, mostRecentlyMarked.getVersion(), + getVersionsOlderThanMarked(ecm, entityId, mostRecentlyMarked.getVersion())); + } + + + ecmDeleteObservable = ecm.getVersionsFromMaxToMin( entityId, mostRecentlyMarked.getVersion() ) @@ -169,7 +197,16 @@ public class EventBuilderImpl implements EventBuilder { return modified.getValue() >= entityIndexOperation.getUpdatedSince(); } ) //perform indexing on the task scheduler and start it - .flatMap( entity -> indexService.indexEntity( applicationScope, entity ) ); + .flatMap( entity -> { + + if( indexService != null ) { + return indexService.indexEntity(applicationScope, entity); + }else{ + return Observable.just(new IndexOperationMessage()); + } + + + } ); } @@ -181,6 +218,9 @@ public class EventBuilderImpl implements EventBuilder { logger.debug("Removing old versions of entity {} from index in app scope {}", entityId, applicationScope ); } + if(indexService == null){ + return Observable.just(new IndexOperationMessage()); + } final EntityCollectionManager ecm = entityCollectionManagerFactory.createCollectionManager( applicationScope ); http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/EventServiceFig.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/EventServiceFig.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/EventServiceFig.java new file mode 100644 index 0000000..a32bcc3 --- /dev/null +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/EventServiceFig.java @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.usergrid.corepersistence.index; + + +import org.safehaus.guicyfig.Default; +import org.safehaus.guicyfig.FigSingleton; +import org.safehaus.guicyfig.GuicyFig; +import org.safehaus.guicyfig.Key; + + +/** + * Application id cache fig + */ +@FigSingleton +public interface EventServiceFig extends GuicyFig { + + + String FAILURE_REJECTED_RETRY_WAIT_TIME = "elasticsearch.rejected_retry_wait"; + + String ELASTICSEARCH_WORKER_COUNT = "elasticsearch.worker_count"; + + String EVENT_CONCURRENCY_FACTOR = "event.concurrency.factor"; + + String ELASTICSEARCH_QUEUE_IMPL = "elasticsearch.queue_impl"; + + String INDEX_QUEUE_VISIBILITY_TIMEOUT = "elasticsearch.queue_visibility_timeout"; + + String REINDEX_BUFFER_SIZE = "elasticsearch.reindex.buffer_size"; + + String REINDEX_CONCURRENCY_FACTOR = "elasticsearch.reindex.concurrency.factor"; + + + /** + * Set the amount of time to wait when Elasticsearch rejects a requests before + * retrying. This provides simple back pressure. (in milliseconds) + */ + @Default("1000") + @Key(FAILURE_REJECTED_RETRY_WAIT_TIME) + long getFailureRetryTime(); + + + /** + * Set the visibility timeout for messages received from the queue. (in milliseconds). + * Received messages will remain 'in flight' until they are ack'd(deleted) or this timeout occurs. + * If the timeout occurs, the messages will become visible again for re-processing. + */ + @Default( "30000" ) // 30 seconds + @Key( INDEX_QUEUE_VISIBILITY_TIMEOUT ) + int getIndexQueueVisibilityTimeout(); + + /** + * The number of worker threads used when handing off messages from the SQS thread + */ + @Default( "5" ) + @Key( EVENT_CONCURRENCY_FACTOR ) + int getEventConcurrencyFactor(); + + + + /** + * The number of worker threads used to read index write requests from the queue. + */ + @Default("8") + @Key(ELASTICSEARCH_WORKER_COUNT) + int getWorkerCount(); + + /** + * Set the implementation to use for queuing. + * Valid values: TEST, LOCAL, SQS, SNS + * NOTE: SQS and SNS equate to the same implementation of Amazon queue services. + */ + @Default("LOCAL") + @Key(ELASTICSEARCH_QUEUE_IMPL) + String getQueueImplementation(); + + @Default("100") + @Key(REINDEX_BUFFER_SIZE) + int getReindexBufferSize(); + + /** + * The number of parallel buffers during re-index that can be processed + */ + @Default("10") + @Key(REINDEX_CONCURRENCY_FACTOR) + int getReindexConcurrencyFactor(); + + /** + * Flag to resolve the LOCAL queue implementation service synchronously. + */ + @Default("false") + @Key("elasticsearch.queue_impl.resolution") + boolean resolveSynchronously(); + + /** + * Get the message TTL in milliseconds. Defaults to 24 hours + * + * 24 * 60 * 60 * 1000 + * + * @return + */ + @Default("86400000") + @Key( "elasticsearch.message.ttl" ) + int getIndexMessageTtl(); +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexProcessorFig.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexProcessorFig.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexProcessorFig.java deleted file mode 100644 index c05c047..0000000 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexProcessorFig.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.usergrid.corepersistence.index; - - -import org.safehaus.guicyfig.Default; -import org.safehaus.guicyfig.FigSingleton; -import org.safehaus.guicyfig.GuicyFig; -import org.safehaus.guicyfig.Key; - - -/** - * Application id cache fig - */ -@FigSingleton -public interface IndexProcessorFig extends GuicyFig { - - - String FAILURE_REJECTED_RETRY_WAIT_TIME = "elasticsearch.rejected_retry_wait"; - - String ELASTICSEARCH_WORKER_COUNT = "elasticsearch.worker_count"; - - String EVENT_CONCURRENCY_FACTOR = "event.concurrency.factor"; - - String ELASTICSEARCH_QUEUE_IMPL = "elasticsearch.queue_impl"; - - String INDEX_QUEUE_VISIBILITY_TIMEOUT = "elasticsearch.queue_visibility_timeout"; - - String REINDEX_BUFFER_SIZE = "elasticsearch.reindex.buffer_size"; - - String REINDEX_CONCURRENCY_FACTOR = "elasticsearch.reindex.concurrency.factor"; - - - /** - * Set the amount of time to wait when Elasticsearch rejects a requests before - * retrying. This provides simple back pressure. (in milliseconds) - */ - @Default("1000") - @Key(FAILURE_REJECTED_RETRY_WAIT_TIME) - long getFailureRetryTime(); - - - /** - * Set the visibility timeout for messages received from the queue. (in milliseconds). - * Received messages will remain 'in flight' until they are ack'd(deleted) or this timeout occurs. - * If the timeout occurs, the messages will become visible again for re-processing. - */ - @Default( "30000" ) // 30 seconds - @Key( INDEX_QUEUE_VISIBILITY_TIMEOUT ) - int getIndexQueueVisibilityTimeout(); - - /** - * The number of worker threads used when handing off messages from the SQS thread - */ - @Default( "5" ) - @Key( EVENT_CONCURRENCY_FACTOR ) - int getEventConcurrencyFactor(); - - - - /** - * The number of worker threads used to read index write requests from the queue. - */ - @Default("8") - @Key(ELASTICSEARCH_WORKER_COUNT) - int getWorkerCount(); - - /** - * Set the implementation to use for queuing. - * Valid values: TEST, LOCAL, SQS, SNS - * NOTE: SQS and SNS equate to the same implementation of Amazon queue services. - */ - @Default("LOCAL") - @Key(ELASTICSEARCH_QUEUE_IMPL) - String getQueueImplementation(); - - @Default("100") - @Key(REINDEX_BUFFER_SIZE) - int getReindexBufferSize(); - - /** - * The number of parallel buffers during re-index that can be processed - */ - @Default("10") - @Key(REINDEX_CONCURRENCY_FACTOR) - int getReindexConcurrencyFactor(); - - /** - * Flag to resolve the LOCAL queue implementation service synchronously. - */ - @Default("false") - @Key("elasticsearch.queue_impl.resolution") - boolean resolveSynchronously(); - - /** - * Get the message TTL in milliseconds. Defaults to 24 hours - * - * 24 * 60 * 60 * 1000 - * - * @return - */ - @Default("86400000") - @Key( "elasticsearch.message.ttl" ) - int getIndexMessageTtl(); -} http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java index 4d4edaa..4255e69 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/ReIndexServiceImpl.java @@ -78,7 +78,7 @@ public class ReIndexServiceImpl implements ReIndexService { private final AllApplicationsObservable allApplicationsObservable; private final IndexLocationStrategyFactory indexLocationStrategyFactory; private final AllEntityIdsObservable allEntityIdsObservable; - private final IndexProcessorFig indexProcessorFig; + private final EventServiceFig eventServiceFig; private final MapManager mapManager; private final MapManagerFactory mapManagerFactory; private final AsyncEventService indexService; @@ -92,14 +92,14 @@ public class ReIndexServiceImpl implements ReIndexService { final AllEntityIdsObservable allEntityIdsObservable, final MapManagerFactory mapManagerFactory, final AllApplicationsObservable allApplicationsObservable, - final IndexProcessorFig indexProcessorFig, + final EventServiceFig eventServiceFig, final CollectionSettingsFactory collectionSettingsFactory, final AsyncEventService indexService ) { this.entityIndexFactory = entityIndexFactory; this.indexLocationStrategyFactory = indexLocationStrategyFactory; this.allEntityIdsObservable = allEntityIdsObservable; this.allApplicationsObservable = allApplicationsObservable; - this.indexProcessorFig = indexProcessorFig; + this.eventServiceFig = eventServiceFig; this.indexService = indexService; this.collectionSettingsFactory = collectionSettingsFactory; this.mapManagerFactory = mapManagerFactory; @@ -164,14 +164,14 @@ public class ReIndexServiceImpl implements ReIndexService { Observable<List<EdgeScope>> runningReIndex = allEntityIdsObservable.getEdgesToEntities( applicationScopes, reIndexRequestBuilder.getCollectionName(), cursorSeek.getSeekValue() ) - .buffer( indexProcessorFig.getReindexBufferSize()) + .buffer( eventServiceFig.getReindexBufferSize()) .flatMap( edgeScopes -> Observable.just(edgeScopes) .doOnNext(edges -> { logger.info("Sending batch of {} to be indexed.", edges.size()); indexService.indexBatch(edges, modifiedSince); }) - .subscribeOn( Schedulers.io() ), indexProcessorFig.getReindexConcurrencyFactor()); + .subscribeOn( Schedulers.io() ), eventServiceFig.getReindexConcurrencyFactor()); // start our sampler and state persistence http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/PipelineModule.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/PipelineModule.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/PipelineModule.java index 66265be..2085dc4 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/PipelineModule.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/PipelineModule.java @@ -25,6 +25,8 @@ import org.apache.usergrid.corepersistence.pipeline.read.FilterFactory; import com.google.inject.AbstractModule; import com.google.inject.assistedinject.FactoryModuleBuilder; +import org.apache.usergrid.corepersistence.pipeline.read.SearchFilterFactory; +import org.apache.usergrid.system.UsergridFeatures; /** @@ -35,10 +37,18 @@ public class PipelineModule extends AbstractModule { @Override protected void configure() { - //Use Guice to create the builder since we don't really need to do anything + //Use Guice to create the builder since we don't really need to do anything //other than DI when creating the filters install( new FactoryModuleBuilder().build( FilterFactory.class ) ); + if( UsergridFeatures.isQueryFeatureEnabled() ) { + + // only inject search filters that use Elasticsearch if the UG feature is enabled + install( new FactoryModuleBuilder().build( SearchFilterFactory.class ) ); + + } + + install( new FactoryModuleBuilder().build( PipelineBuilderFactory.class ) ); } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/CandidateBuilder.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/CandidateBuilder.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/CandidateBuilder.java index 9354127..0d1e775 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/CandidateBuilder.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/CandidateBuilder.java @@ -23,6 +23,7 @@ package org.apache.usergrid.corepersistence.pipeline.builder; import org.apache.usergrid.corepersistence.pipeline.read.FilterFactory; import org.apache.usergrid.corepersistence.pipeline.Pipeline; import org.apache.usergrid.corepersistence.pipeline.read.FilterResult; +import org.apache.usergrid.corepersistence.pipeline.read.SearchFilterFactory; import org.apache.usergrid.corepersistence.pipeline.read.search.Candidate; import org.apache.usergrid.persistence.model.entity.Entity; import org.apache.usergrid.persistence.model.entity.Id; @@ -31,14 +32,17 @@ import org.apache.usergrid.persistence.model.entity.Id; public class CandidateBuilder { + private final SearchFilterFactory searchFilterFactory; private final Pipeline<FilterResult<Candidate>> pipeline; private final FilterFactory filterFactory; public CandidateBuilder( final Pipeline<FilterResult<Candidate>> pipeline, - final FilterFactory filterFactory ) { + final FilterFactory filterFactory, + final SearchFilterFactory searchFilterFactory ) { this.pipeline = pipeline; this.filterFactory = filterFactory; + this.searchFilterFactory = searchFilterFactory; } @@ -50,7 +54,7 @@ public class CandidateBuilder { final Pipeline<FilterResult<Id>> newFilter = pipeline.withFilter( filterFactory.candidateResultsIdVerifyFilter() ); - return new IdBuilder( newFilter, filterFactory ); + return new IdBuilder( newFilter, filterFactory, searchFilterFactory ); } http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/IdBuilder.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/IdBuilder.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/IdBuilder.java index 85e9069..d81bd24 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/IdBuilder.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/IdBuilder.java @@ -26,6 +26,7 @@ import org.apache.usergrid.corepersistence.pipeline.PipelineOperation; import org.apache.usergrid.corepersistence.pipeline.read.FilterFactory; import org.apache.usergrid.corepersistence.pipeline.read.FilterResult; import org.apache.usergrid.corepersistence.pipeline.read.ResultsPage; +import org.apache.usergrid.corepersistence.pipeline.read.SearchFilterFactory; import org.apache.usergrid.corepersistence.pipeline.read.collect.ConnectionRefFilter; import org.apache.usergrid.corepersistence.pipeline.read.collect.ConnectionRefResumeFilter; import org.apache.usergrid.corepersistence.pipeline.read.collect.IdResumeFilter; @@ -42,17 +43,26 @@ import rx.Observable; */ public class IdBuilder { - + private final SearchFilterFactory searchFilterFactory; private final FilterFactory filterFactory; private final Pipeline<FilterResult<Id>> pipeline; + public IdBuilder( final Pipeline<FilterResult<Id>> pipeline, final FilterFactory filterFactory, + final SearchFilterFactory searchFilterFactory ) { + this.pipeline = pipeline; + this.filterFactory = filterFactory; + this.searchFilterFactory = searchFilterFactory; + } + public IdBuilder( final Pipeline<FilterResult<Id>> pipeline, final FilterFactory filterFactory ) { this.pipeline = pipeline; this.filterFactory = filterFactory; + this.searchFilterFactory = null; } + /** * Load all the ids we encounter when traversing the graph as entities * @return @@ -74,7 +84,7 @@ public class IdBuilder { public IdBuilder traverseReverseConnection( final String connectionName, final Optional<String> entityType ) { final PipelineOperation<FilterResult<Id>, FilterResult<Id>> filter; filter = filterFactory.readGraphReverseConnectionFilter( connectionName ); - return new IdBuilder( pipeline.withFilter(filter ), filterFactory ); + return new IdBuilder( pipeline.withFilter(filter ), filterFactory, searchFilterFactory ); } @@ -87,7 +97,7 @@ public class IdBuilder { final Pipeline<FilterResult<Id>> newFilter = pipeline.withFilter( filterFactory.readGraphCollectionFilter( collectionName ) ); - return new IdBuilder( newFilter, filterFactory ); + return new IdBuilder( newFilter, filterFactory, searchFilterFactory ); } @@ -108,7 +118,7 @@ public class IdBuilder { } - return new IdBuilder( pipeline.withFilter(filter ), filterFactory ); + return new IdBuilder( pipeline.withFilter(filter ), filterFactory, searchFilterFactory ); } @@ -121,10 +131,10 @@ public class IdBuilder { */ public CandidateBuilder searchCollection( final String collectionName, final String ql, final String entityType ) { - final Pipeline<FilterResult<Candidate>> newFilter = pipeline.withFilter( filterFactory.searchCollectionFilter( + final Pipeline<FilterResult<Candidate>> newFilter = pipeline.withFilter( searchFilterFactory.searchCollectionFilter( ql, collectionName, entityType ) ); - return new CandidateBuilder( newFilter, filterFactory ); + return new CandidateBuilder( newFilter, filterFactory, searchFilterFactory ); } @@ -138,10 +148,10 @@ public class IdBuilder { public CandidateBuilder searchConnection( final String connectionName, final String ql , final Optional<String> entityType) { - final Pipeline<FilterResult<Candidate>> newFilter = pipeline.withFilter( filterFactory.searchConnectionFilter( + final Pipeline<FilterResult<Candidate>> newFilter = pipeline.withFilter( searchFilterFactory.searchConnectionFilter( ql, connectionName, entityType ) ); - return new CandidateBuilder( newFilter, filterFactory ); + return new CandidateBuilder( newFilter, filterFactory, searchFilterFactory ); } http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/PipelineBuilder.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/PipelineBuilder.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/PipelineBuilder.java index f1a44ea..14c94a2 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/PipelineBuilder.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/PipelineBuilder.java @@ -20,9 +20,11 @@ package org.apache.usergrid.corepersistence.pipeline.builder; +import com.google.inject.Injector; import org.apache.usergrid.corepersistence.pipeline.read.FilterFactory; import org.apache.usergrid.corepersistence.pipeline.Pipeline; import org.apache.usergrid.corepersistence.pipeline.read.FilterResult; +import org.apache.usergrid.corepersistence.pipeline.read.SearchFilterFactory; import org.apache.usergrid.persistence.core.scope.ApplicationScope; import org.apache.usergrid.persistence.model.entity.Id; @@ -30,6 +32,7 @@ import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; +import org.apache.usergrid.system.UsergridFeatures; /** @@ -38,12 +41,12 @@ import com.google.inject.assistedinject.Assisted; */ public class PipelineBuilder { - - private final ApplicationScope applicationScope; private Optional<String> cursor = Optional.absent(); private int limit = 10; private final FilterFactory filterFactory; + private SearchFilterFactory searchFilterFactory = null; + private final Injector injector; /** @@ -51,9 +54,19 @@ public class PipelineBuilder { * @param filterFactory */ @Inject - public PipelineBuilder( final FilterFactory filterFactory, @Assisted final ApplicationScope applicationScope ) { + public PipelineBuilder( final FilterFactory filterFactory, @Assisted final ApplicationScope applicationScope, + final Injector injector ) { this.filterFactory = filterFactory; this.applicationScope = applicationScope; + this.injector = injector; + + if(UsergridFeatures.isQueryFeatureEnabled()) { + + this.searchFilterFactory = injector.getInstance(SearchFilterFactory.class); + + } + + } http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/FilterFactory.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/FilterFactory.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/FilterFactory.java index 4b615d8..06c49e2 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/FilterFactory.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/FilterFactory.java @@ -88,29 +88,6 @@ public interface FilterFactory { */ ReadGraphConnectionByIdFilter readGraphConnectionByIdFilter( final String connectionName, final Id targetId ); - /** - * Generate a new instance of the command with the specified parameters - * - * @param query The query to use when querying the entities in the collection - * @param collectionName The collection name to use when querying - */ - SearchCollectionFilter searchCollectionFilter( @Assisted( "query" ) final String query, - @Assisted( "collectionName" ) final String collectionName, - @Assisted( "entityType" ) final String entityType ); - - - /** - * Generate a new instance of the command with the specified parameters - * - * @param query The query to use when querying the entities in the connection - * @param connectionName The type of connection to query - * @param connectedEntityType The type of entity in the connection. Leave absent to query all entity types - */ - SearchConnectionFilter searchConnectionFilter( @Assisted( "query" ) final String query, - @Assisted( "connectionName" ) final String connectionName, - @Assisted( "connectedEntityType" ) - final Optional<String> connectedEntityType ); - /** * Generate a new instance of the command with the specified parameters http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/SearchFilterFactory.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/SearchFilterFactory.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/SearchFilterFactory.java new file mode 100644 index 0000000..3f19cd5 --- /dev/null +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/SearchFilterFactory.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.usergrid.corepersistence.pipeline.read; + +import com.google.common.base.Optional; +import com.google.inject.assistedinject.Assisted; +import org.apache.usergrid.corepersistence.pipeline.read.search.SearchCollectionFilter; +import org.apache.usergrid.corepersistence.pipeline.read.search.SearchConnectionFilter; + +/** + * Created by russo on 9/2/16. + */ +public interface SearchFilterFactory { + + /** + * Generate a new instance of the command with the specified parameters + * + * @param query The query to use when querying the entities in the collection + * @param collectionName The collection name to use when querying + */ + SearchCollectionFilter searchCollectionFilter(@Assisted( "query" ) final String query, + @Assisted( "collectionName" ) final String collectionName, + @Assisted( "entityType" ) final String entityType ); + + + /** + * Generate a new instance of the command with the specified parameters + * + * @param query The query to use when querying the entities in the connection + * @param connectionName The type of connection to query + * @param connectedEntityType The type of entity in the connection. Leave absent to query all entity types + */ + SearchConnectionFilter searchConnectionFilter(@Assisted( "query" ) final String query, + @Assisted( "connectionName" ) final String connectionName, + @Assisted( "connectedEntityType" ) + final Optional<String> connectedEntityType ); +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/CandidateEntityFilter.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/CandidateEntityFilter.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/CandidateEntityFilter.java index 7770436..c7b8a4e 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/CandidateEntityFilter.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/CandidateEntityFilter.java @@ -22,6 +22,7 @@ package org.apache.usergrid.corepersistence.pipeline.read.search; import java.util.*; +import com.google.inject.Injector; import org.apache.usergrid.corepersistence.index.IndexLocationStrategyFactory; import org.apache.usergrid.persistence.index.*; import org.apache.usergrid.persistence.index.impl.IndexProducer; @@ -30,6 +31,7 @@ import org.apache.usergrid.persistence.model.field.DoubleField; import org.apache.usergrid.persistence.model.field.EntityObjectField; import org.apache.usergrid.persistence.model.field.Field; import org.apache.usergrid.persistence.model.field.value.EntityObject; +import org.apache.usergrid.system.UsergridFeatures; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,21 +61,28 @@ import rx.Observable; public class CandidateEntityFilter extends AbstractFilter<FilterResult<Candidate>, FilterResult<Entity>> { private final EntityCollectionManagerFactory entityCollectionManagerFactory; - private final EntityIndexFactory entityIndexFactory; - private final IndexLocationStrategyFactory indexLocationStrategyFactory; - private final IndexProducer indexProducer; + private EntityIndexFactory entityIndexFactory = null; + private IndexLocationStrategyFactory indexLocationStrategyFactory; + private IndexProducer indexProducer = null; + private final Injector injector; @Inject - public CandidateEntityFilter( final EntityCollectionManagerFactory entityCollectionManagerFactory, - final EntityIndexFactory entityIndexFactory, - final IndexLocationStrategyFactory indexLocationStrategyFactory, - final IndexProducer indexProducer - ) { + public CandidateEntityFilter(final EntityCollectionManagerFactory entityCollectionManagerFactory, + final Injector injector ) { + this.entityCollectionManagerFactory = entityCollectionManagerFactory; - this.entityIndexFactory = entityIndexFactory; - this.indexLocationStrategyFactory = indexLocationStrategyFactory; - this.indexProducer = indexProducer; + this.injector = injector; + + + if(UsergridFeatures.isQueryFeatureEnabled()) { + + this.entityIndexFactory = this.injector.getInstance(EntityIndexFactory.class); + this.indexProducer = this.injector.getInstance(IndexProducer.class); + this.indexLocationStrategyFactory = this.injector.getInstance(IndexLocationStrategyFactory.class); + + + } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/CandidateIdFilter.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/CandidateIdFilter.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/CandidateIdFilter.java index 96849f8..5cfbfa3 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/CandidateIdFilter.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/CandidateIdFilter.java @@ -24,9 +24,11 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; +import com.google.inject.Injector; import org.apache.usergrid.corepersistence.index.IndexLocationStrategyFactory; import org.apache.usergrid.persistence.index.*; import org.apache.usergrid.persistence.index.impl.IndexProducer; +import org.apache.usergrid.system.UsergridFeatures; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,20 +54,26 @@ import rx.Observable; public class CandidateIdFilter extends AbstractFilter<FilterResult<Candidate>, FilterResult<Id>> { private final EntityCollectionManagerFactory entityCollectionManagerFactory; - private final EntityIndexFactory entityIndexFactory; - private final IndexLocationStrategyFactory indexLocationStrategyFactory; - private final IndexProducer indexProducer; + private EntityIndexFactory entityIndexFactory = null; + private IndexLocationStrategyFactory indexLocationStrategyFactory; + private IndexProducer indexProducer = null; + private final Injector injector; @Inject public CandidateIdFilter( final EntityCollectionManagerFactory entityCollectionManagerFactory, - final EntityIndexFactory entityIndexFactory, - final IndexLocationStrategyFactory indexLocationStrategyFactory, - final IndexProducer indexProducer) { + final Injector injector ) { + + this.injector = injector; this.entityCollectionManagerFactory = entityCollectionManagerFactory; - this.entityIndexFactory = entityIndexFactory; - this.indexLocationStrategyFactory = indexLocationStrategyFactory; - this.indexProducer = indexProducer; + + if (UsergridFeatures.isQueryFeatureEnabled()) { + + this.entityIndexFactory = this.injector.getInstance(EntityIndexFactory.class); + this.indexProducer = this.injector.getInstance(IndexProducer.class); + this.indexLocationStrategyFactory = this.injector.getInstance(IndexLocationStrategyFactory.class); + + } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/persistence/Query.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/Query.java b/stack/core/src/main/java/org/apache/usergrid/persistence/Query.java index d68c085..08b8f9c 100644 --- a/stack/core/src/main/java/org/apache/usergrid/persistence/Query.java +++ b/stack/core/src/main/java/org/apache/usergrid/persistence/Query.java @@ -31,6 +31,7 @@ import org.apache.usergrid.persistence.index.query.tree.Operand; import org.apache.usergrid.persistence.index.utils.ClassUtils; import org.apache.usergrid.persistence.index.utils.ListUtils; import org.apache.usergrid.persistence.index.utils.MapUtils; +import org.apache.usergrid.system.UsergridFeatures; import java.io.IOException; import java.io.Serializable; @@ -42,8 +43,6 @@ import java.util.Map.Entry; public class Query { - - public enum Level { IDS, REFS, CORE_PROPERTIES, ALL_PROPERTIES, LINKED_PROPERTIES } @@ -199,6 +198,12 @@ public class Query { List<CounterFilterPredicate> counterFilters = null; String ql = QueryUtils.queryStrFrom( params ); + final boolean queryFeatureEnabled = UsergridFeatures.isQueryFeatureEnabled(); + + if( StringUtils.isNotEmpty(ql) && (!queryFeatureEnabled && !ql.equalsIgnoreCase("select *")) ){ + throw new UnsupportedOperationException("Query features are not enabled."); + } + String type = ListUtils.first( params.get( "type" ) ); Boolean reversed = ListUtils.firstBoolean( params.get( "reversed" ) ); String connection = ListUtils.first( params.get( "connectionType" ) ); http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/main/java/org/apache/usergrid/system/UsergridFeatures.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/system/UsergridFeatures.java b/stack/core/src/main/java/org/apache/usergrid/system/UsergridFeatures.java new file mode 100644 index 0000000..22ba48c --- /dev/null +++ b/stack/core/src/main/java/org/apache/usergrid/system/UsergridFeatures.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.usergrid.system; + + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class UsergridFeatures { + + public static final String USERGRID_FEATURES_ENABLED_PROP = "usergrid.features.enabled"; + + public enum Feature { + + ALL, GRAPH, KVM + + } + + + public static Collection<Feature> getFeaturesEnabled(){ + + List<Feature> features = new ArrayList<>(); + + String featureString = System.getProperty(USERGRID_FEATURES_ENABLED_PROP, "all"); + + String[] splitFeatures = featureString.split(","); + for(String feature : splitFeatures){ + + features.add(Feature.valueOf(feature.toUpperCase())); + + } + + return features; + + } + + public static boolean isGraphFeatureEnabled(){ + + return getFeaturesEnabled().contains(Feature.ALL) || getFeaturesEnabled().contains(Feature.GRAPH); + + } + + public static boolean isQueryFeatureEnabled(){ + + return getFeaturesEnabled().contains(Feature.ALL); + + } + + public static boolean isKvmFeatureEnabled(){ + + return getFeaturesEnabled().contains(Feature.KVM); + + } +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/AsyncEventServiceImplTest.java ---------------------------------------------------------------------- diff --git a/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/AsyncEventServiceImplTest.java b/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/AsyncEventServiceImplTest.java index 4c0058b..0ec28b5 100644 --- a/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/AsyncEventServiceImplTest.java +++ b/stack/core/src/test/java/org/apache/usergrid/corepersistence/index/AsyncEventServiceImplTest.java @@ -21,6 +21,7 @@ package org.apache.usergrid.corepersistence.index; import com.google.inject.Inject; +import com.google.inject.Injector; import net.jcip.annotations.NotThreadSafe; import org.apache.usergrid.corepersistence.TestIndexModule; import org.apache.usergrid.corepersistence.asyncevents.AsyncEventService; @@ -56,7 +57,7 @@ public class AsyncEventServiceImplTest extends AsyncIndexServiceTest { public QueueManagerFactory queueManagerFactory; @Inject - public IndexProcessorFig indexProcessorFig; + public EventServiceFig eventServiceFig; @Inject public QueueFig queueFig; @@ -84,9 +85,14 @@ public class AsyncEventServiceImplTest extends AsyncIndexServiceTest { @Inject public EntityIndexFactory entityIndexFactory; + @Inject + public Injector injector; + @Override protected AsyncEventService getAsyncEventService() { - return new AsyncEventServiceImpl( queueManagerFactory, indexProcessorFig, indexProducer, metricsFactory, entityCollectionManagerFactory, indexLocationStrategyFactory, entityIndexFactory, eventBuilder, mapManagerFactory, queueFig, rxTaskScheduler ); + return new AsyncEventServiceImpl( queueManagerFactory, eventServiceFig, metricsFactory, + entityCollectionManagerFactory, entityIndexFactory, eventBuilder, + mapManagerFactory, queueFig, rxTaskScheduler, injector ); } http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java index f926d1e..71aa3b0 100644 --- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java +++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DataStaxClusterImpl.java @@ -185,7 +185,8 @@ public class DataStaxClusterImpl implements DataStaxCluster { .withPoolingOptions(poolingOptions) .withQueryOptions(queryOptions) .withSocketOptions(socketOptions) - .withProtocolVersion(getProtocolVersion(cassandraFig.getVersion())); + .withProtocolVersion(getProtocolVersion(cassandraFig.getVersion())) + .withTimestampGenerator(new AtomicMonotonicTimestampGenerator()); // only add auth credentials if they were provided if ( !cassandraFig.getUsername().isEmpty() && !cassandraFig.getPassword().isEmpty() ){ http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/corepersistence/pom.xml ---------------------------------------------------------------------- diff --git a/stack/corepersistence/pom.xml b/stack/corepersistence/pom.xml index fe976bc..e76bc98 100644 --- a/stack/corepersistence/pom.xml +++ b/stack/corepersistence/pom.xml @@ -80,11 +80,11 @@ limitations under the License. <commons.collections.version>3.2.1</commons.collections.version> <commons.io.version>2.4</commons.io.version> <commons.lang.version>3.1</commons.lang.version> - <datastax.version>2.1.9</datastax.version> + <datastax.version>2.1.10.3</datastax.version> <elasticsearch.version>1.4.4</elasticsearch.version> <fasterxml-uuid.version>3.1.3</fasterxml-uuid.version> <guava.version>18.0</guava.version> - <guice.version>4.0-beta5</guice.version> + <guice.version>4.0</guice.version> <guicyfig.version>3.2</guicyfig.version> <hystrix.version>1.4.0</hystrix.version> <jackson-2-version>2.4.1</jackson-2-version> http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/guice/IndexModule.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/guice/IndexModule.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/guice/IndexModule.java index b828934..04b8959 100644 --- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/guice/IndexModule.java +++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/guice/IndexModule.java @@ -44,9 +44,7 @@ public abstract class IndexModule extends AbstractModule { // install our configuration install(new GuicyFigModule(IndexFig.class)); - install(new MapModule()); - install(new QueueModule()); bind( EntityIndexFactory.class ).to( EsEntityIndexFactoryImpl.class ); bind(IndexCache.class).to(EsIndexCacheImpl.class); http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/pom.xml ---------------------------------------------------------------------- diff --git a/stack/pom.xml b/stack/pom.xml index 5186a13..15d1499 100644 --- a/stack/pom.xml +++ b/stack/pom.xml @@ -102,7 +102,7 @@ <aws.version>1.10.20</aws.version> <cassandra-version>1.2.18</cassandra-version> <guava.version>18.0</guava.version> - <guice.version>4.0-beta5</guice.version> + <guice.version>4.0</guice.version> <hector-om-version>3.0-03</hector-om-version> <hector-version>1.1-4</hector-version> <hector-test-version>1.1-4</hector-test-version> http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/query-validator/src/test/java/org/apache/usergrid/query/validator/users/UserQueryIT.java ---------------------------------------------------------------------- diff --git a/stack/query-validator/src/test/java/org/apache/usergrid/query/validator/users/UserQueryIT.java b/stack/query-validator/src/test/java/org/apache/usergrid/query/validator/users/UserQueryIT.java index 445d153..027dc56 100644 --- a/stack/query-validator/src/test/java/org/apache/usergrid/query/validator/users/UserQueryIT.java +++ b/stack/query-validator/src/test/java/org/apache/usergrid/query/validator/users/UserQueryIT.java @@ -17,10 +17,8 @@ package org.apache.usergrid.query.validator.users; import net.jcip.annotations.NotThreadSafe; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; +import org.apache.usergrid.system.UsergridFeatures; +import org.junit.*; import org.apache.usergrid.persistence.Entity; import org.apache.usergrid.query.validator.AbstractQueryIT; import org.apache.usergrid.query.validator.QueryRequest; @@ -30,6 +28,10 @@ import org.apache.usergrid.utils.StringUtils; import java.util.List; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assume.assumeThat; +import static org.junit.Assume.assumeTrue; + /** * @author Sungju Jin @@ -42,6 +44,15 @@ public class UserQueryIT extends AbstractQueryIT { createInitializationDatas("user"); } + @Before + public void checkFeatures(){ + + assumeTrue(UsergridFeatures.isQueryFeatureEnabled()); + + } + + + @Test public void sexEqualAndNameEqual() { String sqlite = "SELECT * FROM users WHERE sex = 'male' and name = 'judekim' LIMIT 10"; http://git-wip-us.apache.org/repos/asf/usergrid/blob/5b42c0a6/stack/rest/src/main/java/org/apache/usergrid/rest/AbstractContextResource.java ---------------------------------------------------------------------- diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/AbstractContextResource.java b/stack/rest/src/main/java/org/apache/usergrid/rest/AbstractContextResource.java index 8f5d549..6133a90 100644 --- a/stack/rest/src/main/java/org/apache/usergrid/rest/AbstractContextResource.java +++ b/stack/rest/src/main/java/org/apache/usergrid/rest/AbstractContextResource.java @@ -125,6 +125,9 @@ public abstract class AbstractContextResource { logger.trace("getSubResource: {}", t.getCanonicalName()); } T subResource = resourceContext.getResource(t); + if(!subResource.isEnabled()){ + return null; + } subResource.setParent(this); return subResource; } @@ -275,4 +278,10 @@ public abstract class AbstractContextResource { } return false; } + + public boolean isEnabled(){ + + return true; + + } }
