You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sf...@apache.org on 2015/03/19 17:13:50 UTC

incubator-usergrid git commit: add application entity index

Repository: incubator-usergrid
Updated Branches:
  refs/heads/USERGRID-480 5ea81945b -> 679812e6d
Updated Tags:  refs/tags/help [created] d901d38ca


add application entity index


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/679812e6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/679812e6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/679812e6

Branch: refs/heads/USERGRID-480
Commit: 679812e6dbb52f1ab3b303adfe209167b3b25f7f
Parents: 5ea8194
Author: Shawn Feldman <sf...@apache.org>
Authored: Thu Mar 19 10:13:48 2015 -0600
Committer: Shawn Feldman <sf...@apache.org>
Committed: Thu Mar 19 10:13:48 2015 -0600

----------------------------------------------------------------------
 .../usergrid/corepersistence/ManagerCache.java  |   3 +-
 .../index/ApplicationEntityIndex.java           |  42 +++
 .../usergrid/persistence/index/EntityIndex.java |  25 +-
 .../persistence/index/EntityIndexFactory.java   |   2 +-
 .../persistence/index/IndexIdentifier.java      |   9 +-
 .../persistence/index/guice/IndexModule.java    |   5 +-
 .../impl/EsApplicationEntityIndexImpl.java      | 305 ++++++++++++++++
 .../index/impl/EsEntityIndexBatchImpl.java      |   8 +-
 .../index/impl/EsEntityIndexFactoryImpl.java    |  27 +-
 .../index/impl/EsEntityIndexImpl.java           | 351 ++-----------------
 .../persistence/index/impl/IndexingUtils.java   |  15 -
 .../index/impl/CorePerformanceIT.java           |  20 +-
 .../impl/EntityConnectionIndexImplTest.java     |  20 +-
 .../persistence/index/impl/EntityIndexTest.java |  92 +++--
 14 files changed, 461 insertions(+), 463 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/679812e6/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 c1b7b95..d747f55 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
@@ -24,6 +24,7 @@ import org.apache.usergrid.persistence.collection.CollectionScope;
 import org.apache.usergrid.persistence.collection.EntityCollectionManager;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.graph.GraphManager;
+import org.apache.usergrid.persistence.index.ApplicationEntityIndex;
 import org.apache.usergrid.persistence.index.EntityIndex;
 import org.apache.usergrid.persistence.map.MapManager;
 import org.apache.usergrid.persistence.map.MapScope;
@@ -45,7 +46,7 @@ public interface ManagerCache {
      * @param appScope
      * @return
      */
-    EntityIndex getEntityIndex( ApplicationScope appScope );
+    ApplicationEntityIndex getEntityIndex( ApplicationScope appScope );
 
     /**
      * Get the graph manager for the graph scope

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/679812e6/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/ApplicationEntityIndex.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/ApplicationEntityIndex.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/ApplicationEntityIndex.java
new file mode 100644
index 0000000..fab32b3
--- /dev/null
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/ApplicationEntityIndex.java
@@ -0,0 +1,42 @@
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  *  contributor license agreements.  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.  For additional information regarding
+ *  * copyright in this work, please see the NOTICE file in the top level
+ *  * directory of this distribution.
+ *
+ */
+package org.apache.usergrid.persistence.index;
+
+import org.apache.usergrid.persistence.index.query.CandidateResults;
+import org.apache.usergrid.persistence.index.query.Query;
+import rx.Observable;
+
+/**
+ * Classy class class.
+ */
+public interface ApplicationEntityIndex {
+
+
+    /**
+     * Create the index batch.
+     */
+    public EntityIndexBatch createBatch();
+
+
+    /**
+     * Execute query in Usergrid syntax.
+     */
+    public CandidateResults search(final IndexScope indexScope, final SearchTypes searchType, Query query );
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/679812e6/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndex.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndex.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndex.java
index db4b50d..521a4e7 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndex.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndex.java
@@ -26,13 +26,14 @@ import org.apache.usergrid.persistence.index.query.Query;
 import org.apache.usergrid.persistence.index.query.CandidateResults;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.elasticsearch.action.ListenableActionFuture;
+import rx.Observable;
 
 import java.util.Map;
 import java.util.concurrent.Future;
 
 
 /**
- * Provides indexing of Entities within a scope.
+ * Provides management operations for single index
  */
 public interface EntityIndex {
 
@@ -41,12 +42,6 @@ public interface EntityIndex {
      * Otherwise we're introducing slowness into our system
      */
     public void initializeIndex();
-
-    /**
-     * Delete the index from ES
-     */
-    public ListenableActionFuture deleteIndex();
-
     /**
      * Create an index and add to alias, will create alias and remove any old index from write alias if alias already exists
      * @param indexSuffix index name
@@ -56,27 +51,13 @@ public interface EntityIndex {
      */
     public void addIndex(final String indexSuffix, final int shards, final int replicas, final String writeConsistency);
 
-    /**
-     * Create the index batch.
-     */
-    public EntityIndexBatch createBatch();
-
-
-    /**
-     * Execute query in Usergrid syntax.
-     */
-    public CandidateResults search(final IndexScope indexScope, final SearchTypes searchType, Query query );
 
     /**
      * Refresh the index.
      */
     public void refresh();
 
-    /**
-     * Return the number of pending tasks in the cluster
-     * @return
-     */
-    public int getPendingTasks();
+
 
     /**
      * Check health of cluster.

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/679812e6/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndexFactory.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndexFactory.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndexFactory.java
index 10752d1..1c594e7 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndexFactory.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndexFactory.java
@@ -25,7 +25,7 @@ import com.google.inject.assistedinject.Assisted;
 
 public interface EntityIndexFactory {
 
-    public EntityIndex createEntityIndex(
+    public ApplicationEntityIndex createApplicationEntityIndex(
         @Assisted ApplicationScope appScope);
 
     void invalidate();

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/679812e6/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexIdentifier.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexIdentifier.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexIdentifier.java
index 8465d84..1ac9d49 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexIdentifier.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/IndexIdentifier.java
@@ -20,19 +20,14 @@
 
 package org.apache.usergrid.persistence.index;
 
-import org.apache.usergrid.persistence.core.scope.ApplicationScope;
-import org.apache.usergrid.persistence.index.impl.IndexingUtils;
-
 /**
  * Class is used to generate an index name and alias name
  */
 public class IndexIdentifier{
     private final IndexFig config;
-    private final ApplicationScope applicationScope;
 
-    public IndexIdentifier(IndexFig config, ApplicationScope applicationScope) {
+    public IndexIdentifier(IndexFig config) {
         this.config = config;
-        this.applicationScope = applicationScope;
     }
 
     /**
@@ -76,7 +71,7 @@ public class IndexIdentifier{
     }
 
     public String toString() {
-        return "application: " + applicationScope.getApplication().getUuid();
+        return "index id"+config.getIndexPrefix();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/679812e6/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 95f3bd4..c9125c5 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
@@ -45,8 +45,11 @@ public class IndexModule extends AbstractModule {
         install(new MapModule());
         install(new QueueModule());
 
-
         bind(EntityIndexFactory.class).to( EsEntityIndexFactoryImpl.class );
+        bind(AliasedEntityIndex.class).to(EsEntityIndexImpl.class);
+        bind(EntityIndex.class).to(EsEntityIndexImpl.class);
+        bind(IndexIdentifier.class);
+
 
         bind(IndexBufferProducer.class).to(EsIndexBufferProducerImpl.class);
         bind(IndexBufferConsumer.class).to(EsIndexBufferConsumerImpl.class).asEagerSingleton();

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/679812e6/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsApplicationEntityIndexImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsApplicationEntityIndexImpl.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsApplicationEntityIndexImpl.java
new file mode 100644
index 0000000..f8ed107
--- /dev/null
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsApplicationEntityIndexImpl.java
@@ -0,0 +1,305 @@
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  *  contributor license agreements.  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.  For additional information regarding
+ *  * copyright in this work, please see the NOTICE file in the top level
+ *  * directory of this distribution.
+ *
+ */
+package org.apache.usergrid.persistence.index.impl;
+
+import com.codahale.metrics.Meter;
+import com.codahale.metrics.Timer;
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
+import org.apache.usergrid.persistence.core.scope.ApplicationScope;
+import org.apache.usergrid.persistence.core.util.ValidationUtils;
+import org.apache.usergrid.persistence.index.*;
+import org.apache.usergrid.persistence.index.query.CandidateResult;
+import org.apache.usergrid.persistence.index.query.CandidateResults;
+import org.apache.usergrid.persistence.index.query.Query;
+import org.apache.usergrid.persistence.map.MapManager;
+import org.apache.usergrid.persistence.map.MapManagerFactory;
+import org.apache.usergrid.persistence.map.MapScope;
+import org.apache.usergrid.persistence.map.impl.MapScopeImpl;
+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.elasticsearch.action.ActionListener;
+import org.elasticsearch.action.ListenableActionFuture;
+import org.elasticsearch.action.ShardOperationFailedException;
+import org.elasticsearch.action.deletebyquery.DeleteByQueryResponse;
+import org.elasticsearch.action.deletebyquery.IndexDeleteByQueryResponse;
+import org.elasticsearch.action.search.SearchRequestBuilder;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.action.search.SearchScrollRequestBuilder;
+import org.elasticsearch.index.query.FilterBuilder;
+import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.index.query.TermQueryBuilder;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.SearchHits;
+import org.elasticsearch.search.sort.FieldSortBuilder;
+import org.elasticsearch.search.sort.SortBuilders;
+import org.elasticsearch.search.sort.SortOrder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import rx.Observable;
+import rx.functions.Action1;
+import rx.schedulers.Schedulers;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import static org.apache.usergrid.persistence.index.impl.IndexingUtils.*;
+import static org.apache.usergrid.persistence.index.impl.IndexingUtils.SPLITTER;
+
+/**
+ * Classy class class.
+ */
+public class EsApplicationEntityIndexImpl implements ApplicationEntityIndex{
+
+    private static final Logger logger = LoggerFactory.getLogger(EsApplicationEntityIndexImpl.class);
+
+    private final ApplicationScope applicationScope;
+    private final IndexIdentifier indexIdentifier;
+    private final Timer searchTimer;
+    private final Timer cursorTimer;
+    private final MapManager mapManager;
+    private final AliasedEntityIndex entityIndex;
+    private final IndexBufferProducer indexBatchBufferProducer;
+    private final EsIndexCache indexCache;
+    private final IndexFig indexFig;
+    private final EsProvider esProvider;
+    private final IndexIdentifier.IndexAlias alias;
+    private FailureMonitor failureMonitor;
+    private final int cursorTimeout;
+    @Inject
+    public EsApplicationEntityIndexImpl(@Assisted ApplicationScope appScope, final AliasedEntityIndex entityIndex,  final IndexFig config,
+                                        final IndexBufferProducer indexBatchBufferProducer, final EsProvider provider,
+                                        final EsIndexCache indexCache, final MetricsFactory metricsFactory,
+                                        final MapManagerFactory mapManagerFactory, final IndexFig indexFig, final IndexIdentifier indexIdentifier){
+        this.entityIndex = entityIndex;
+        this.indexBatchBufferProducer = indexBatchBufferProducer;
+        this.indexCache = indexCache;
+        this.indexFig = indexFig;
+        this.indexIdentifier = indexIdentifier;
+        ValidationUtils.validateApplicationScope(appScope);
+        this.applicationScope = appScope;
+        final MapScope mapScope = new MapScopeImpl(appScope.getApplication(), "cursorcache");
+        this.failureMonitor = new FailureMonitorImpl(config, provider);
+        this.esProvider = provider;
+
+        mapManager = mapManagerFactory.createMapManager(mapScope);
+        this.searchTimer = metricsFactory
+            .getTimer(EsEntityIndexImpl.class, "search.timer");
+        this.cursorTimer = metricsFactory
+            .getTimer(EsEntityIndexImpl.class, "search.cursor.timer");
+        this.cursorTimeout = config.getQueryCursorTimeout();
+
+        this.alias = indexIdentifier.getAlias();
+
+    }
+
+    @Override
+    public EntityIndexBatch createBatch() {
+        EntityIndexBatch batch = new EsEntityIndexBatchImpl(
+            applicationScope, indexBatchBufferProducer, entityIndex, indexIdentifier );
+        return batch;
+    }
+
+    @Override
+    public CandidateResults search(final IndexScope indexScope, final SearchTypes searchTypes,
+                                   final Query query ) {
+
+        final String context = IndexingUtils.createContextName(indexScope);
+        final String[] entityTypes = searchTypes.getTypeNames(applicationScope);
+        QueryBuilder qb = query.createQueryBuilder(context);
+        SearchResponse searchResponse;
+
+        if ( query.getCursor() == null ) {
+            SearchRequestBuilder srb = esProvider.getClient().prepareSearch( alias.getReadAlias() )
+                .setTypes(entityTypes)
+                .setScroll(cursorTimeout + "m")
+                .setQuery(qb);
+
+            final FilterBuilder fb = query.createFilterBuilder();
+
+            //we have post filters, apply them
+            if ( fb != null ) {
+                logger.debug( "   Filter: {} ", fb.toString() );
+                srb = srb.setPostFilter( fb );
+            }
+
+
+            srb = srb.setFrom( 0 ).setSize( query.getLimit() );
+
+            for ( Query.SortPredicate sp : query.getSortPredicates() ) {
+
+                final SortOrder order;
+                if ( sp.getDirection().equals( Query.SortDirection.ASCENDING ) ) {
+                    order = SortOrder.ASC;
+                }
+                else {
+                    order = SortOrder.DESC;
+                }
+
+                // we do not know the type of the "order by" property and so we do not know what
+                // type prefix to use. So, here we add an order by clause for every possible type
+                // that you can order by: string, number and boolean and we ask ElasticSearch
+                // to ignore any fields that are not present.
+
+                final String stringFieldName = STRING_PREFIX + sp.getPropertyName();
+                final FieldSortBuilder stringSort = SortBuilders.fieldSort(stringFieldName)
+                    .order( order ).ignoreUnmapped( true );
+                srb.addSort( stringSort );
+
+                logger.debug( "   Sort: {} order by {}", stringFieldName, order.toString() );
+
+                final String longFieldName = LONG_PREFIX + sp.getPropertyName();
+                final FieldSortBuilder longSort = SortBuilders.fieldSort( longFieldName )
+                    .order( order ).ignoreUnmapped( true );
+                srb.addSort( longSort );
+                logger.debug( "   Sort: {} order by {}", longFieldName, order.toString() );
+
+
+                final String doubleFieldName = DOUBLE_PREFIX + sp.getPropertyName();
+                final FieldSortBuilder doubleSort = SortBuilders.fieldSort( doubleFieldName )
+                    .order( order ).ignoreUnmapped( true );
+                srb.addSort( doubleSort );
+                logger.debug( "   Sort: {} order by {}", doubleFieldName, order.toString() );
+
+
+                final String booleanFieldName = BOOLEAN_PREFIX + sp.getPropertyName();
+                final FieldSortBuilder booleanSort = SortBuilders.fieldSort( booleanFieldName )
+                    .order( order ).ignoreUnmapped( true );
+                srb.addSort( booleanSort );
+                logger.debug( "   Sort: {} order by {}", booleanFieldName, order.toString() );
+            }
+
+
+            if ( logger.isDebugEnabled() ) {
+                logger.debug( "Searching index (read alias): {}\n  scope: {} \n type: {}\n   query: {} ",
+                    this.alias.getReadAlias(), context, entityTypes, srb );
+            }
+
+            try {
+                //Added For Graphite Metrics
+                Timer.Context timeSearch = searchTimer.time();
+                searchResponse = srb.execute().actionGet();
+                timeSearch.stop();
+            }
+            catch ( Throwable t ) {
+                logger.error( "Unable to communicate with Elasticsearch", t );
+                failureMonitor.fail( "Unable to execute batch", t );
+                throw t;
+            }
+
+
+            failureMonitor.success();
+        }
+        else {
+            String userCursorString = query.getCursor();
+            if ( userCursorString.startsWith( "\"" ) ) {
+                userCursorString = userCursorString.substring( 1 );
+            }
+            if ( userCursorString.endsWith( "\"" ) ) {
+                userCursorString = userCursorString.substring( 0, userCursorString.length() - 1 );
+            }
+
+            //now get the cursor from the map  and validate
+            final String esScrollCursor  = mapManager.getString( userCursorString );
+
+            Preconditions.checkArgument(esScrollCursor != null, "Could not find a cursor for the value '{}' ", esScrollCursor);
+
+
+
+            logger.debug( "Executing query with cursor: {} ", esScrollCursor );
+
+
+            SearchScrollRequestBuilder ssrb = esProvider.getClient()
+                .prepareSearchScroll(esScrollCursor).setScroll( cursorTimeout + "m" );
+
+            try {
+                //Added For Graphite Metrics
+                Timer.Context timeSearchCursor = cursorTimer.time();
+                searchResponse = ssrb.execute().actionGet();
+                timeSearchCursor.stop();
+            }
+            catch ( Throwable t ) {
+                logger.error( "Unable to communicate with elasticsearch", t );
+                failureMonitor.fail( "Unable to execute batch", t );
+                throw t;
+            }
+
+
+            failureMonitor.success();
+        }
+
+        return parseResults(searchResponse, query);
+    }
+
+
+    private CandidateResults parseResults( final SearchResponse searchResponse, final Query query ) {
+
+        final SearchHits searchHits = searchResponse.getHits();
+        final SearchHit[] hits = searchHits.getHits();
+        final int length = hits.length;
+
+        logger.debug("   Hit count: {} Total hits: {}", length, searchHits.getTotalHits());
+
+        List<CandidateResult> candidates = new ArrayList<>( length );
+
+        for ( SearchHit hit : hits ) {
+
+            String[] idparts = hit.getId().split( SPLITTER );
+            String id = idparts[0];
+            String type = idparts[1];
+            String version = idparts[2];
+
+            Id entityId = new SimpleId( UUID.fromString(id), type );
+
+            candidates.add( new CandidateResult( entityId, UUID.fromString( version ) ) );
+        }
+
+        CandidateResults candidateResults = new CandidateResults( query, candidates );
+
+        if ( candidates.size() >= query.getLimit() ) {
+            //USERGRID-461 our cursor is getting too large, map it to a new time UUID
+            //TODO T.N., this shouldn't live here. This should live at the UG core tier.  However the RM/EM are an absolute mess, so until they're refactored, this is it's home
+
+            final String userCursorString = org.apache.usergrid.persistence.index.utils.StringUtils.sanitizeUUID( UUIDGenerator.newTimeUUID() );
+
+            final String esScrollCursor = searchResponse.getScrollId();
+
+            //now set this into our map module
+            final int minutes = indexFig.getQueryCursorTimeout();
+
+            //just truncate it, we'll never hit a long value anyway
+            mapManager.putString( userCursorString, esScrollCursor, ( int ) TimeUnit.MINUTES.toSeconds( minutes ) );
+
+            candidateResults.setCursor( userCursorString );
+            logger.debug(" User cursor = {},  Cursor = {} ", userCursorString, esScrollCursor);
+        }
+
+        return candidateResults;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/679812e6/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexBatchImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexBatchImpl.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexBatchImpl.java
index d7b1f9c..1082201 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexBatchImpl.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexBatchImpl.java
@@ -76,13 +76,13 @@ public class EsEntityIndexBatchImpl implements EntityIndexBatch {
 
 
     public EsEntityIndexBatchImpl(final ApplicationScope applicationScope,
-                                  final IndexBufferProducer indexBatchBufferProducer,final IndexFig config,
-                                  final AliasedEntityIndex entityIndex ) {
+                                  final IndexBufferProducer indexBatchBufferProducer,
+                                  final AliasedEntityIndex entityIndex, IndexIdentifier indexIdentifier ) {
 
         this.applicationScope = applicationScope;
         this.indexBatchBufferProducer = indexBatchBufferProducer;
         this.entityIndex = entityIndex;
-        this.indexIdentifier = IndexingUtils.createIndexIdentifier(config, applicationScope);
+        this.indexIdentifier = indexIdentifier;
         this.alias = indexIdentifier.getAlias();
         //constrained
         this.container = new IndexOperationMessage();
@@ -96,7 +96,7 @@ public class EsEntityIndexBatchImpl implements EntityIndexBatch {
         ValidationUtils.verifyVersion( entity.getVersion() );
         //add app id for indexing
         entity.setField(
-            new StringField(APPLICATION_ID_FIELDNAME,IndexingUtils.idString(applicationScope.getApplication()))
+            new StringField(APPLICATION_ID_FIELDNAME, IndexingUtils.idString(applicationScope.getApplication()))
         );
         final String context = createContextName(indexScope);
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/679812e6/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexFactoryImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexFactoryImpl.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexFactoryImpl.java
index 8af309d..426f587 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexFactoryImpl.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexFactoryImpl.java
@@ -24,12 +24,10 @@ import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
 import com.google.inject.Inject;
 
+import com.google.inject.assistedinject.Assisted;
 import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
-import org.apache.usergrid.persistence.index.EntityIndex;
-import org.apache.usergrid.persistence.index.EntityIndexFactory;
-import org.apache.usergrid.persistence.index.IndexBufferProducer;
-import org.apache.usergrid.persistence.index.IndexFig;
+import org.apache.usergrid.persistence.index.*;
 import org.apache.usergrid.persistence.map.MapManagerFactory;
 
 import java.util.concurrent.ExecutionException;
@@ -46,12 +44,15 @@ public class EsEntityIndexFactoryImpl implements EntityIndexFactory{
     private final MetricsFactory metricsFactory;
     private final MapManagerFactory mapManagerFactory;
     private final IndexFig indexFig;
+    private final AliasedEntityIndex entityIndex;
+    private final IndexIdentifier indexIdentifier;
 
-    private LoadingCache<ApplicationScope, EntityIndex> eiCache =
-        CacheBuilder.newBuilder().maximumSize( 1000 ).build( new CacheLoader<ApplicationScope, EntityIndex>() {
-            public EntityIndex load( ApplicationScope scope ) {
-                return new EsEntityIndexImpl(scope,config, indexBatchBufferProducer, provider,indexCache, metricsFactory,
-                    mapManagerFactory, indexFig );
+    private LoadingCache<ApplicationScope, ApplicationEntityIndex> eiCache =
+        CacheBuilder.newBuilder().maximumSize( 1000 ).build( new CacheLoader<ApplicationScope, ApplicationEntityIndex>() {
+            public ApplicationEntityIndex load( ApplicationScope scope ) {
+                return new EsApplicationEntityIndexImpl(
+                    scope,entityIndex,config, indexBatchBufferProducer, provider,indexCache, metricsFactory, mapManagerFactory, indexFig, indexIdentifier
+                );
             }
         } );
 
@@ -59,7 +60,7 @@ public class EsEntityIndexFactoryImpl implements EntityIndexFactory{
     public EsEntityIndexFactoryImpl( final IndexFig config, final EsProvider provider, final EsIndexCache indexCache,
                                      final IndexBufferProducer indexBatchBufferProducer,
                                      final MetricsFactory metricsFactory, final MapManagerFactory mapManagerFactory,
-                                     final IndexFig indexFig ){
+                                     final IndexFig indexFig, final AliasedEntityIndex entityIndex, final IndexIdentifier indexIdentifier ){
         this.config = config;
         this.provider = provider;
         this.indexCache = indexCache;
@@ -67,10 +68,14 @@ public class EsEntityIndexFactoryImpl implements EntityIndexFactory{
         this.metricsFactory = metricsFactory;
         this.mapManagerFactory = mapManagerFactory;
         this.indexFig = indexFig;
+        this.entityIndex = entityIndex;
+        this.indexIdentifier = indexIdentifier;
     }
 
+
+
     @Override
-    public EntityIndex createEntityIndex(final ApplicationScope appScope) {
+    public ApplicationEntityIndex createApplicationEntityIndex(@Assisted final ApplicationScope appScope) {
         try{
             return eiCache.get(appScope);
         }catch (ExecutionException ee){

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/679812e6/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexImpl.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexImpl.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexImpl.java
index f22016e..ae5e3c3 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexImpl.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexImpl.java
@@ -18,55 +18,29 @@
 package org.apache.usergrid.persistence.index.impl;
 
 
-import com.codahale.metrics.Meter;
 import com.codahale.metrics.Timer;
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
 import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import com.yammer.metrics.core.Clock;
+import com.google.inject.Singleton;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.usergrid.persistence.core.future.BetterFuture;
 import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
-import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.util.Health;
-import org.apache.usergrid.persistence.core.util.ValidationUtils;
 import org.apache.usergrid.persistence.index.*;
 import org.apache.usergrid.persistence.index.exceptions.IndexException;
-import org.apache.usergrid.persistence.index.query.CandidateResult;
-import org.apache.usergrid.persistence.index.query.CandidateResults;
-import org.apache.usergrid.persistence.index.query.Query;
-import org.apache.usergrid.persistence.index.utils.UUIDUtils;
-import org.apache.usergrid.persistence.map.MapManager;
-import org.apache.usergrid.persistence.map.MapManagerFactory;
-import org.apache.usergrid.persistence.map.MapScope;
-import org.apache.usergrid.persistence.map.impl.MapScopeImpl;
-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.elasticsearch.action.ActionFuture;
-import org.elasticsearch.action.ActionListener;
-import org.elasticsearch.action.ListenableActionFuture;
-import org.elasticsearch.action.ShardOperationFailedException;
+
 import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest;
 import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
-import org.elasticsearch.action.admin.cluster.tasks.PendingClusterTasksRequest;
-import org.elasticsearch.action.admin.cluster.tasks.PendingClusterTasksResponse;
 import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequestBuilder;
 import org.elasticsearch.action.admin.indices.alias.IndicesAliasesResponse;
 import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
-import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
 import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse;
-import org.elasticsearch.action.admin.indices.template.put.PutIndexTemplateResponse;
-import org.elasticsearch.action.deletebyquery.DeleteByQueryResponse;
-import org.elasticsearch.action.deletebyquery.IndexDeleteByQueryResponse;
-import org.elasticsearch.action.search.SearchRequestBuilder;
-import org.elasticsearch.action.search.SearchResponse;
-import org.elasticsearch.action.search.SearchScrollRequestBuilder;
+
 import org.elasticsearch.client.AdminClient;
 import org.elasticsearch.common.settings.ImmutableSettings;
 import org.elasticsearch.common.settings.Settings;
@@ -75,61 +49,39 @@ import org.elasticsearch.common.xcontent.XContentFactory;
 import org.elasticsearch.index.query.*;
 import org.elasticsearch.indices.IndexAlreadyExistsException;
 import org.elasticsearch.indices.IndexMissingException;
-import org.elasticsearch.indices.InvalidAliasNameException;
-import org.elasticsearch.rest.action.admin.indices.alias.delete.AliasesMissingException;
-import org.elasticsearch.search.SearchHit;
-import org.elasticsearch.search.SearchHits;
-import org.elasticsearch.search.sort.FieldSortBuilder;
-import org.elasticsearch.search.sort.SortBuilders;
-import org.elasticsearch.search.sort.SortOrder;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import rx.Observable;
-import rx.functions.Func1;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
 
-import static org.apache.usergrid.persistence.index.impl.IndexingUtils.*;
+import java.io.IOException;
 
 
 /**
  * Implements index using ElasticSearch Java API.
  */
+@Singleton
 public class EsEntityIndexImpl implements AliasedEntityIndex {
 
     private static final Logger logger = LoggerFactory.getLogger( EsEntityIndexImpl.class );
 
-    private static final AtomicBoolean mappingsCreated = new AtomicBoolean( false );
     public static final String DEFAULT_TYPE = "_default_";
 
     private final IndexIdentifier.IndexAlias alias;
-    private final IndexIdentifier indexIdentifier;
     private final IndexBufferProducer indexBatchBufferProducer;
     private final IndexFig indexFig;
     private final Timer addTimer;
     private final Timer updateAliasTimer;
-    private final Timer searchTimer;
+
 
     /**
      * We purposefully make this per instance. Some indexes may work, while others may fail
      */
-    private FailureMonitor failureMonitor;
 
-    private final ApplicationScope applicationScope;
 
     private final EsProvider esProvider;
-
-    private final int cursorTimeout;
-
     private final IndexFig config;
 
-
-
     //number of times to wait for the index to refresh properly.
     private static final int MAX_WAITS = 10;
     //number of milliseconds to try again before sleeping
@@ -141,53 +93,41 @@ public class EsEntityIndexImpl implements AliasedEntityIndex {
             ImmutableMap.<String, Object>builder().put( "field", "test" ).put(IndexingUtils.ENTITYID_ID_FIELDNAME, UUIDGenerator.newTimeUUID().toString()).build();
 
     private static final MatchAllQueryBuilder MATCH_ALL_QUERY_BUILDER = QueryBuilders.matchAllQuery();
+    private final IndexIdentifier indexIdentifier;
 
     private EsIndexCache aliasCache;
     private Timer mappingTimer;
     private Timer refreshTimer;
-    private Timer cursorTimer;
-    private Timer getVersionsTimer;
 
-    private final MapManager mapManager;
 
 //    private final Timer indexTimer;
 
 
     @Inject
-    public EsEntityIndexImpl( @Assisted final ApplicationScope appScope, final IndexFig config,
+    public EsEntityIndexImpl( final IndexFig config,
                               final IndexBufferProducer indexBatchBufferProducer, final EsProvider provider,
                               final EsIndexCache indexCache, final MetricsFactory metricsFactory,
-                              final MapManagerFactory mapManagerFactory, final IndexFig indexFig ) {
+                              final IndexFig indexFig, final IndexIdentifier indexIdentifier ) {
         this.indexBatchBufferProducer = indexBatchBufferProducer;
         this.indexFig = indexFig;
-        ValidationUtils.validateApplicationScope( appScope );
-        this.applicationScope = appScope;
+        this.indexIdentifier = indexIdentifier;
+
         this.esProvider = provider;
         this.config = config;
-        this.cursorTimeout = config.getQueryCursorTimeout();
-        this.indexIdentifier = IndexingUtils.createIndexIdentifier( config, appScope );
+
+
+
         this.alias = indexIdentifier.getAlias();
-        this.failureMonitor = new FailureMonitorImpl( config, provider );
         this.aliasCache = indexCache;
         this.addTimer = metricsFactory
-            .getTimer( EsEntityIndexImpl.class, "add.timer" );
+            .getTimer(EsEntityIndexImpl.class, "add.timer");
         this.updateAliasTimer = metricsFactory
-            .getTimer( EsEntityIndexImpl.class, "update.alias.timer" );
+            .getTimer(EsEntityIndexImpl.class, "update.alias.timer");
         this.mappingTimer = metricsFactory
-            .getTimer( EsEntityIndexImpl.class, "create.mapping.timer" );
+            .getTimer(EsEntityIndexImpl.class, "create.mapping.timer");
         this.refreshTimer = metricsFactory
-            .getTimer( EsEntityIndexImpl.class, "refresh.timer" );
-        this.searchTimer =metricsFactory
-            .getTimer( EsEntityIndexImpl.class, "search.timer" );
-        this.cursorTimer = metricsFactory
-            .getTimer( EsEntityIndexImpl.class, "search.cursor.timer" );
-        this.getVersionsTimer =metricsFactory
-            .getTimer( EsEntityIndexImpl.class, "get.versions.timer" );
-
-
-        final MapScope mapScope = new MapScopeImpl( appScope.getApplication(), "cursorcache" );
+            .getTimer(EsEntityIndexImpl.class, "refresh.timer");
 
-        mapManager = mapManagerFactory.createMapManager(mapScope);
     }
 
     @Override
@@ -385,190 +325,6 @@ public class EsEntityIndexImpl implements AliasedEntityIndex {
     }
 
 
-    @Override
-    public EntityIndexBatch createBatch() {
-        EntityIndexBatch batch = new EsEntityIndexBatchImpl(
-                applicationScope, indexBatchBufferProducer, config, this );
-        return batch;
-    }
-
-
-    @Override
-    public CandidateResults search(final IndexScope indexScope, final SearchTypes searchTypes,
-            final Query query ) {
-
-        final String context = IndexingUtils.createContextName(indexScope);
-        final String[] entityTypes = searchTypes.getTypeNames(applicationScope);
-        QueryBuilder qb = query.createQueryBuilder(context);
-        SearchResponse searchResponse;
-
-        if ( query.getCursor() == null ) {
-            SearchRequestBuilder srb = esProvider.getClient().prepareSearch( alias.getReadAlias() )
-                    .setTypes(entityTypes)
-                    .setScroll(cursorTimeout + "m")
-                    .setQuery(qb);
-
-            final FilterBuilder fb = query.createFilterBuilder();
-
-            //we have post filters, apply them
-            if ( fb != null ) {
-                logger.debug( "   Filter: {} ", fb.toString() );
-                srb = srb.setPostFilter( fb );
-            }
-
-
-            srb = srb.setFrom( 0 ).setSize( query.getLimit() );
-
-            for ( Query.SortPredicate sp : query.getSortPredicates() ) {
-
-                final SortOrder order;
-                if ( sp.getDirection().equals( Query.SortDirection.ASCENDING ) ) {
-                    order = SortOrder.ASC;
-                }
-                else {
-                    order = SortOrder.DESC;
-                }
-
-                // we do not know the type of the "order by" property and so we do not know what
-                // type prefix to use. So, here we add an order by clause for every possible type
-                // that you can order by: string, number and boolean and we ask ElasticSearch
-                // to ignore any fields that are not present.
-
-                final String stringFieldName = STRING_PREFIX + sp.getPropertyName();
-                final FieldSortBuilder stringSort = SortBuilders.fieldSort( stringFieldName )
-                        .order( order ).ignoreUnmapped( true );
-                srb.addSort( stringSort );
-
-                logger.debug( "   Sort: {} order by {}", stringFieldName, order.toString() );
-
-                final String longFieldName = LONG_PREFIX + sp.getPropertyName();
-                final FieldSortBuilder longSort = SortBuilders.fieldSort( longFieldName )
-                        .order( order ).ignoreUnmapped( true );
-                srb.addSort( longSort );
-                logger.debug( "   Sort: {} order by {}", longFieldName, order.toString() );
-
-
-                final String doubleFieldName = DOUBLE_PREFIX + sp.getPropertyName();
-                final FieldSortBuilder doubleSort = SortBuilders.fieldSort( doubleFieldName )
-                    .order( order ).ignoreUnmapped( true );
-                srb.addSort( doubleSort );
-                logger.debug( "   Sort: {} order by {}", doubleFieldName, order.toString() );
-
-
-                final String booleanFieldName = BOOLEAN_PREFIX + sp.getPropertyName();
-                final FieldSortBuilder booleanSort = SortBuilders.fieldSort( booleanFieldName )
-                        .order( order ).ignoreUnmapped( true );
-                srb.addSort( booleanSort );
-                logger.debug( "   Sort: {} order by {}", booleanFieldName, order.toString() );
-            }
-
-
-            if ( logger.isDebugEnabled() ) {
-                logger.debug( "Searching index (read alias): {}\n  scope: {} \n type: {}\n   query: {} ",
-                    this.alias.getReadAlias(), context, entityTypes, srb );
-            }
-
-            try {
-                //Added For Graphite Metrics
-                Timer.Context timeSearch = searchTimer.time();
-                searchResponse = srb.execute().actionGet();
-                timeSearch.stop();
-            }
-            catch ( Throwable t ) {
-                logger.error( "Unable to communicate with Elasticsearch", t );
-                failureMonitor.fail( "Unable to execute batch", t );
-                throw t;
-            }
-
-
-            failureMonitor.success();
-        }
-        else {
-            String userCursorString = query.getCursor();
-            if ( userCursorString.startsWith( "\"" ) ) {
-                userCursorString = userCursorString.substring( 1 );
-            }
-            if ( userCursorString.endsWith( "\"" ) ) {
-                userCursorString = userCursorString.substring( 0, userCursorString.length() - 1 );
-            }
-
-            //now get the cursor from the map  and validate
-            final String esScrollCursor  = mapManager.getString( userCursorString );
-
-            Preconditions.checkArgument(esScrollCursor != null, "Could not find a cursor for the value '{}' ",  esScrollCursor);
-
-
-
-            logger.debug( "Executing query with cursor: {} ", esScrollCursor );
-
-
-            SearchScrollRequestBuilder ssrb = esProvider.getClient()
-                    .prepareSearchScroll(esScrollCursor).setScroll( cursorTimeout + "m" );
-
-            try {
-                //Added For Graphite Metrics
-                Timer.Context timeSearchCursor = cursorTimer.time();
-                searchResponse = ssrb.execute().actionGet();
-                timeSearchCursor.stop();
-            }
-            catch ( Throwable t ) {
-                logger.error( "Unable to communicate with elasticsearch", t );
-                failureMonitor.fail( "Unable to execute batch", t );
-                throw t;
-            }
-
-
-            failureMonitor.success();
-        }
-
-        return parseResults(searchResponse, query);
-    }
-
-
-    private CandidateResults parseResults( final SearchResponse searchResponse, final Query query ) {
-
-        final SearchHits searchHits = searchResponse.getHits();
-        final SearchHit[] hits = searchHits.getHits();
-        final int length = hits.length;
-
-        logger.debug("   Hit count: {} Total hits: {}", length, searchHits.getTotalHits());
-
-        List<CandidateResult> candidates = new ArrayList<>( length );
-
-        for ( SearchHit hit : hits ) {
-
-            String[] idparts = hit.getId().split( SPLITTER );
-            String id = idparts[0];
-            String type = idparts[1];
-            String version = idparts[2];
-
-            Id entityId = new SimpleId( UUID.fromString( id ), type );
-
-            candidates.add( new CandidateResult( entityId, UUID.fromString( version ) ) );
-        }
-
-        CandidateResults candidateResults = new CandidateResults( query, candidates );
-
-        if ( candidates.size() >= query.getLimit() ) {
-            //USERGRID-461 our cursor is getting too large, map it to a new time UUID
-            //TODO T.N., this shouldn't live here. This should live at the UG core tier.  However the RM/EM are an absolute mess, so until they're refactored, this is it's home
-
-            final String userCursorString = org.apache.usergrid.persistence.index.utils.StringUtils.sanitizeUUID( UUIDGenerator.newTimeUUID() );
-
-            final String esScrollCursor = searchResponse.getScrollId();
-
-            //now set this into our map module
-            final int minutes = indexFig.getQueryCursorTimeout();
-
-            //just truncate it, we'll never hit a long value anyway
-            mapManager.putString( userCursorString, esScrollCursor, ( int ) TimeUnit.MINUTES.toSeconds( minutes ) );
-
-            candidateResults.setCursor( userCursorString );
-            logger.debug(" User cursor = {},  Cursor = {} ", userCursorString, esScrollCursor);
-        }
-
-        return candidateResults;
-    }
 
 
     public void refresh() {
@@ -587,8 +343,7 @@ public class EsEntityIndexImpl implements AliasedEntityIndex {
                     );
 
                     if ( indexes.length == 0 ) {
-                        logger.debug( "Not refreshing indexes, none found for app {}",
-                                applicationScope.getApplication().getUuid() );
+                        logger.debug( "Not refreshing indexes. none found");
                         return true;
                     }
                     //Added For Graphite Metrics
@@ -609,70 +364,6 @@ public class EsEntityIndexImpl implements AliasedEntityIndex {
     }
 
 
-    @Override
-    public int getPendingTasks() {
-
-        final PendingClusterTasksResponse tasksResponse = esProvider.getClient().admin()
-                .cluster().pendingClusterTasks( new PendingClusterTasksRequest() ).actionGet();
-
-        return tasksResponse.pendingTasks().size();
-    }
-
-
-
-    /**
-     * Completely delete an index.
-     */
-    public ListenableActionFuture deleteIndex() {
-        //TODO: add timer
-        //TODO: add all indexes
-        String idString = IndexingUtils.idString(applicationScope.getApplication());
-
-        final TermQueryBuilder tqb = QueryBuilders.termQuery(APPLICATION_ID_FIELDNAME, idString);
-
-        //Added For Graphite Metrics
-
-        final ListenableActionFuture<DeleteByQueryResponse> response = esProvider.getClient()
-            .prepareDeleteByQuery( alias.getWriteAlias() ).setQuery( tqb ).execute();
-
-        response.addListener(new ActionListener<DeleteByQueryResponse>() {
-
-            @Override
-            public void onResponse(DeleteByQueryResponse response) {
-                checkDeleteByQueryResponse(tqb,response);
-            }
-
-
-            @Override
-            public void onFailure(Throwable e) {
-                logger.error("failed on delete index",e);
-            }
-        });
-        return response;
-    }
-    /**
-     * Validate the response doesn't contain errors, if it does, fail fast at the first error we encounter
-     */
-    private void checkDeleteByQueryResponse(
-        final QueryBuilder query, final DeleteByQueryResponse response ) {
-
-        for ( IndexDeleteByQueryResponse indexDeleteByQueryResponse : response ) {
-            final ShardOperationFailedException[] failures = indexDeleteByQueryResponse.getFailures();
-
-            for ( ShardOperationFailedException failedException : failures ) {
-                logger.error( String.format("Unable to delete by query %s. "
-                            + "Failed with code %d and reason %s on shard %s in index %s",
-                        query.toString(),
-                        failedException.status().getStatus(),
-                        failedException.reason(),
-                        failedException.shardId(),
-                        failedException.index() )
-                );
-            }
-
-        }
-    }
-
 
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/679812e6/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexingUtils.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexingUtils.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexingUtils.java
index d49d8cc..c74ce93 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexingUtils.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/IndexingUtils.java
@@ -96,21 +96,6 @@ public class IndexingUtils {
         return sb.toString();
     }
 
-
-    /**
-     * Create the facilities to retrieve an index name and alias name
-     * @param fig
-     * @param applicationScope
-     * @return
-     */
-    public static IndexIdentifier createIndexIdentifier(IndexFig fig, ApplicationScope applicationScope) {
-        return new IndexIdentifier(fig,applicationScope);
-    }
-
-
-
-
-
     /**
      * Create the index doc from the given entity
      * @param entity

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/679812e6/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/CorePerformanceIT.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/CorePerformanceIT.java b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/CorePerformanceIT.java
index c1bfe38..303d481 100644
--- a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/CorePerformanceIT.java
+++ b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/CorePerformanceIT.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
+import org.apache.usergrid.persistence.index.*;
 import org.junit.ClassRule;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -40,11 +41,6 @@ import org.apache.usergrid.persistence.collection.EntityCollectionManagerFactory
 import org.apache.usergrid.persistence.collection.impl.CollectionScopeImpl;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.scope.ApplicationScopeImpl;
-import org.apache.usergrid.persistence.index.EntityIndex;
-import org.apache.usergrid.persistence.index.EntityIndexBatch;
-import org.apache.usergrid.persistence.index.EntityIndexFactory;
-import org.apache.usergrid.persistence.index.IndexScope;
-import org.apache.usergrid.persistence.index.SearchTypes;
 import org.apache.usergrid.persistence.index.guice.TestIndexModule;
 import org.apache.usergrid.persistence.index.query.CandidateResults;
 import org.apache.usergrid.persistence.index.query.EntityResults;
@@ -83,6 +79,7 @@ public class CorePerformanceIT extends BaseIT {
 
     static EntityCollectionManagerFactory ecmf;
     static EntityIndexFactory ecif ;
+    static EntityIndex ecf;
 
 
     @Ignore("Relies on finefoods.txt which must be downloaded separately")
@@ -97,6 +94,7 @@ public class CorePerformanceIT extends BaseIT {
 
         ecmf = injector.getInstance( EntityCollectionManagerFactory.class );
         ecif = injector.getInstance( EntityIndexFactory.class );
+        ecf = injector.getInstance(EntityIndex.class);
 
         final ApplicationScope scope = new ApplicationScopeImpl( new SimpleId( "application" ) );
 
@@ -174,7 +172,7 @@ public class CorePerformanceIT extends BaseIT {
 
         public void run() {
 
-            EntityIndex eci =   ecif.createEntityIndex( scope);
+            ApplicationEntityIndex eci =   ecif.createApplicationEntityIndex(scope);
             EntityCollectionManager ecm = ecmf.createCollectionManager( new CollectionScopeImpl( scope.getApplication(), indexScope.getOwner(), indexScope.getName() ) );
 
             Query query = Query.fromQL( "review_score > 0"); // get all reviews;
@@ -219,7 +217,8 @@ public class CorePerformanceIT extends BaseIT {
             CollectionScope collectionScope = new CollectionScopeImpl(
                     applicationScope.getApplication(), indexScope.getOwner(), indexScope.getName() );
             EntityCollectionManager ecm = ecmf.createCollectionManager(collectionScope );
-            EntityIndex eci = ecif.createEntityIndex(applicationScope );
+            ApplicationEntityIndex eci =   ecif.createApplicationEntityIndex(applicationScope);
+
 
             FileReader fr;
             try {
@@ -304,7 +303,7 @@ public class CorePerformanceIT extends BaseIT {
                 throw new RuntimeException("Error reading file", ex);
             }
 
-            eci.refresh();
+            ecf.refresh();
         }
     }
 
@@ -312,7 +311,8 @@ public class CorePerformanceIT extends BaseIT {
     public void runSelectedQueries(final ApplicationScope scope,  List<IndexScope> indexScopes ) {
 
         for ( IndexScope indexScope : indexScopes ) {
-            EntityIndex eci = ecif.createEntityIndex(scope );
+            ApplicationEntityIndex eci =   ecif.createApplicationEntityIndex(scope);
+
 
             // TODO: come up with more and more complex queries for CorePerformanceIT
 
@@ -330,7 +330,7 @@ public class CorePerformanceIT extends BaseIT {
         }
     }
 
-    public static void query(final IndexScope indexScope, final EntityIndex eci, final String query ) {;
+    public static void query(final IndexScope indexScope, final ApplicationEntityIndex eci, final String query ) {;
         Query q = Query.fromQL(query) ;
 //        CandidateResults candidateResults = eci.search(indexScope,  q );  TODO FIXME
 //        log.info("size = {} returned from query {}", candidateResults.size(), q.getQl() );

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/679812e6/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityConnectionIndexImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityConnectionIndexImplTest.java b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityConnectionIndexImplTest.java
index a399809..8e8d6c0 100644
--- a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityConnectionIndexImplTest.java
+++ b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityConnectionIndexImplTest.java
@@ -21,6 +21,7 @@ package org.apache.usergrid.persistence.index.impl;
 import java.io.IOException;
 import java.util.HashMap;
 
+import org.apache.usergrid.persistence.index.*;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.slf4j.Logger;
@@ -30,11 +31,6 @@ import org.apache.usergrid.persistence.collection.util.EntityUtils;
 import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.scope.ApplicationScopeImpl;
 import org.apache.usergrid.persistence.core.test.UseModules;
-import org.apache.usergrid.persistence.index.EntityIndex;
-import org.apache.usergrid.persistence.index.EntityIndexBatch;
-import org.apache.usergrid.persistence.index.EntityIndexFactory;
-import org.apache.usergrid.persistence.index.IndexScope;
-import org.apache.usergrid.persistence.index.SearchTypes;
 import org.apache.usergrid.persistence.index.exceptions.QueryParseException;
 import org.apache.usergrid.persistence.index.guice.TestIndexModule;
 import org.apache.usergrid.persistence.index.query.CandidateResult;
@@ -65,6 +61,8 @@ public class EntityConnectionIndexImplTest extends BaseIT {
     @Inject
     public EntityIndexFactory ecif;
 
+    @Inject
+    public EntityIndex ei;
 
     @Test
     public void testBasicOperation() throws IOException, InterruptedException {
@@ -117,8 +115,7 @@ public class EntityConnectionIndexImplTest extends BaseIT {
         IndexScope otherIndexScope =
                 new IndexScopeImpl( new SimpleId( UUIDGenerator.newTimeUUID(), "animal" ), "likes" );
 
-        EntityIndex personLikesIndex = ecif.createEntityIndex( applicationScope );
-        personLikesIndex.initializeIndex();
+        ApplicationEntityIndex personLikesIndex = ecif.createApplicationEntityIndex(applicationScope);
 
         EntityIndexBatch batch = personLikesIndex.createBatch();
 
@@ -137,7 +134,7 @@ public class EntityConnectionIndexImplTest extends BaseIT {
         batch.index( otherIndexScope, oj );
 
         batch.execute().get();
-        personLikesIndex.refresh();
+        ei.refresh();
 
 
         Thread.sleep( 2000 );
@@ -247,8 +244,7 @@ public class EntityConnectionIndexImplTest extends BaseIT {
         IndexScope otherIndexScope =
                 new IndexScopeImpl( new SimpleId( UUIDGenerator.newTimeUUID(), "animal" ), "likes" );
 
-        EntityIndex personLikesIndex = ecif.createEntityIndex( applicationScope );
-        personLikesIndex.initializeIndex();
+        ApplicationEntityIndex personLikesIndex = ecif.createApplicationEntityIndex(applicationScope);
 
         EntityIndexBatch batch = personLikesIndex.createBatch();
 
@@ -267,7 +263,7 @@ public class EntityConnectionIndexImplTest extends BaseIT {
         batch.index( otherIndexScope, oj );
 
         batch.execute().get();
-        personLikesIndex.refresh();
+        ei.refresh();
 
 
         // now, let's search for muffins
@@ -285,7 +281,7 @@ public class EntityConnectionIndexImplTest extends BaseIT {
         batch.deindex( searchScope, muffin );
         batch.deindex( searchScope, oj );
         batch.execute().get();
-        personLikesIndex.refresh();
+        ei.refresh();
 
         likes = personLikesIndex.search( searchScope,
                 SearchTypes.fromTypes( muffin.getId().getType(), egg.getId().getType(), oj.getId().getType() ),

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/679812e6/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
index 047fbe8..483efb9 100644
--- a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
+++ b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityIndexTest.java
@@ -70,6 +70,8 @@ public class EntityIndexTest extends BaseIT {
 
     @Inject
     public EntityIndexFactory eif;
+    @Inject
+    public EntityIndex ei;
 
     //TODO T.N. Remove this when we move the cursor mapping back to core
     @Inject
@@ -82,9 +84,8 @@ public class EntityIndexTest extends BaseIT {
         Id appId = new SimpleId( "application" );
 
         ApplicationScope applicationScope = new ApplicationScopeImpl( appId );
+        ApplicationEntityIndex entityIndex = eif.createApplicationEntityIndex(applicationScope);
 
-        EntityIndex entityIndex = eif.createEntityIndex( applicationScope );
-        entityIndex.initializeIndex();
 
         final String entityType = "thing";
         IndexScope indexScope = new IndexScopeImpl( appId, "things" );
@@ -92,7 +93,7 @@ public class EntityIndexTest extends BaseIT {
 
         insertJsonBlob(entityIndex, entityType, indexScope, "/sample-large.json",101,0);
 
-        entityIndex.refresh();
+       ei.refresh();
 
 
         testQueries( indexScope, searchTypes, entityIndex );
@@ -105,8 +106,7 @@ public class EntityIndexTest extends BaseIT {
 
         ApplicationScope applicationScope = new ApplicationScopeImpl( appId );
 
-        EntityIndex entityIndex = eif.createEntityIndex( applicationScope );
-        entityIndex.initializeIndex();
+        ApplicationEntityIndex entityIndex = eif.createApplicationEntityIndex(applicationScope);
 
         final String entityType = "thing";
         IndexScope indexScope = new IndexScopeImpl( appId, "things" );
@@ -133,7 +133,7 @@ public class EntityIndexTest extends BaseIT {
         batch.index(indexScope, entity);
         batch.execute().get();
 
-        entityIndex.refresh();
+        ei.refresh();
 
         testQueries( indexScope, searchTypes,  entityIndex );
     }
@@ -147,10 +147,10 @@ public class EntityIndexTest extends BaseIT {
         long now = System.currentTimeMillis();
         final int threads = 20;
         final int size = 30;
-        final EntityIndex entityIndex = eif.createEntityIndex( applicationScope );
+        final ApplicationEntityIndex entityIndex = eif.createApplicationEntityIndex(applicationScope);
         final IndexScope indexScope = new IndexScopeImpl(appId, "things");
         final String entityType = "thing";
-        entityIndex.initializeIndex();
+        ei.initializeIndex();
         final CountDownLatch latch = new CountDownLatch(threads);
         final AtomicLong failTime=new AtomicLong(0);
         InputStream is = this.getClass().getResourceAsStream(  "/sample-large.json" );
@@ -192,10 +192,10 @@ public class EntityIndexTest extends BaseIT {
 
         ApplicationScope applicationScope = new ApplicationScopeImpl( appId );
 
-        EntityIndex entityIndex = eif.createEntityIndex( applicationScope );
-        entityIndex.initializeIndex();
+        ApplicationEntityIndex entityIndex = eif.createApplicationEntityIndex(applicationScope);
+        ei.initializeIndex();
         for(int i=0;i<10;i++) {
-            entityIndex.initializeIndex();
+            ei.initializeIndex();
         }
 
     }
@@ -206,8 +206,8 @@ public class EntityIndexTest extends BaseIT {
 
         ApplicationScope applicationScope = new ApplicationScopeImpl( appId );
 
-        AliasedEntityIndex entityIndex =(AliasedEntityIndex) eif.createEntityIndex( applicationScope );
-        entityIndex.initializeIndex();
+        ApplicationEntityIndex entityIndex = eif.createApplicationEntityIndex(applicationScope);
+        ei.initializeIndex();
 
         final String entityType = "thing";
         IndexScope indexScope = new IndexScopeImpl( appId, "things" );
@@ -215,15 +215,15 @@ public class EntityIndexTest extends BaseIT {
 
         insertJsonBlob(entityIndex, entityType, indexScope, "/sample-large.json",101,0);
 
-        entityIndex.refresh();
+       ei.refresh();
 
         testQueries( indexScope, searchTypes,  entityIndex );
 
-        entityIndex.addIndex("v2", 1,0,"one");
+        ei.addIndex("v2", 1,0,"one");
 
         insertJsonBlob(entityIndex, entityType, indexScope, "/sample-large.json",101,100);
 
-        entityIndex.refresh();
+       ei.refresh();
 
         //Hilda Youn
         testQuery(indexScope, searchTypes, entityIndex, "name = 'Hilda Young'", 1 );
@@ -237,9 +237,8 @@ public class EntityIndexTest extends BaseIT {
 
         ApplicationScope applicationScope = new ApplicationScopeImpl( appId );
 
-        AliasedEntityIndex entityIndex =(AliasedEntityIndex) eif.createEntityIndex( applicationScope );
+        ApplicationEntityIndex entityIndex = eif.createApplicationEntityIndex( applicationScope );
 
-        entityIndex.initializeIndex();
 
         final String entityType = "thing";
         IndexScope indexScope = new IndexScopeImpl( appId, "things" );
@@ -247,33 +246,33 @@ public class EntityIndexTest extends BaseIT {
 
         insertJsonBlob(entityIndex, entityType, indexScope, "/sample-large.json",1,0);
 
-        entityIndex.refresh();
+        ei.refresh();
 
-        entityIndex.addIndex("v2", 1, 0, "one");
+        ei.addIndex("v2", 1, 0, "one");
 
         insertJsonBlob(entityIndex, entityType, indexScope, "/sample-large.json", 1, 0);
 
-        entityIndex.refresh();
+        ei.refresh();
         CandidateResults crs = testQuery(indexScope, searchTypes, entityIndex, "name = 'Bowers Oneil'", 2);
 
         EntityIndexBatch entityIndexBatch = entityIndex.createBatch();
         entityIndexBatch.deindex(indexScope, crs.get(0));
         entityIndexBatch.deindex(indexScope, crs.get(1));
         entityIndexBatch.execute().get();
-        entityIndex.refresh();
+        ei.refresh();
 
         //Hilda Youn
         testQuery(indexScope, searchTypes, entityIndex, "name = 'Bowers Oneil'", 0);
 
     }
-    private void insertJsonBlob(EntityIndex entityIndex, String entityType, IndexScope indexScope, String filePath,final int max,final int startIndex) throws IOException {
+    private void insertJsonBlob(ApplicationEntityIndex entityIndex, String entityType, IndexScope indexScope, String filePath,final int max,final int startIndex) throws IOException {
         InputStream is = this.getClass().getResourceAsStream( filePath );
         ObjectMapper mapper = new ObjectMapper();
         List<Object> sampleJson = mapper.readValue( is, new TypeReference<List<Object>>() {} );
         EntityIndexBatch batch = entityIndex.createBatch();
         insertJsonBlob(sampleJson,batch, entityType, indexScope, max, startIndex);
         batch.execute().get();
-        entityIndex.refresh();
+        ei.refresh();
     }
 
     private void insertJsonBlob(List<Object> sampleJson, EntityIndexBatch batch, String entityType, IndexScope indexScope,final int max,final int startIndex) throws IOException {
@@ -320,8 +319,8 @@ public class EntityIndexTest extends BaseIT {
 
         IndexScope indexScope = new IndexScopeImpl( appId, "fastcars" );
 
-        EntityIndex entityIndex = eif.createEntityIndex( applicationScope );
-        entityIndex.initializeIndex();
+        ApplicationEntityIndex entityIndex = eif.createApplicationEntityIndex(applicationScope);
+        ei.initializeIndex();
 
         Map entityMap = new HashMap() {{
             put( "name", "Ferrari 212 Inter" );
@@ -336,7 +335,7 @@ public class EntityIndexTest extends BaseIT {
         entity.setField(new UUIDField(IndexingUtils.ENTITYID_ID_FIELDNAME, UUID.randomUUID()));
 
         entityIndex.createBatch().index(indexScope , entity ).execute().get();
-        entityIndex.refresh();
+        ei.refresh();
 
         CandidateResults candidateResults = entityIndex.search( indexScope,
             SearchTypes.fromTypes( entity.getId().getType() ), Query.fromQL( "name contains 'Ferrari*'" ) );
@@ -345,14 +344,14 @@ public class EntityIndexTest extends BaseIT {
         EntityIndexBatch batch = entityIndex.createBatch();
         batch.deindex(indexScope, entity).execute().get();
         batch.execute().get();
-        entityIndex.refresh();
+        ei.refresh();
 
         candidateResults = entityIndex.search( indexScope, SearchTypes.fromTypes(entity.getId().getType()), Query.fromQL( "name contains 'Ferrari*'" ) );
         assertEquals( 0, candidateResults.size() );
     }
 
 
-    private CandidateResults testQuery(final IndexScope scope, final SearchTypes searchTypes, final EntityIndex entityIndex, final String queryString, final int num ) {
+    private CandidateResults testQuery(final IndexScope scope, final SearchTypes searchTypes, final ApplicationEntityIndex entityIndex, final String queryString, final int num ) {
 
         StopWatch timer = new StopWatch();
         timer.start();
@@ -367,7 +366,7 @@ public class EntityIndexTest extends BaseIT {
     }
 
 
-    private void testQueries(final IndexScope scope, SearchTypes searchTypes, final EntityIndex entityIndex ) {
+    private void testQueries(final IndexScope scope, SearchTypes searchTypes, final ApplicationEntityIndex entityIndex ) {
 
         testQuery(scope, searchTypes, entityIndex, "name = 'Morgan Pierce'", 1 );
 
@@ -451,7 +450,7 @@ public class EntityIndexTest extends BaseIT {
 
         IndexScope appScope = new IndexScopeImpl( ownerId, "user" );
 
-        EntityIndex ei = eif.createEntityIndex( applicationScope );
+        ApplicationEntityIndex entityIndex = eif.createApplicationEntityIndex(applicationScope);
         ei.initializeIndex();
 
         final String middleName = "middleName" + UUIDUtils.newTimeUUID();
@@ -467,7 +466,7 @@ public class EntityIndexTest extends BaseIT {
         EntityUtils.setVersion( user, UUIDGenerator.newTimeUUID() );
 
 
-        EntityIndexBatch batch = ei.createBatch();
+        EntityIndexBatch batch = entityIndex.createBatch();
 
         batch.index( appScope, user);
         batch.execute().get();
@@ -475,7 +474,7 @@ public class EntityIndexTest extends BaseIT {
 
         Query query = new Query();
         query.addEqualityFilter( "username", "edanuff" );
-        CandidateResults r = ei.search( appScope, SearchTypes.fromTypes( "edanuff" ), query );
+        CandidateResults r = entityIndex.search( appScope, SearchTypes.fromTypes( "edanuff" ), query );
         assertEquals( user.getId(), r.get( 0 ).getId() );
 
         batch.deindex(appScope, user.getId(), user.getVersion() );
@@ -486,7 +485,7 @@ public class EntityIndexTest extends BaseIT {
         query = new Query();
         query.addEqualityFilter( "username", "edanuff" );
 
-        r = ei.search(appScope,SearchTypes.fromTypes( "edanuff" ),  query );
+        r = entityIndex.search(appScope,SearchTypes.fromTypes( "edanuff" ),  query );
 
         assertFalse( r.iterator().hasNext() );
     }
@@ -500,9 +499,9 @@ public class EntityIndexTest extends BaseIT {
 
         IndexScope appScope = new IndexScopeImpl( ownerId, "user" );
 
-        EntityIndex ei = eif.createEntityIndex( applicationScope );
+        ApplicationEntityIndex entityIndex = eif.createApplicationEntityIndex(applicationScope);
         ei.initializeIndex();
-        ei.createBatch();
+        entityIndex.createBatch();
 
         // Bill has favorites as string, age as string and retirement goal as number
         Map billMap = new HashMap() {{
@@ -516,7 +515,7 @@ public class EntityIndexTest extends BaseIT {
         EntityUtils.setId( bill, new SimpleId( UUIDGenerator.newTimeUUID(), "user"  ) );
         EntityUtils.setVersion( bill, UUIDGenerator.newTimeUUID() );
 
-        EntityIndexBatch batch = ei.createBatch();
+        EntityIndexBatch batch = entityIndex.createBatch();
 
         batch.index( appScope,  bill );
 
@@ -547,22 +546,22 @@ public class EntityIndexTest extends BaseIT {
 
         Query query = new Query();
         query.addEqualityFilter( "username", "bill" );
-        CandidateResults r = ei.search( appScope, searchTypes,  query );
+        CandidateResults r = entityIndex.search( appScope, searchTypes,  query );
         assertEquals( bill.getId(), r.get( 0 ).getId() );
 
         query = new Query();
         query.addEqualityFilter( "username", "fred" );
-        r = ei.search( appScope, searchTypes,  query );
+        r = entityIndex.search( appScope, searchTypes,  query );
         assertEquals( fred.getId(), r.get( 0 ).getId() );
 
         query = new Query();
         query.addEqualityFilter( "age", 41 );
-        r = ei.search( appScope, searchTypes,  query );
+        r = entityIndex.search( appScope, searchTypes,  query );
         assertEquals( fred.getId(), r.get( 0 ).getId() );
 
         query = new Query();
         query.addEqualityFilter( "age", "thirtysomething" );
-        r = ei.search(  appScope, searchTypes, query );
+        r = entityIndex.search(  appScope, searchTypes, query );
         assertEquals( bill.getId(), r.get( 0 ).getId() );
     }
 
@@ -570,11 +569,6 @@ public class EntityIndexTest extends BaseIT {
     @Test
     public void healthTest() {
 
-        Id appId = new SimpleId( "application" );
-        ApplicationScope applicationScope = new ApplicationScopeImpl( appId );
-
-        EntityIndex ei = eif.createEntityIndex( applicationScope );
-
         assertNotEquals( "cluster should be ok", Health.RED, ei.getClusterHealth() );
         assertEquals( "index should be ready", Health.GREEN, ei.getIndexHealth() );
 
@@ -597,8 +591,8 @@ public class EntityIndexTest extends BaseIT {
         IndexScope indexScope = new IndexScopeImpl( ownerId, "users" );
 
 
-        EntityIndex entityIndex = eif.createEntityIndex( applicationScope );
-        entityIndex.initializeIndex();
+        ApplicationEntityIndex entityIndex = eif.createApplicationEntityIndex(applicationScope);
+        ei.initializeIndex();
 
         final EntityIndexBatch batch = entityIndex.createBatch();
 
@@ -634,7 +628,7 @@ public class EntityIndexTest extends BaseIT {
 
 
         batch.execute().get();
-        entityIndex.refresh();
+       ei.refresh();
 
 
         final int limit = 1;