RYA-51 Temporal Indexing mongo support

Added support for mongo backed rya temporal
indexing.

Added integration tests

Repackaged mongo secondary indexing

Cleaned up the storage strategies.
Indexing is now consistent across all
secondary indexers (mongo only).

renamed StatementContraints to be spelled correctly.


Project: http://git-wip-us.apache.org/repos/asf/incubator-rya/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-rya/commit/917e7a57
Tree: http://git-wip-us.apache.org/repos/asf/incubator-rya/tree/917e7a57
Diff: http://git-wip-us.apache.org/repos/asf/incubator-rya/diff/917e7a57

Branch: refs/heads/develop
Commit: 917e7a57211532dd13ce8ae1abd4dc6067114ad4
Parents: 2933f66
Author: isper3at <[email protected]>
Authored: Tue Apr 5 15:42:13 2016 -0400
Committer: isper3at <[email protected]>
Committed: Fri Jun 17 13:00:49 2016 -0400

----------------------------------------------------------------------
 .../api/persist/index/RyaSecondaryIndexer.java  |   20 +-
 .../mvm/rya/mongodb/MongoConnectorFactory.java  |   66 +
 .../mvm/rya/mongodb/MongoDBQueryEngine.java     |  159 +-
 .../java/mvm/rya/mongodb/MongoDBRyaDAO.java     |  330 ++-
 .../rya/mongodb/dao/MongoDBStorageStrategy.java |   20 +-
 .../dao/SimpleMongoDBStorageStrategy.java       |    3 +-
 .../java/mvm/rya/mongodb/MongoDBRyaDAOTest.java |  137 +
 .../rya/accumulo/mr/NullFreeTextIndexer.java    |    4 +-
 .../mvm/rya/accumulo/mr/NullGeoIndexer.java     |   18 +-
 .../rya/accumulo/mr/NullTemporalIndexer.java    |   24 +-
 .../mvm/rya/accumulo/mr/RyaOutputFormat.java    |    2 +-
 .../mvm/rya/accumulo/mr/StatementWritable.java  |    4 +-
 .../rya/indexing/FilterFunctionOptimizer.java   |  241 +-
 .../java/mvm/rya/indexing/FreeTextIndexer.java  |   32 +-
 .../main/java/mvm/rya/indexing/GeoIndexer.java  |  120 +-
 .../java/mvm/rya/indexing/IteratorFactory.java  |    2 +-
 .../main/java/mvm/rya/indexing/KeyParts.java    |  174 +-
 .../src/main/java/mvm/rya/indexing/Md5Hash.java |   44 +
 .../java/mvm/rya/indexing/SearchFunction.java   |    4 +-
 .../mvm/rya/indexing/StatementConstraints.java  |   73 +
 .../mvm/rya/indexing/StatementContraints.java   |   73 -
 .../mvm/rya/indexing/StatementSerializer.java   |  225 ++
 .../java/mvm/rya/indexing/TemporalIndexer.java  |  133 +-
 .../rya/indexing/TemporalInstantRfc3339.java    |  219 ++
 .../java/mvm/rya/indexing/TemporalTupleSet.java |  287 ++
 .../mvm/rya/indexing/accumulo/ConfigUtils.java  |   34 +-
 .../java/mvm/rya/indexing/accumulo/Md5Hash.java |   45 -
 .../indexing/accumulo/StatementSerializer.java  |  227 --
 .../accumulo/entity/EntityCentricIndex.java     |  207 +-
 .../freetext/AccumuloFreeTextIndexer.java       |    8 +-
 .../accumulo/freetext/ColumnPrefixes.java       |    4 +-
 .../accumulo/freetext/FreeTextTupleSet.java     |    4 +-
 .../accumulo/geo/GeoMesaGeoIndexer.java         |  174 +-
 .../rya/indexing/accumulo/geo/GeoTupleSet.java  |  161 +-
 .../temporal/AccumuloTemporalIndexer.java       |  841 +++---
 .../temporal/TemporalInstantRfc3339.java        |  218 --
 .../accumulo/temporal/TemporalTupleSet.java     |  320 ---
 .../external/PrecomputedJoinIndexer.java        |   10 +-
 .../external/fluo/FluoPcjUpdaterSupplier.java   |   20 +-
 .../indexing/mongodb/AbstractMongoIndexer.java  |  149 +-
 .../mongodb/GeoMongoDBStorageStrategy.java      |  150 --
 .../mongodb/IndexingMongoDBStorageStrategy.java |   57 +
 .../indexing/mongodb/MongoFreeTextIndexer.java  |  236 --
 .../rya/indexing/mongodb/MongoGeoIndexer.java   |  295 ---
 .../rya/indexing/mongodb/MongoGeoTupleSet.java  |  361 ---
 .../mongodb/TextMongoDBStorageStrategy.java     |   89 -
 .../mongodb/freetext/MongoFreeTextIndexer.java  |   62 +
 .../freetext/TextMongoDBStorageStrategy.java    |   45 +
 .../mongodb/geo/GeoMongoDBStorageStrategy.java  |  143 +
 .../indexing/mongodb/geo/MongoGeoIndexer.java   |  118 +
 .../indexing/mongodb/geo/MongoGeoTupleSet.java  |  361 +++
 .../mongodb/temporal/MongoTemporalIndexer.java  |  160 ++
 .../TemporalMongoDBStorageStrategy.java         |   68 +
 .../mvm/rya/sail/config/RyaSailFactory.java     |   44 +-
 .../accumulo/StatementSerializerTest.java       |    2 +-
 .../freetext/AccumuloFreeTextIndexerTest.java   |    8 +-
 .../indexing/accumulo/geo/GeoIndexerSfTest.java |    4 +-
 .../indexing/accumulo/geo/GeoIndexerTest.java   |   22 +-
 .../temporal/AccumuloTemporalIndexerTest.java   |   13 +-
 .../accumulo/temporal/TemporalInstantTest.java  |    1 +
 .../accumulo/temporal/TemporalIntervalTest.java |    1 +
 .../AccumuloConstantPcjIntegrationTest.java     |   15 +-
 .../external/AccumuloPcjIntegrationTest.java    |   15 +-
 .../indexing/external/PCJOptionalTestIT.java    |  397 +--
 .../external/PcjIntegrationTestingUtil.java     |  561 ++--
 .../PrecompJoinOptimizerIntegrationTest.java    |  232 +-
 .../external/tupleSet/AccumuloIndexSetTest.java | 2447 +++++-------------
 .../mongo/MongoFreeTextIndexerTest.java         |  112 +-
 .../indexing/mongo/MongoGeoIndexerSfTest.java   |   73 +-
 .../rya/indexing/mongo/MongoGeoIndexerTest.java |  278 +-
 .../mongo/MongoTemporalIndexerTest.java         |  700 +++++
 .../src/main/java/RyaDirectExample.java         |  113 +-
 72 files changed, 5806 insertions(+), 6213 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/917e7a57/common/rya.api/src/main/java/mvm/rya/api/persist/index/RyaSecondaryIndexer.java
----------------------------------------------------------------------
diff --git 
a/common/rya.api/src/main/java/mvm/rya/api/persist/index/RyaSecondaryIndexer.java
 
b/common/rya.api/src/main/java/mvm/rya/api/persist/index/RyaSecondaryIndexer.java
index 8c827c1..e92adef 100644
--- 
a/common/rya.api/src/main/java/mvm/rya/api/persist/index/RyaSecondaryIndexer.java
+++ 
b/common/rya.api/src/main/java/mvm/rya/api/persist/index/RyaSecondaryIndexer.java
@@ -8,9 +8,9 @@ package mvm.rya.api.persist.index;
  * 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
@@ -24,12 +24,14 @@ import java.io.Closeable;
 import java.io.Flushable;
 import java.io.IOException;
 import java.util.Collection;
+import java.util.Set;
+
+import org.apache.hadoop.conf.Configurable;
+import org.openrdf.model.URI;
 
 import mvm.rya.api.domain.RyaStatement;
 import mvm.rya.api.domain.RyaURI;
 
-import org.apache.hadoop.conf.Configurable;
-
 public interface RyaSecondaryIndexer extends Closeable, Flushable, 
Configurable {
 
     public String getTableName();
@@ -42,4 +44,14 @@ public interface RyaSecondaryIndexer extends Closeable, 
Flushable, Configurable
 
     public void dropGraph(RyaURI... graphs);
 
+    /**
+     * @return the set of predicates indexed by the indexer.
+     */
+    public abstract Set<URI> getIndexablePredicates();
+
+    @Override
+    public abstract void flush() throws IOException;
+
+    @Override
+    public abstract void close() throws IOException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/917e7a57/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoConnectorFactory.java
----------------------------------------------------------------------
diff --git 
a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoConnectorFactory.java 
b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoConnectorFactory.java
new file mode 100644
index 0000000..747ad1e
--- /dev/null
+++ b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoConnectorFactory.java
@@ -0,0 +1,66 @@
+package mvm.rya.mongodb;
+
+/*
+ * 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.
+ */
+
+import java.net.UnknownHostException;
+import java.util.Arrays;
+
+import org.apache.hadoop.conf.Configuration;
+
+import com.mongodb.MongoClient;
+import com.mongodb.MongoCredential;
+import com.mongodb.ServerAddress;
+
+/**
+ * Mongo convention generally allows for a single instance of a {@link 
MongoClient}
+ * throughout the life cycle of an application.  This MongoConnectorFactory 
lazy
+ * loads a Mongo Client and uses the same one whenever {@link 
MongoConnectorFactory#getMongoClient(Configuration)}
+ * is invoked.
+ */
+public class MongoConnectorFactory {
+    private static MongoClient mongoClient;
+
+    /**
+     * @param conf The {@link Configuration} defining how to construct the 
MongoClient.
+     * @return A {@link MongoClient}.  This client is lazy loaded and the same 
one
+     * is used throughout the lifecycle of the application.
+     * @throws NumberFormatException - Thrown if the configured port is not a 
valid number
+     * @throws UnknownHostException - The configured host cannot be found.
+     */
+    public static synchronized MongoClient getMongoClient(final Configuration 
conf) throws NumberFormatException, UnknownHostException {
+        if(mongoClient == null) {
+            final String host = 
conf.get(MongoDBRdfConfiguration.MONGO_INSTANCE);
+            final int port = 
Integer.parseInt(conf.get(MongoDBRdfConfiguration.MONGO_INSTANCE_PORT));
+            final ServerAddress server = new ServerAddress(host, port);
+
+            //check for authentication credentials
+            if (conf.get(MongoDBRdfConfiguration.MONGO_USER) != null) {
+                final String username = 
conf.get(MongoDBRdfConfiguration.MONGO_USER);
+                final String dbName = 
conf.get(MongoDBRdfConfiguration.MONGO_DB_NAME);
+                final char[] pswd = 
conf.get(MongoDBRdfConfiguration.MONGO_USER_PASSWORD).toCharArray();
+                final MongoCredential cred = 
MongoCredential.createCredential(username, dbName, pswd);
+                mongoClient = new MongoClient(server, Arrays.asList(cred));
+            } else {
+                mongoClient = new MongoClient(server);
+            }
+        }
+        return mongoClient;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/917e7a57/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBQueryEngine.java
----------------------------------------------------------------------
diff --git 
a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBQueryEngine.java 
b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBQueryEngine.java
index 57548ec..fc4310f 100644
--- a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBQueryEngine.java
+++ b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBQueryEngine.java
@@ -1,5 +1,24 @@
 package mvm.rya.mongodb;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.calrissian.mango.collect.CloseableIterable;
+import org.openrdf.query.BindingSet;
+
+import com.mongodb.DB;
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+import com.mongodb.MongoClient;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -8,9 +27,9 @@ package mvm.rya.mongodb;
  * 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
@@ -21,17 +40,6 @@ package mvm.rya.mongodb;
 
 
 import info.aduna.iteration.CloseableIteration;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.net.UnknownHostException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
 import mvm.rya.api.domain.RyaStatement;
 import mvm.rya.api.persist.RyaDAOException;
 import mvm.rya.api.persist.query.BatchRyaQuery;
@@ -44,14 +52,6 @@ import 
mvm.rya.mongodb.iter.RyaStatementBindingSetCursorIterator;
 import mvm.rya.mongodb.iter.RyaStatementCursorIterable;
 import mvm.rya.mongodb.iter.RyaStatementCursorIterator;
 
-import org.calrissian.mango.collect.CloseableIterable;
-import org.openrdf.query.BindingSet;
-
-import com.mongodb.DB;
-import com.mongodb.DBCollection;
-import com.mongodb.DBObject;
-import com.mongodb.MongoClient;
-
 /**
  * Date: 7/17/12
  * Time: 9:28 AM
@@ -59,42 +59,41 @@ import com.mongodb.MongoClient;
 public class MongoDBQueryEngine implements 
RyaQueryEngine<MongoDBRdfConfiguration>, Closeable {
 
     private MongoDBRdfConfiguration configuration;
-       private MongoClient mongoClient;
-       private DBCollection coll;
-       private MongoDBStorageStrategy strategy;
-    
-    public MongoDBQueryEngine(MongoDBRdfConfiguration conf) throws 
NumberFormatException, UnknownHostException{
-               mongoClient = new 
MongoClient(conf.get(MongoDBRdfConfiguration.MONGO_INSTANCE),
-                               
Integer.valueOf(conf.get(MongoDBRdfConfiguration.MONGO_INSTANCE_PORT)));
-               DB db = mongoClient.getDB( 
conf.get(MongoDBRdfConfiguration.MONGO_DB_NAME));
+       private final MongoClient mongoClient;
+       private final DBCollection coll;
+       private final MongoDBStorageStrategy strategy;
+
+    public MongoDBQueryEngine(final MongoDBRdfConfiguration conf, final 
MongoClient mongoClient) {
+               this.mongoClient = checkNotNull(mongoClient);
+               final DB db = mongoClient.getDB( 
conf.get(MongoDBRdfConfiguration.MONGO_DB_NAME));
                coll = db.getCollection(conf.getTriplesCollectionName());
-               this.strategy = new SimpleMongoDBStorageStrategy();
+               strategy = new SimpleMongoDBStorageStrategy();
     }
-    
-    
+
+
        @Override
-       public void setConf(MongoDBRdfConfiguration conf) {
+       public void setConf(final MongoDBRdfConfiguration conf) {
                configuration = conf;
        }
-       
+
        @Override
        public MongoDBRdfConfiguration getConf() {
                return configuration;
        }
-       
+
        @Override
        public CloseableIteration<RyaStatement, RyaDAOException> query(
-                       RyaStatement stmt, MongoDBRdfConfiguration conf)
+                       final RyaStatement stmt, MongoDBRdfConfiguration conf)
                        throws RyaDAOException {
         if (conf == null) {
             conf = configuration;
         }
-        Long maxResults = conf.getLimit();
-        Set<DBObject> queries = new HashSet<DBObject>();
-        DBObject query = strategy.getQuery(stmt);
+        final Long maxResults = conf.getLimit();
+        final Set<DBObject> queries = new HashSet<DBObject>();
+        final DBObject query = strategy.getQuery(stmt);
         queries.add(query);
-        RyaStatementCursorIterator iterator = new 
RyaStatementCursorIterator(coll, queries, strategy);
-        
+        final RyaStatementCursorIterator iterator = new 
RyaStatementCursorIterator(coll, queries, strategy);
+
         if (maxResults != null) {
             iterator.setMaxResults(maxResults);
         }
@@ -102,95 +101,95 @@ public class MongoDBQueryEngine implements 
RyaQueryEngine<MongoDBRdfConfiguratio
        }
        @Override
        public CloseableIteration<? extends Entry<RyaStatement, BindingSet>, 
RyaDAOException> queryWithBindingSet(
-                       Collection<Entry<RyaStatement, BindingSet>> stmts,
+                       final Collection<Entry<RyaStatement, BindingSet>> stmts,
                        MongoDBRdfConfiguration conf) throws RyaDAOException {
         if (conf == null) {
             conf = configuration;
         }
-        Long maxResults = conf.getLimit();
-        Map<DBObject, BindingSet> rangeMap = new HashMap<DBObject, 
BindingSet>();
- 
+        final Long maxResults = conf.getLimit();
+        final Map<DBObject, BindingSet> rangeMap = new HashMap<DBObject, 
BindingSet>();
+
         //TODO: cannot span multiple tables here
         try {
-            for (Map.Entry<RyaStatement, BindingSet> stmtbs : stmts) {
-                RyaStatement stmt = stmtbs.getKey();
-                BindingSet bs = stmtbs.getValue();
-                DBObject query = strategy.getQuery(stmt);
+            for (final Map.Entry<RyaStatement, BindingSet> stmtbs : stmts) {
+                final RyaStatement stmt = stmtbs.getKey();
+                final BindingSet bs = stmtbs.getValue();
+                final DBObject query = strategy.getQuery(stmt);
                 rangeMap.put(query, bs);
             }
-            
+
             // TODO not sure what to do about regex ranges?
-            RyaStatementBindingSetCursorIterator iterator = new 
RyaStatementBindingSetCursorIterator(coll, rangeMap, strategy);
-            
+            final RyaStatementBindingSetCursorIterator iterator = new 
RyaStatementBindingSetCursorIterator(coll, rangeMap, strategy);
+
             if (maxResults != null) {
                 iterator.setMaxResults(maxResults);
             }
             return iterator;
-        } catch (Exception e) {
+        } catch (final Exception e) {
             throw new RyaDAOException(e);
         }
 
        }
        @Override
        public CloseableIteration<RyaStatement, RyaDAOException> batchQuery(
-                       Collection<RyaStatement> stmts, MongoDBRdfConfiguration 
conf)
+                       final Collection<RyaStatement> stmts, 
MongoDBRdfConfiguration conf)
                        throws RyaDAOException {
         if (conf == null) {
             conf = configuration;
         }
-        Long maxResults = conf.getLimit();
-        Set<DBObject> queries = new HashSet<DBObject>();
- 
+        final Long maxResults = conf.getLimit();
+        final Set<DBObject> queries = new HashSet<DBObject>();
+
         try {
-            for (RyaStatement stmt : stmts) {
+            for (final RyaStatement stmt : stmts) {
                 queries.add( strategy.getQuery(stmt));
              }
-            
+
             // TODO not sure what to do about regex ranges?
-            RyaStatementCursorIterator iterator = new 
RyaStatementCursorIterator(coll, queries, strategy);
-            
+            final RyaStatementCursorIterator iterator = new 
RyaStatementCursorIterator(coll, queries, strategy);
+
             if (maxResults != null) {
                 iterator.setMaxResults(maxResults);
             }
             return iterator;
-        } catch (Exception e) {
+        } catch (final Exception e) {
             throw new RyaDAOException(e);
         }
 
        }
        @Override
-       public CloseableIterable<RyaStatement> query(RyaQuery ryaQuery)
+       public CloseableIterable<RyaStatement> query(final RyaQuery ryaQuery)
                        throws RyaDAOException {
-               Set<DBObject> queries = new HashSet<DBObject>();
-        
+               final Set<DBObject> queries = new HashSet<DBObject>();
+
                try {
                 queries.add( strategy.getQuery(ryaQuery));
-                   
+
                    // TODO not sure what to do about regex ranges?
                 // TODO this is gross
-                RyaStatementCursorIterable iterator = new 
RyaStatementCursorIterable(new NonCloseableRyaStatementCursorIterator(new 
RyaStatementCursorIterator(coll, queries, strategy)));
-                   
+                final RyaStatementCursorIterable iterator = new 
RyaStatementCursorIterable(new NonCloseableRyaStatementCursorIterator(new 
RyaStatementCursorIterator(coll, queries, strategy)));
+
                    return iterator;
-               } catch (Exception e) {
+               } catch (final Exception e) {
                    throw new RyaDAOException(e);
                }
        }
        @Override
-       public CloseableIterable<RyaStatement> query(BatchRyaQuery 
batchRyaQuery)
+       public CloseableIterable<RyaStatement> query(final BatchRyaQuery 
batchRyaQuery)
                        throws RyaDAOException {
          try {
-             Set<DBObject> queries = new HashSet<DBObject>();
-            for (RyaStatement statement : batchRyaQuery.getQueries()){
+             final Set<DBObject> queries = new HashSet<DBObject>();
+            for (final RyaStatement statement : batchRyaQuery.getQueries()){
                 queries.add( strategy.getQuery(statement));
-                               
+
             }
-            
+
             // TODO not sure what to do about regex ranges?
             // TODO this is gross
-            RyaStatementCursorIterable iterator = new 
RyaStatementCursorIterable(new NonCloseableRyaStatementCursorIterator(new 
RyaStatementCursorIterator(coll, queries, strategy)));
-            
+            final RyaStatementCursorIterable iterator = new 
RyaStatementCursorIterable(new NonCloseableRyaStatementCursorIterator(new 
RyaStatementCursorIterator(coll, queries, strategy)));
+
             return iterator;
-        } catch (Exception e) {
+        } catch (final Exception e) {
             throw new RyaDAOException(e);
         }
        }
@@ -199,9 +198,9 @@ public class MongoDBQueryEngine implements 
RyaQueryEngine<MongoDBRdfConfiguratio
     public void close() throws IOException {
         if (mongoClient != null){ mongoClient.close(); }
     }
-       
-       
-       
+
+
+
 
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/917e7a57/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBRyaDAO.java
----------------------------------------------------------------------
diff --git a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBRyaDAO.java 
b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBRyaDAO.java
index 0ad96ff..5695d8c 100644
--- a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBRyaDAO.java
+++ b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBRyaDAO.java
@@ -8,9 +8,9 @@ package mvm.rya.mongodb;
  * 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
@@ -23,10 +23,19 @@ package mvm.rya.mongodb;
 import java.io.IOException;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.commons.io.IOUtils;
+import org.apache.log4j.Logger;
+
+import com.mongodb.DB;
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+import com.mongodb.InsertOptions;
+import com.mongodb.MongoClient;
+
+import de.flapdoodle.embed.mongo.tests.MongodForTestsFactory;
 import mvm.rya.api.RdfCloudTripleStoreConfiguration;
 import mvm.rya.api.domain.RyaStatement;
 import mvm.rya.api.domain.RyaURI;
@@ -40,134 +49,91 @@ import mvm.rya.mongodb.dao.MongoDBStorageStrategy;
 import mvm.rya.mongodb.dao.SimpleMongoDBNamespaceManager;
 import mvm.rya.mongodb.dao.SimpleMongoDBStorageStrategy;
 
-import org.apache.commons.io.IOUtils;
+/**
+ * Default DAO for mongo backed RYA allowing for CRUD operations.
+ */
+public final class MongoDBRyaDAO implements RyaDAO<MongoDBRdfConfiguration>{
+    private static final Logger log = Logger.getLogger(MongoDBRyaDAO.class);
+
+    private MongoDBRdfConfiguration conf;
+    private MongoClient mongoClient;
+    private DB db;
+    private DBCollection coll;
+    private MongoDBQueryEngine queryEngine;
+    private MongoDBStorageStrategy storageStrategy;
+    private MongoDBNamespaceManager nameSpaceManager;
+    private MongodForTestsFactory testsFactory;
+
+    private List<RyaSecondaryIndexer> secondaryIndexers;
+
+    /**
+     * Creates a new {@link MongoDBRyaDAO}
+     * @param conf
+     * @throws RyaDAOException
+     */
+    public MongoDBRyaDAO(final MongoDBRdfConfiguration conf) throws 
RyaDAOException, NumberFormatException, UnknownHostException {
+        try {
+            mongoClient = MongoConnectorFactory.getMongoClient(conf);
+            conf.setMongoClient(mongoClient);
+            init();
+        } catch (NumberFormatException | UnknownHostException e) {
+            log.error("Unable to create a connection to mongo.", e);
+            throw e;
+        }
+    }
 
-import com.mongodb.DB;
-import com.mongodb.DBCollection;
-import com.mongodb.DBObject;
-import com.mongodb.InsertOptions;
-import com.mongodb.MongoClient;
-import com.mongodb.MongoCredential;
-import com.mongodb.ServerAddress;
 
-import de.flapdoodle.embed.mongo.distribution.Version;
-import de.flapdoodle.embed.mongo.tests.MongodForTestsFactory;
+    public MongoDBRyaDAO(final MongoDBRdfConfiguration conf, final MongoClient 
mongoClient) throws RyaDAOException{
+        this.conf = conf;
+        this.mongoClient = mongoClient;
+        conf.setMongoClient(mongoClient);
+        init();
+    }
 
-public class MongoDBRyaDAO implements RyaDAO<MongoDBRdfConfiguration>{
-
-       
-       private MongoDBRdfConfiguration conf;
-       private MongoClient mongoClient;
-       private DB db;
-       private DBCollection coll;
-       private MongoDBQueryEngine queryEngine;
-       private MongoDBStorageStrategy storageStrategy;
-       private MongoDBNamespaceManager nameSpaceManager;
-       private MongodForTestsFactory testsFactory;
-       
-       private List<RyaSecondaryIndexer> secondaryIndexers;
-       
-       public MongoDBRyaDAO(MongoDBRdfConfiguration conf) throws 
RyaDAOException{
-               this.conf = conf;
-               initConnection();
-               conf.setMongoClient(mongoClient);
-               init();
-       }
-
-       
-       public MongoDBRyaDAO(MongoDBRdfConfiguration conf, MongoClient 
mongoClient) throws RyaDAOException{
-               this.conf = conf;
-               this.mongoClient = mongoClient;
-               conf.setMongoClient(mongoClient);
-               init();
-       }
-
-       public void setConf(MongoDBRdfConfiguration conf) {
-               this.conf = conf;
-       }
-       
-       public void setMongoClient(MongoClient mongoClient) {
-               this.mongoClient = mongoClient;
-       }
-       
-       
-       public MongoClient getMongoClient(){
-               return mongoClient;
-       }
-
-       public void setDB(DB db) {
-               this.db = db;
-       }
-
-       
-       public void setDBCollection(DBCollection coll) {
-               this.coll = coll;
-       }
+    @Override
+    public void setConf(final MongoDBRdfConfiguration conf) {
+        this.conf = conf;
+    }
 
-    public MongoDBRdfConfiguration getConf() {
-        return conf;
+    public MongoClient getMongoClient(){
+        return mongoClient;
     }
 
-    public void initConnection() throws RyaDAOException {
-        try {
-            boolean useMongoTest = conf.getUseTestMongo();
-            if (useMongoTest) {
-                testsFactory = 
MongodForTestsFactory.with(Version.Main.PRODUCTION);
-                mongoClient = testsFactory.newMongo();
-                int port = mongoClient.getServerAddressList().get(0).getPort();
-                conf.set(MongoDBRdfConfiguration.MONGO_INSTANCE_PORT, 
Integer.toString(port));
-            } else {
-                ServerAddress server = new 
ServerAddress(conf.get(MongoDBRdfConfiguration.MONGO_INSTANCE),
-                        
Integer.valueOf(conf.get(MongoDBRdfConfiguration.MONGO_INSTANCE_PORT)));
-                if (conf.get(MongoDBRdfConfiguration.MONGO_USER) != null) {
-                    MongoCredential cred = MongoCredential.createCredential(
-                            conf.get(MongoDBRdfConfiguration.MONGO_USER),
-                            conf.get(MongoDBRdfConfiguration.MONGO_DB_NAME),
-                            
conf.get(MongoDBRdfConfiguration.MONGO_USER_PASSWORD).toCharArray());
-                    mongoClient = new MongoClient(server, Arrays.asList(cred));
-                } else {
-                    mongoClient = new MongoClient(server);
-                }
-            }
-        } catch (UnknownHostException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        } catch (IOException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
+    public void setDB(final DB db) {
+        this.db = db;
+    }
 
+
+    public void setDBCollection(final DBCollection coll) {
+        this.coll = coll;
+    }
+
+    @Override
+    public MongoDBRdfConfiguration getConf() {
+        return conf;
     }
 
-    
+    @Override
     public void init() throws RyaDAOException {
-        try {
             secondaryIndexers = conf.getAdditionalIndexers();
-            for(RyaSecondaryIndexer index: secondaryIndexers) {
+            for(final RyaSecondaryIndexer index: secondaryIndexers) {
                 index.setConf(conf);
             }
-            
+
             db = 
mongoClient.getDB(conf.get(MongoDBRdfConfiguration.MONGO_DB_NAME));
             coll = db.getCollection(conf.getTriplesCollectionName());
             nameSpaceManager = new 
SimpleMongoDBNamespaceManager(db.getCollection(conf.getNameSpacesCollectionName()));
-            queryEngine = new MongoDBQueryEngine(conf);
+            queryEngine = new MongoDBQueryEngine(conf, mongoClient);
             storageStrategy = new SimpleMongoDBStorageStrategy();
             storageStrategy.createIndices(coll);
-
-        } catch (UnknownHostException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        } catch (IOException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-
     }
 
+    @Override
     public boolean isInitialized() throws RyaDAOException {
         return true;
     }
 
+    @Override
     public void destroy() throws RyaDAOException {
         if (mongoClient != null) {
             mongoClient.close();
@@ -179,85 +145,85 @@ public class MongoDBRyaDAO implements 
RyaDAO<MongoDBRdfConfiguration>{
         IOUtils.closeQuietly(queryEngine);
     }
 
-       public void add(RyaStatement statement) throws RyaDAOException {        
        
-               // add it to the collection
-               try {
-                       coll.insert(storageStrategy.serialize(statement));
-                       for(RyaSecondaryIndexer index: secondaryIndexers) {
-                           index.storeStatement(statement);
-                       }
-               }
-               catch (com.mongodb.MongoException.DuplicateKey exception){
-                       // ignore
-               }
-               catch (com.mongodb.DuplicateKeyException exception){
-                       // ignore
-               }
-               catch (Exception ex){
-                       // ignore single exceptions
-                       ex.printStackTrace();
-               }
-       }
-       
-       public void add(Iterator<RyaStatement> statement) throws 
RyaDAOException {
-               List<DBObject> dbInserts = new ArrayList<DBObject>();
-               while (statement.hasNext()){
-                       RyaStatement ryaStatement = statement.next();
-                       DBObject insert = 
storageStrategy.serialize(ryaStatement);
-                       dbInserts.add(insert);
-                       
+    @Override
+    public void add(final RyaStatement statement) throws RyaDAOException {
+        // add it to the collection
+        try {
+            coll.insert(storageStrategy.serialize(statement));
+            for(final RyaSecondaryIndexer index: secondaryIndexers) {
+                index.storeStatement(statement);
+            }
+        } catch (final IOException e) {
+            log.error("Unable to add: " + statement.toString());
+            throw new RyaDAOException(e);
+        }
+    }
+
+    @Override
+    public void add(final Iterator<RyaStatement> statement) throws 
RyaDAOException {
+        final List<DBObject> dbInserts = new ArrayList<DBObject>();
+        while (statement.hasNext()){
+            final RyaStatement ryaStatement = statement.next();
+            final DBObject insert = storageStrategy.serialize(ryaStatement);
+            dbInserts.add(insert);
+
             try {
-                for (RyaSecondaryIndexer index : secondaryIndexers) {
+                for (final RyaSecondaryIndexer index : secondaryIndexers) {
                     index.storeStatement(ryaStatement);
                 }
-            } catch (IOException e) {
-                throw new RyaDAOException(e);
+            } catch (final IOException e) {
+                log.error("Failed to add: " + ryaStatement.toString() + " to 
the indexer");
             }
-            
-               }
-               coll.insert(dbInserts, new 
InsertOptions().continueOnError(true));
-       }
-
-       public void delete(RyaStatement statement, MongoDBRdfConfiguration conf)
-                       throws RyaDAOException {
-               DBObject obj = storageStrategy.getQuery(statement);
-               coll.remove(obj);
-       }
-
-       public void dropGraph(MongoDBRdfConfiguration conf, RyaURI... graphs)
-                       throws RyaDAOException {
-               
-       }
-
-       public void delete(Iterator<RyaStatement> statements,
-                       MongoDBRdfConfiguration conf) throws RyaDAOException {
-               while (statements.hasNext()){
-                       RyaStatement ryaStatement = statements.next();
-                       coll.remove(storageStrategy.getQuery(ryaStatement));
-               }
-               
-       }
-
-       public String getVersion() throws RyaDAOException {
-               return "1.0";
-       }
-
-       public RyaQueryEngine<MongoDBRdfConfiguration> getQueryEngine() {
-               return queryEngine;
-       }
-
-       public RyaNamespaceManager<MongoDBRdfConfiguration> 
getNamespaceManager() {
-               return nameSpaceManager;
-       }
-
-       public void purge(RdfCloudTripleStoreConfiguration configuration) {
-               // TODO Auto-generated method stub
-               
-       }
-
-       public void dropAndDestroy() throws RyaDAOException {
-               db.dropDatabase(); // this is dangerous!
-       }
 
+        }
+        coll.insert(dbInserts, new InsertOptions().continueOnError(true));
+    }
+
+    @Override
+    public void delete(final RyaStatement statement, final 
MongoDBRdfConfiguration conf)
+            throws RyaDAOException {
+        final DBObject obj = storageStrategy.getQuery(statement);
+        coll.remove(obj);
+    }
+
+    @Override
+    public void dropGraph(final MongoDBRdfConfiguration conf, final RyaURI... 
graphs)
+            throws RyaDAOException {
 
+    }
+
+    @Override
+    public void delete(final Iterator<RyaStatement> statements,
+            final MongoDBRdfConfiguration conf) throws RyaDAOException {
+        while (statements.hasNext()){
+            final RyaStatement ryaStatement = statements.next();
+            coll.remove(storageStrategy.getQuery(ryaStatement));
+        }
+
+    }
+
+    @Override
+    public String getVersion() throws RyaDAOException {
+        return "1.0";
+    }
+
+    @Override
+    public RyaQueryEngine<MongoDBRdfConfiguration> getQueryEngine() {
+        return queryEngine;
+    }
+
+    @Override
+    public RyaNamespaceManager<MongoDBRdfConfiguration> getNamespaceManager() {
+        return nameSpaceManager;
+    }
+
+    @Override
+    public void purge(final RdfCloudTripleStoreConfiguration configuration) {
+
+    }
+
+    @Override
+    public void dropAndDestroy() throws RyaDAOException {
+        db.dropDatabase(); // this is dangerous!
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/917e7a57/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/dao/MongoDBStorageStrategy.java
----------------------------------------------------------------------
diff --git 
a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/dao/MongoDBStorageStrategy.java 
b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/dao/MongoDBStorageStrategy.java
index 8a1004f..5ae371b 100644
--- 
a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/dao/MongoDBStorageStrategy.java
+++ 
b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/dao/MongoDBStorageStrategy.java
@@ -1,5 +1,8 @@
 package mvm.rya.mongodb.dao;
 
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -8,9 +11,9 @@ package mvm.rya.mongodb.dao;
  * 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
@@ -23,16 +26,17 @@ package mvm.rya.mongodb.dao;
 import mvm.rya.api.domain.RyaStatement;
 import mvm.rya.api.persist.query.RyaQuery;
 
-import com.mongodb.DBCollection;
-import com.mongodb.DBObject;
-
-public interface MongoDBStorageStrategy {
+/**
+ * Defines how objects are stored in MongoDB.
+ * <T> - The object to store in MongoDB
+ */
+public interface MongoDBStorageStrategy<T> {
 
-       public DBObject getQuery(RyaStatement stmt);
+       public DBObject getQuery(T statement);
 
        public RyaStatement deserializeDBObject(DBObject queryResult);
 
-       public DBObject serialize(RyaStatement statement);
+       public DBObject serialize(T statement);
 
        public DBObject getQuery(RyaQuery ryaQuery);
 

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/917e7a57/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/dao/SimpleMongoDBStorageStrategy.java
----------------------------------------------------------------------
diff --git 
a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/dao/SimpleMongoDBStorageStrategy.java
 
b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/dao/SimpleMongoDBStorageStrategy.java
index 9ca6279..df4d6af 100644
--- 
a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/dao/SimpleMongoDBStorageStrategy.java
+++ 
b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/dao/SimpleMongoDBStorageStrategy.java
@@ -1,7 +1,5 @@
 package mvm.rya.mongodb.dao;
 
-import static org.openrdf.model.vocabulary.XMLSchema.ANYURI;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -21,6 +19,7 @@ import static org.openrdf.model.vocabulary.XMLSchema.ANYURI;
  * under the License.
  */
 
+import static org.openrdf.model.vocabulary.XMLSchema.ANYURI;
 
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/917e7a57/dao/mongodb.rya/src/test/java/mvm/rya/mongodb/MongoDBRyaDAOTest.java
----------------------------------------------------------------------
diff --git 
a/dao/mongodb.rya/src/test/java/mvm/rya/mongodb/MongoDBRyaDAOTest.java 
b/dao/mongodb.rya/src/test/java/mvm/rya/mongodb/MongoDBRyaDAOTest.java
new file mode 100644
index 0000000..dde0eda
--- /dev/null
+++ b/dao/mongodb.rya/src/test/java/mvm/rya/mongodb/MongoDBRyaDAOTest.java
@@ -0,0 +1,137 @@
+package mvm.rya.mongodb;
+/*
+ * 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.
+ */
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.apache.hadoop.conf.Configuration;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.mongodb.DB;
+import com.mongodb.DBCollection;
+import com.mongodb.MongoClient;
+import com.mongodb.MongoException;
+
+import de.flapdoodle.embed.mongo.distribution.Version;
+import de.flapdoodle.embed.mongo.tests.MongodForTestsFactory;
+import mvm.rya.api.RdfCloudTripleStoreConfiguration;
+import mvm.rya.api.domain.RyaStatement;
+import mvm.rya.api.domain.RyaStatement.RyaStatementBuilder;
+import mvm.rya.api.domain.RyaURI;
+import mvm.rya.api.persist.RyaDAOException;
+
+public class MongoDBRyaDAOTest {
+
+       private MongodForTestsFactory testsFactory;
+       private MongoDBRyaDAO dao;
+       private MongoDBRdfConfiguration configuration;
+       private MongoClient mongoClient;
+
+       @Before
+       public void setUp() throws IOException, RyaDAOException{
+               testsFactory = 
MongodForTestsFactory.with(Version.Main.PRODUCTION);
+               final Configuration conf = new Configuration();
+        conf.set(MongoDBRdfConfiguration.USE_TEST_MONGO, "true");
+        conf.set(MongoDBRdfConfiguration.MONGO_DB_NAME, "test");
+        conf.set(MongoDBRdfConfiguration.MONGO_COLLECTION_PREFIX, "rya_");
+        conf.set(RdfCloudTripleStoreConfiguration.CONF_TBL_PREFIX, "rya_");
+        configuration = new MongoDBRdfConfiguration(conf);
+               mongoClient = testsFactory.newMongo();
+        final int port = mongoClient.getServerAddressList().get(0).getPort();
+        configuration.set(MongoDBRdfConfiguration.MONGO_INSTANCE_PORT, 
""+port);
+               dao = new MongoDBRyaDAO(configuration, mongoClient);
+       }
+
+       @Test
+       public void testDeleteWildcard() throws RyaDAOException {
+               final RyaStatementBuilder builder = new RyaStatementBuilder();
+               builder.setPredicate(new RyaURI("http://temp.com";));
+               dao.delete(builder.build(), configuration);
+       }
+
+
+       @Test
+       public void testAdd() throws RyaDAOException, MongoException, 
IOException {
+               final RyaStatementBuilder builder = new RyaStatementBuilder();
+               builder.setPredicate(new RyaURI("http://temp.com";));
+               builder.setSubject(new RyaURI("http://subject.com";));
+               builder.setObject(new RyaURI("http://object.com";));
+
+               final DB db = 
mongoClient.getDB(configuration.get(MongoDBRdfConfiguration.MONGO_DB_NAME));
+        final DBCollection coll = 
db.getCollection(configuration.getTriplesCollectionName());
+
+               dao.add(builder.build());
+
+        assertEquals(coll.count(),1);
+
+       }
+
+       @Test
+       public void testDelete() throws RyaDAOException, MongoException, 
IOException {
+               final RyaStatementBuilder builder = new RyaStatementBuilder();
+               builder.setPredicate(new RyaURI("http://temp.com";));
+               builder.setSubject(new RyaURI("http://subject.com";));
+               builder.setObject(new RyaURI("http://object.com";));
+               final RyaStatement statement = builder.build();
+
+               final DB db = 
mongoClient.getDB(configuration.get(MongoDBRdfConfiguration.MONGO_DB_NAME));
+        final DBCollection coll = 
db.getCollection(configuration.getTriplesCollectionName());
+
+               dao.add(statement);
+
+        assertEquals(coll.count(),1);
+
+        dao.delete(statement, configuration);
+
+        assertEquals(coll.count(),0);
+
+       }
+
+       @Test
+       public void testDeleteWildcardSubjectWithContext() throws 
RyaDAOException, MongoException, IOException {
+               final RyaStatementBuilder builder = new RyaStatementBuilder();
+               builder.setPredicate(new RyaURI("http://temp.com";));
+               builder.setSubject(new RyaURI("http://subject.com";));
+               builder.setObject(new RyaURI("http://object.com";));
+               builder.setContext(new RyaURI("http://context.com";));
+               final RyaStatement statement = builder.build();
+
+               final DB db = 
mongoClient.getDB(configuration.get(MongoDBRdfConfiguration.MONGO_DB_NAME));
+        final DBCollection coll = 
db.getCollection(configuration.getTriplesCollectionName());
+
+               dao.add(statement);
+
+        assertEquals(coll.count(),1);
+
+               final RyaStatementBuilder builder2 = new RyaStatementBuilder();
+               builder2.setPredicate(new RyaURI("http://temp.com";));
+               builder2.setObject(new RyaURI("http://object.com";));
+               builder2.setContext(new RyaURI("http://context3.com";));
+               final RyaStatement query = builder2.build();
+
+        dao.delete(query, configuration);
+
+        assertEquals(coll.count(),1);
+
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/917e7a57/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullFreeTextIndexer.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullFreeTextIndexer.java 
b/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullFreeTextIndexer.java
index b9eb012..147050f 100644
--- a/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullFreeTextIndexer.java
+++ b/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullFreeTextIndexer.java
@@ -30,7 +30,7 @@ import mvm.rya.accumulo.experimental.AbstractAccumuloIndexer;
 import mvm.rya.api.RdfCloudTripleStoreConfiguration;
 import mvm.rya.api.domain.RyaStatement;
 import mvm.rya.indexing.FreeTextIndexer;
-import mvm.rya.indexing.StatementContraints;
+import mvm.rya.indexing.StatementConstraints;
 
 import org.apache.accumulo.core.client.Connector;
 import org.apache.hadoop.conf.Configuration;
@@ -59,7 +59,7 @@ public class NullFreeTextIndexer extends 
AbstractAccumuloIndexer implements Free
     }
 
     @Override
-    public CloseableIteration<Statement, QueryEvaluationException> 
queryText(String query, StatementContraints contraints)
+    public CloseableIteration<Statement, QueryEvaluationException> 
queryText(String query, StatementConstraints contraints)
             throws IOException {
         return null;
     }

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/917e7a57/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullGeoIndexer.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullGeoIndexer.java 
b/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullGeoIndexer.java
index e064c74..fe26f6f 100644
--- a/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullGeoIndexer.java
+++ b/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullGeoIndexer.java
@@ -30,7 +30,7 @@ import mvm.rya.accumulo.experimental.AbstractAccumuloIndexer;
 import mvm.rya.api.RdfCloudTripleStoreConfiguration;
 import mvm.rya.api.domain.RyaStatement;
 import mvm.rya.indexing.GeoIndexer;
-import mvm.rya.indexing.StatementContraints;
+import mvm.rya.indexing.StatementConstraints;
 
 import org.apache.accumulo.core.client.Connector;
 import org.apache.hadoop.conf.Configuration;
@@ -67,49 +67,49 @@ public class NullGeoIndexer extends AbstractAccumuloIndexer 
implements GeoIndexe
     }
 
     @Override
-    public CloseableIteration<Statement, QueryEvaluationException> 
queryEquals(Geometry query, StatementContraints contraints) {
+    public CloseableIteration<Statement, QueryEvaluationException> 
queryEquals(Geometry query, StatementConstraints contraints) {
 
         return null;
     }
 
     @Override
-    public CloseableIteration<Statement, QueryEvaluationException> 
queryDisjoint(Geometry query, StatementContraints contraints) {
+    public CloseableIteration<Statement, QueryEvaluationException> 
queryDisjoint(Geometry query, StatementConstraints contraints) {
 
         return null;
     }
 
     @Override
-    public CloseableIteration<Statement, QueryEvaluationException> 
queryIntersects(Geometry query, StatementContraints contraints) {
+    public CloseableIteration<Statement, QueryEvaluationException> 
queryIntersects(Geometry query, StatementConstraints contraints) {
 
         return null;
     }
 
     @Override
-    public CloseableIteration<Statement, QueryEvaluationException> 
queryTouches(Geometry query, StatementContraints contraints) {
+    public CloseableIteration<Statement, QueryEvaluationException> 
queryTouches(Geometry query, StatementConstraints contraints) {
 
         return null;
     }
 
     @Override
-    public CloseableIteration<Statement, QueryEvaluationException> 
queryCrosses(Geometry query, StatementContraints contraints) {
+    public CloseableIteration<Statement, QueryEvaluationException> 
queryCrosses(Geometry query, StatementConstraints contraints) {
 
         return null;
     }
 
     @Override
-    public CloseableIteration<Statement, QueryEvaluationException> 
queryWithin(Geometry query, StatementContraints contraints) {
+    public CloseableIteration<Statement, QueryEvaluationException> 
queryWithin(Geometry query, StatementConstraints contraints) {
 
         return null;
     }
 
     @Override
-    public CloseableIteration<Statement, QueryEvaluationException> 
queryContains(Geometry query, StatementContraints contraints) {
+    public CloseableIteration<Statement, QueryEvaluationException> 
queryContains(Geometry query, StatementConstraints contraints) {
 
         return null;
     }
 
     @Override
-    public CloseableIteration<Statement, QueryEvaluationException> 
queryOverlaps(Geometry query, StatementContraints contraints) {
+    public CloseableIteration<Statement, QueryEvaluationException> 
queryOverlaps(Geometry query, StatementConstraints contraints) {
 
         return null;
     }

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/917e7a57/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullTemporalIndexer.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullTemporalIndexer.java 
b/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullTemporalIndexer.java
index b332080..cbe36b8 100644
--- a/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullTemporalIndexer.java
+++ b/extras/indexing/src/main/java/mvm/rya/accumulo/mr/NullTemporalIndexer.java
@@ -30,7 +30,7 @@ import mvm.rya.accumulo.experimental.AbstractAccumuloIndexer;
 import mvm.rya.api.RdfCloudTripleStoreConfiguration;
 import mvm.rya.api.domain.RyaStatement;
 import mvm.rya.api.domain.RyaURI;
-import mvm.rya.indexing.StatementContraints;
+import mvm.rya.indexing.StatementConstraints;
 import mvm.rya.indexing.TemporalIndexer;
 import mvm.rya.indexing.TemporalInstant;
 import mvm.rya.indexing.TemporalInterval;
@@ -73,76 +73,76 @@ public class NullTemporalIndexer extends 
AbstractAccumuloIndexer implements Temp
 
     @Override
     public CloseableIteration<Statement, QueryEvaluationException> 
queryInstantEqualsInstant(TemporalInstant queryInstant,
-            StatementContraints contraints) throws QueryEvaluationException {
+            StatementConstraints contraints) throws QueryEvaluationException {
 
         return null;
     }
 
     @Override
     public CloseableIteration<Statement, QueryEvaluationException> 
queryInstantBeforeInstant(TemporalInstant queryInstant,
-            StatementContraints contraints) throws QueryEvaluationException {
+            StatementConstraints contraints) throws QueryEvaluationException {
 
         return null;
     }
 
     @Override
     public CloseableIteration<Statement, QueryEvaluationException> 
queryInstantAfterInstant(TemporalInstant queryInstant,
-            StatementContraints contraints) throws QueryEvaluationException {
+            StatementConstraints contraints) throws QueryEvaluationException {
 
         return null;
     }
 
     @Override
     public CloseableIteration<Statement, QueryEvaluationException> 
queryInstantBeforeInterval(TemporalInterval givenInterval,
-            StatementContraints contraints) throws QueryEvaluationException {
+            StatementConstraints contraints) throws QueryEvaluationException {
 
         return null;
     }
 
     @Override
     public CloseableIteration<Statement, QueryEvaluationException> 
queryInstantAfterInterval(TemporalInterval givenInterval,
-            StatementContraints contraints) throws QueryEvaluationException {
+            StatementConstraints contraints) throws QueryEvaluationException {
 
         return null;
     }
 
     @Override
     public CloseableIteration<Statement, QueryEvaluationException> 
queryInstantInsideInterval(TemporalInterval givenInterval,
-            StatementContraints contraints) throws QueryEvaluationException {
+            StatementConstraints contraints) throws QueryEvaluationException {
 
         return null;
     }
 
     @Override
     public CloseableIteration<Statement, QueryEvaluationException> 
queryInstantHasBeginningInterval(TemporalInterval queryInterval,
-            StatementContraints contraints) throws QueryEvaluationException {
+            StatementConstraints contraints) throws QueryEvaluationException {
 
         return null;
     }
 
     @Override
     public CloseableIteration<Statement, QueryEvaluationException> 
queryInstantHasEndInterval(TemporalInterval queryInterval,
-            StatementContraints contraints) throws QueryEvaluationException {
+            StatementConstraints contraints) throws QueryEvaluationException {
 
         return null;
     }
 
     @Override
     public CloseableIteration<Statement, QueryEvaluationException> 
queryIntervalEquals(TemporalInterval query,
-            StatementContraints contraints) throws QueryEvaluationException {
+            StatementConstraints contraints) throws QueryEvaluationException {
 
         return null;
     }
 
     @Override
     public CloseableIteration<Statement, QueryEvaluationException> 
queryIntervalBefore(TemporalInterval query,
-            StatementContraints contraints) throws QueryEvaluationException {
+            StatementConstraints contraints) throws QueryEvaluationException {
 
         return null;
     }
 
     @Override
-    public CloseableIteration<Statement, QueryEvaluationException> 
queryIntervalAfter(TemporalInterval query, StatementContraints contraints)
+    public CloseableIteration<Statement, QueryEvaluationException> 
queryIntervalAfter(TemporalInterval query, StatementConstraints contraints)
             throws QueryEvaluationException {
 
         return null;

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/917e7a57/extras/indexing/src/main/java/mvm/rya/accumulo/mr/RyaOutputFormat.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/main/java/mvm/rya/accumulo/mr/RyaOutputFormat.java 
b/extras/indexing/src/main/java/mvm/rya/accumulo/mr/RyaOutputFormat.java
index 8a0d599..7e690f4 100644
--- a/extras/indexing/src/main/java/mvm/rya/accumulo/mr/RyaOutputFormat.java
+++ b/extras/indexing/src/main/java/mvm/rya/accumulo/mr/RyaOutputFormat.java
@@ -35,9 +35,9 @@ import mvm.rya.api.persist.RyaDAOException;
 import mvm.rya.api.resolver.RdfToRyaConversions;
 import mvm.rya.indexing.FreeTextIndexer;
 import mvm.rya.indexing.GeoIndexer;
+import mvm.rya.indexing.StatementSerializer;
 import mvm.rya.indexing.TemporalIndexer;
 import mvm.rya.indexing.accumulo.ConfigUtils;
-import mvm.rya.indexing.accumulo.StatementSerializer;
 import mvm.rya.indexing.accumulo.freetext.AccumuloFreeTextIndexer;
 import mvm.rya.indexing.accumulo.geo.GeoMesaGeoIndexer;
 import mvm.rya.indexing.accumulo.temporal.AccumuloTemporalIndexer;

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/917e7a57/extras/indexing/src/main/java/mvm/rya/accumulo/mr/StatementWritable.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/main/java/mvm/rya/accumulo/mr/StatementWritable.java 
b/extras/indexing/src/main/java/mvm/rya/accumulo/mr/StatementWritable.java
index aefdf74..629baf2 100644
--- a/extras/indexing/src/main/java/mvm/rya/accumulo/mr/StatementWritable.java
+++ b/extras/indexing/src/main/java/mvm/rya/accumulo/mr/StatementWritable.java
@@ -25,14 +25,14 @@ import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
 
-import mvm.rya.indexing.accumulo.StatementSerializer;
-
 import org.apache.hadoop.io.Writable;
 import org.openrdf.model.Resource;
 import org.openrdf.model.Statement;
 import org.openrdf.model.URI;
 import org.openrdf.model.Value;
 
+import mvm.rya.indexing.StatementSerializer;
+
 /**
  * A {@link Writable} wrapper for {@link Statement} objects.
  */

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/917e7a57/extras/indexing/src/main/java/mvm/rya/indexing/FilterFunctionOptimizer.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/main/java/mvm/rya/indexing/FilterFunctionOptimizer.java 
b/extras/indexing/src/main/java/mvm/rya/indexing/FilterFunctionOptimizer.java
index 3425f3e..ad9fe22 100644
--- 
a/extras/indexing/src/main/java/mvm/rya/indexing/FilterFunctionOptimizer.java
+++ 
b/extras/indexing/src/main/java/mvm/rya/indexing/FilterFunctionOptimizer.java
@@ -8,9 +8,9 @@ package mvm.rya.indexing;
  * 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
@@ -21,22 +21,11 @@ package mvm.rya.indexing;
 
 
 import java.io.IOException;
+import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
-import mvm.rya.accumulo.AccumuloRdfConfiguration;
-import mvm.rya.indexing.IndexingFunctionRegistry.FUNCTION_TYPE;
-import mvm.rya.indexing.accumulo.ConfigUtils;
-import mvm.rya.indexing.accumulo.freetext.AccumuloFreeTextIndexer;
-import mvm.rya.indexing.accumulo.freetext.FreeTextTupleSet;
-import mvm.rya.indexing.accumulo.geo.GeoMesaGeoIndexer;
-import mvm.rya.indexing.accumulo.geo.GeoTupleSet;
-import mvm.rya.indexing.accumulo.temporal.AccumuloTemporalIndexer;
-import mvm.rya.indexing.accumulo.temporal.TemporalTupleSet;
-import mvm.rya.indexing.mongodb.MongoFreeTextIndexer;
-import mvm.rya.indexing.mongodb.MongoGeoIndexer;
-
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.TableExistsException;
@@ -44,6 +33,7 @@ import org.apache.accumulo.core.client.TableNotFoundException;
 import org.apache.commons.lang.Validate;
 import org.apache.hadoop.conf.Configurable;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.log4j.Logger;
 import org.geotools.feature.SchemaException;
 import org.openrdf.model.Resource;
 import org.openrdf.model.URI;
@@ -68,115 +58,140 @@ import 
org.openrdf.query.algebra.evaluation.QueryOptimizer;
 import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
 
 import com.google.common.collect.Lists;
+import com.mongodb.MongoClient;
+
+import mvm.rya.accumulo.AccumuloRdfConfiguration;
+import mvm.rya.indexing.IndexingFunctionRegistry.FUNCTION_TYPE;
+import mvm.rya.indexing.accumulo.ConfigUtils;
+import mvm.rya.indexing.accumulo.freetext.AccumuloFreeTextIndexer;
+import mvm.rya.indexing.accumulo.freetext.FreeTextTupleSet;
+import mvm.rya.indexing.accumulo.geo.GeoMesaGeoIndexer;
+import mvm.rya.indexing.accumulo.geo.GeoTupleSet;
+import mvm.rya.indexing.accumulo.temporal.AccumuloTemporalIndexer;
+import mvm.rya.indexing.mongodb.freetext.MongoFreeTextIndexer;
+import mvm.rya.indexing.mongodb.geo.MongoGeoIndexer;
+import mvm.rya.indexing.mongodb.temporal.MongoTemporalIndexer;
+import mvm.rya.mongodb.MongoConnectorFactory;
 
 public class FilterFunctionOptimizer implements QueryOptimizer, Configurable {
+    private static final Logger LOG = 
Logger.getLogger(FilterFunctionOptimizer.class);
+    private final ValueFactory valueFactory = new ValueFactoryImpl();
 
-    private ValueFactory valueFactory = new ValueFactoryImpl();
-    
     private Configuration conf;
     private GeoIndexer geoIndexer;
     private FreeTextIndexer freeTextIndexer;
     private TemporalIndexer temporalIndexer;
     private boolean init = false;
-    
-    
+
     public FilterFunctionOptimizer() {
     }
-    
-    
-    public FilterFunctionOptimizer(AccumuloRdfConfiguration conf) throws 
AccumuloException, AccumuloSecurityException, 
-    TableNotFoundException, IOException, SchemaException, TableExistsException 
{
+
+    public FilterFunctionOptimizer(final AccumuloRdfConfiguration conf) throws 
AccumuloException, AccumuloSecurityException,
+    TableNotFoundException, IOException, SchemaException, 
TableExistsException, NumberFormatException, UnknownHostException {
         this.conf = conf;
         init();
     }
-    
+
     //setConf initializes FilterFunctionOptimizer so reflection can be used
     //to create optimizer in RdfCloudTripleStoreConnection
     @Override
-    public void setConf(Configuration conf) {
+    public void setConf(final Configuration conf) {
         this.conf = conf;
-        init();
+        //reset the init.
+        init = false;
+        try {
+            init();
+        } catch (final NumberFormatException | UnknownHostException e) {
+            LOG.error("Unable to update to use new config, falling back to the 
old config.", e);
+            init = true;
+        }
     }
-    
-    
-    private void init() {
+
+    private synchronized void init() throws NumberFormatException, 
UnknownHostException {
         if (!init) {
             if (ConfigUtils.getUseMongo(conf)) {
-                this.geoIndexer = new MongoGeoIndexer();
-                geoIndexer.setConf(conf);
-                this.freeTextIndexer = new MongoFreeTextIndexer();
-                freeTextIndexer.setConf(conf);
+                try {
+                    final MongoClient mongoClient = 
MongoConnectorFactory.getMongoClient(conf);
+                    geoIndexer = new MongoGeoIndexer(mongoClient);
+                    geoIndexer.setConf(conf);
+                    freeTextIndexer = new MongoFreeTextIndexer(mongoClient);
+                    freeTextIndexer.setConf(conf);
+                    temporalIndexer = new MongoTemporalIndexer(mongoClient);
+                    temporalIndexer.setConf(conf);
+                } catch (NumberFormatException | UnknownHostException e) {
+                    LOG.error("Unable to connect to mongo.", e);
+                    throw e;
+                }
             } else {
-                this.geoIndexer = new GeoMesaGeoIndexer();
+                geoIndexer = new GeoMesaGeoIndexer();
                 geoIndexer.setConf(conf);
-                this.freeTextIndexer = new AccumuloFreeTextIndexer();
+                freeTextIndexer = new AccumuloFreeTextIndexer();
                 freeTextIndexer.setConf(conf);
-                this.temporalIndexer = new AccumuloTemporalIndexer();
+                temporalIndexer = new AccumuloTemporalIndexer();
                 temporalIndexer.setConf(conf);
             }
-            init = true; 
+            init = true;
         }
     }
-    
+
     @Override
-    public void optimize(TupleExpr tupleExpr, Dataset dataset, BindingSet 
bindings) {
+    public void optimize(final TupleExpr tupleExpr, final Dataset dataset, 
final BindingSet bindings) {
      // find variables used in property and resource based searches:
-        SearchVarVisitor searchVars = new SearchVarVisitor();
+        final SearchVarVisitor searchVars = new SearchVarVisitor();
         tupleExpr.visit(searchVars);
         // rewrites for property searches:
         processPropertySearches(tupleExpr, searchVars.searchProperties);
 
     }
-    
-    
-    
-    private void processPropertySearches(TupleExpr tupleExpr, Collection<Var> 
searchProperties) {
-        MatchStatementVisitor matchStatements = new 
MatchStatementVisitor(searchProperties);
+
+
+
+    private void processPropertySearches(final TupleExpr tupleExpr, final 
Collection<Var> searchProperties) {
+        final MatchStatementVisitor matchStatements = new 
MatchStatementVisitor(searchProperties);
         tupleExpr.visit(matchStatements);
-        for (StatementPattern matchStatement: matchStatements.matchStatements) 
{
-            Var subject = matchStatement.getSubjectVar();
-            if (subject.hasValue() && !(subject.getValue() instanceof 
Resource))
+        for (final StatementPattern matchStatement: 
matchStatements.matchStatements) {
+            final Var subject = matchStatement.getSubjectVar();
+            if (subject.hasValue() && !(subject.getValue() instanceof 
Resource)) {
                 throw new IllegalArgumentException("Query error: Found " + 
subject.getValue() + ", expected an URI or BNode");
+            }
             Validate.isTrue(subject.hasValue() || subject.getName() != null);
             Validate.isTrue(!matchStatement.getObjectVar().hasValue() && 
matchStatement.getObjectVar().getName() != null);
             buildQuery(tupleExpr, matchStatement);
         }
-        
     }
-    
-    
-    private void buildQuery(TupleExpr tupleExpr, StatementPattern 
matchStatement) {
+
+    private void buildQuery(final TupleExpr tupleExpr, final StatementPattern 
matchStatement) {
         //If our IndexerExpr (to be) is the rhs-child of LeftJoin, we can 
safely make that a Join:
         //  the IndexerExpr will (currently) not return results that can 
deliver unbound variables.
         //This optimization should probably be generalized into a LeftJoin -> 
Join optimizer under certain conditions. Until that
         //  has been done, this code path at least takes care of queries 
generated by OpenSahara SparqTool that filter on OPTIONAL
         //  projections. E.g. summary~'full text search' (summary is 
optional). See #379
         if (matchStatement.getParentNode() instanceof LeftJoin) {
-            LeftJoin leftJoin = (LeftJoin)matchStatement.getParentNode();
-            if (leftJoin.getRightArg() == matchStatement && 
leftJoin.getCondition() == null)
+            final LeftJoin leftJoin = (LeftJoin)matchStatement.getParentNode();
+            if (leftJoin.getRightArg() == matchStatement && 
leftJoin.getCondition() == null) {
                 matchStatement.getParentNode().replaceWith(new 
Join(leftJoin.getLeftArg(), leftJoin.getRightArg()));
+            }
         }
-        FilterFunction fVisitor = new 
FilterFunction(matchStatement.getObjectVar().getName());
+        final FilterFunction fVisitor = new 
FilterFunction(matchStatement.getObjectVar().getName());
         tupleExpr.visit(fVisitor);
-        List<IndexingExpr> results = Lists.newArrayList();
+        final List<IndexingExpr> results = Lists.newArrayList();
         for(int i = 0; i < fVisitor.func.size(); i++){
-            results.add(new IndexingExpr(fVisitor.func.get(i), matchStatement, 
fVisitor.args.get(i)));  
+            results.add(new IndexingExpr(fVisitor.func.get(i), matchStatement, 
fVisitor.args.get(i)));
         }
         removeMatchedPattern(tupleExpr, matchStatement, new 
IndexerExprReplacer(results));
-        
     }
-    
+
     //find vars contained in filters
     private static class SearchVarVisitor extends 
QueryModelVisitorBase<RuntimeException> {
-        
-        private final Collection<Var> searchProperties = new ArrayList<Var>(); 
+        private final Collection<Var> searchProperties = new ArrayList<Var>();
 
         @Override
-        public void meet(FunctionCall fn) {
-            URI fun = new URIImpl(fn.getURI());
-            Var result = 
IndexingFunctionRegistry.getResultVarFromFunctionCall(fun, fn.getArgs());
-            if (result != null && !searchProperties.contains(result))
+        public void meet(final FunctionCall fn) {
+            final URI fun = new URIImpl(fn.getURI());
+            final Var result = 
IndexingFunctionRegistry.getResultVarFromFunctionCall(fun, fn.getArgs());
+            if (result != null && !searchProperties.contains(result)) {
                 searchProperties.add(result);
+            }
         }
     }
 
@@ -186,19 +201,20 @@ public class FilterFunctionOptimizer implements 
QueryOptimizer, Configurable {
         private final Collection<Var> usedVars = new ArrayList<Var>();
         private final List<StatementPattern> matchStatements = new 
ArrayList<StatementPattern>();
 
-        public MatchStatementVisitor(Collection<Var> propertyVars) {
+        public MatchStatementVisitor(final Collection<Var> propertyVars) {
             this.propertyVars = propertyVars;
         }
 
-        @Override public void meet(StatementPattern statement) {
-            Var object = statement.getObjectVar();
-            if (propertyVars.contains(object))
-                if (usedVars.contains(object))
+        @Override public void meet(final StatementPattern statement) {
+            final Var object = statement.getObjectVar();
+            if (propertyVars.contains(object)) {
+                if (usedVars.contains(object)) {
                     throw new IllegalArgumentException("Illegal search, 
variable is used multiple times as object: " + object.getName());
-                else {
+                } else {
                     usedVars.add(object);
                     matchStatements.add(statement);
                 }
+            }
         }
     }
 
@@ -207,11 +223,11 @@ public class FilterFunctionOptimizer implements 
QueryOptimizer, Configurable {
         List<URI> func = Lists.newArrayList();
         List<Value[]> args = Lists.newArrayList();
 
-        public AbstractEnhanceVisitor(String matchVar) {
+        public AbstractEnhanceVisitor(final String matchVar) {
             this.matchVar = matchVar;
         }
 
-        protected void addFilter(URI uri, Value[] values) {
+        protected void addFilter(final URI uri, final Value[] values) {
             func.add(uri);
             args.add(values);
         }
@@ -220,57 +236,59 @@ public class FilterFunctionOptimizer implements 
QueryOptimizer, Configurable {
     //create indexing expression for each filter matching var in filter 
StatementPattern
     //replace old filter condition with true condition
     private class FilterFunction extends AbstractEnhanceVisitor {
-        public FilterFunction(String matchVar) {
+        public FilterFunction(final String matchVar) {
             super(matchVar);
         }
 
         @Override
-        public void meet(FunctionCall call) {
-            URI fnUri = valueFactory.createURI(call.getURI());
-            Var resultVar = 
IndexingFunctionRegistry.getResultVarFromFunctionCall(fnUri, call.getArgs());
+        public void meet(final FunctionCall call) {
+            final URI fnUri = valueFactory.createURI(call.getURI());
+            final Var resultVar = 
IndexingFunctionRegistry.getResultVarFromFunctionCall(fnUri, call.getArgs());
             if (resultVar != null && resultVar.getName().equals(matchVar)) {
                 addFilter(valueFactory.createURI(call.getURI()), 
extractArguments(matchVar, call));
-                if (call.getParentNode() instanceof Filter || 
call.getParentNode() instanceof And || call.getParentNode() instanceof LeftJoin)
+                if (call.getParentNode() instanceof Filter || 
call.getParentNode() instanceof And || call.getParentNode() instanceof 
LeftJoin) {
                     call.replaceWith(new 
ValueConstant(valueFactory.createLiteral(true)));
-                else
+                } else {
                     throw new IllegalArgumentException("Query error: Found " + 
call + " as part of an expression that is too complex");
+                }
             }
         }
 
-
-        private Value[] extractArguments(String matchName, FunctionCall call) {
-            Value args[] = new Value[call.getArgs().size() - 1];
+        private Value[] extractArguments(final String matchName, final 
FunctionCall call) {
+            final Value args[] = new Value[call.getArgs().size() - 1];
             int argI = 0;
             for (int i = 0; i != call.getArgs().size(); ++i) {
-                ValueExpr arg = call.getArgs().get(i);
-                if (argI == i && arg instanceof Var && 
matchName.equals(((Var)arg).getName()))
+                final ValueExpr arg = call.getArgs().get(i);
+                if (argI == i && arg instanceof Var && 
matchName.equals(((Var)arg).getName())) {
                     continue;
-                if (arg instanceof ValueConstant)
+                }
+                if (arg instanceof ValueConstant) {
                     args[argI] = ((ValueConstant)arg).getValue();
-                else if (arg instanceof Var && ((Var)arg).hasValue())
+                } else if (arg instanceof Var && ((Var)arg).hasValue()) {
                     args[argI] = ((Var)arg).getValue();
-                else
+                } else {
                     throw new IllegalArgumentException("Query error: Found " + 
arg + ", expected a Literal, BNode or URI");
+                }
                 ++argI;
             }
             return args;
         }
 
         @Override
-        public void meet(Filter filter) {
+        public void meet(final Filter filter) {
             //First visit children, then condition (reverse of default):
             filter.getArg().visit(this);
             filter.getCondition().visit(this);
         }
     }
 
-    private void removeMatchedPattern(TupleExpr tupleExpr, StatementPattern 
pattern, TupleExprReplacer replacer) {
-        List<TupleExpr> indexTuples = replacer.createReplacement(pattern);
+    private void removeMatchedPattern(final TupleExpr tupleExpr, final 
StatementPattern pattern, final TupleExprReplacer replacer) {
+        final List<TupleExpr> indexTuples = 
replacer.createReplacement(pattern);
         if (indexTuples.size() > 1) {
-            VarExchangeVisitor vev = new VarExchangeVisitor(pattern);
+            final VarExchangeVisitor vev = new VarExchangeVisitor(pattern);
             tupleExpr.visit(vev);
             Join join = new Join(indexTuples.remove(0), indexTuples.remove(0));
-            for (TupleExpr geo : indexTuples) {
+            for (final TupleExpr geo : indexTuples) {
                 join = new Join(join, geo);
             }
             pattern.replaceWith(join);
@@ -286,57 +304,52 @@ public class FilterFunctionOptimizer implements 
QueryOptimizer, Configurable {
         List<TupleExpr> createReplacement(TupleExpr org);
     }
 
-    
     //replace each filter pertinent StatementPattern with corresponding index 
expr
     private class IndexerExprReplacer implements TupleExprReplacer {
         private final List<IndexingExpr> indxExpr;
-        private FUNCTION_TYPE type;
+        private final FUNCTION_TYPE type;
 
-        public IndexerExprReplacer(List<IndexingExpr> indxExpr) {
+        public IndexerExprReplacer(final List<IndexingExpr> indxExpr) {
             this.indxExpr = indxExpr;
-            URI func = indxExpr.get(0).getFunction();
-            this.type = IndexingFunctionRegistry.getFunctionType(func);
+            final URI func = indxExpr.get(0).getFunction();
+            type = IndexingFunctionRegistry.getFunctionType(func);
         }
 
         @Override
-        public List<TupleExpr> createReplacement(TupleExpr org) {
-            List<TupleExpr> indexTuples = Lists.newArrayList();
+        public List<TupleExpr> createReplacement(final TupleExpr org) {
+            final List<TupleExpr> indexTuples = Lists.newArrayList();
             switch (type) {
             case GEO:
-                for (IndexingExpr indx : indxExpr) {
+                for (final IndexingExpr indx : indxExpr) {
                     indexTuples.add(new GeoTupleSet(indx, geoIndexer));
                 }
                 break;
             case FREETEXT:
-                for (IndexingExpr indx : indxExpr) {
+                for (final IndexingExpr indx : indxExpr) {
                     indexTuples.add(new FreeTextTupleSet(indx, 
freeTextIndexer));
                 }
                 break;
             case TEMPORAL:
-                for (IndexingExpr indx : indxExpr) {
+                for (final IndexingExpr indx : indxExpr) {
                     indexTuples.add(new TemporalTupleSet(indx, 
temporalIndexer));
                 }
                 break;
             default:
                 throw new IllegalArgumentException("Incorrect type!");
-
             }
             return indexTuples;
         }
     }
-    
-    
-    private static class VarExchangeVisitor extends 
QueryModelVisitorBase<RuntimeException> {
 
+    private static class VarExchangeVisitor extends 
QueryModelVisitorBase<RuntimeException> {
         private final  StatementPattern exchangeVar;
-              
-        public VarExchangeVisitor(StatementPattern sp) {
-            this.exchangeVar = sp;
+        public VarExchangeVisitor(final StatementPattern sp) {
+            exchangeVar = sp;
         }
 
         @Override
-        public void meet(Join node) {
-            QueryModelNode lNode = node.getLeftArg();
+        public void meet(final Join node) {
+            final QueryModelNode lNode = node.getLeftArg();
             if (lNode instanceof StatementPattern) {
                 exchangeVar.replaceWith(lNode);
                 node.setLeftArg(exchangeVar);
@@ -345,17 +358,9 @@ public class FilterFunctionOptimizer implements 
QueryOptimizer, Configurable {
             }
         }
     }
-    
-    
-   
-
-
 
     @Override
     public Configuration getConf() {
         return conf;
     }
-    
-    
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/917e7a57/extras/indexing/src/main/java/mvm/rya/indexing/FreeTextIndexer.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/main/java/mvm/rya/indexing/FreeTextIndexer.java 
b/extras/indexing/src/main/java/mvm/rya/indexing/FreeTextIndexer.java
index 2d8bae9..f6fb2c7 100644
--- a/extras/indexing/src/main/java/mvm/rya/indexing/FreeTextIndexer.java
+++ b/extras/indexing/src/main/java/mvm/rya/indexing/FreeTextIndexer.java
@@ -1,5 +1,10 @@
 package mvm.rya.indexing;
 
+import java.io.IOException;
+
+import org.openrdf.model.Statement;
+import org.openrdf.query.QueryEvaluationException;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -8,9 +13,9 @@ package mvm.rya.indexing;
  * 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
@@ -22,16 +27,8 @@ package mvm.rya.indexing;
 
 
 import info.aduna.iteration.CloseableIteration;
-
-import java.io.IOException;
-import java.util.Set;
-
 import mvm.rya.api.persist.index.RyaSecondaryIndexer;
 
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.query.QueryEvaluationException;
-
 /**
  * A repository to store, index, and retrieve {@link Statement}s based on 
freetext features.
  */
@@ -39,7 +36,7 @@ public interface FreeTextIndexer extends RyaSecondaryIndexer {
 
        /**
         * Query the Free Text Index with specific constraints. A 
<code>null</code> or empty parameters imply no constraint.
-        * 
+        *
         * @param query
         *            the query to perform
         * @param contraints
@@ -47,16 +44,5 @@ public interface FreeTextIndexer extends RyaSecondaryIndexer 
{
         * @return the set of statements that meet the query and other 
constraints.
         * @throws IOException
         */
-       public abstract CloseableIteration<Statement, QueryEvaluationException> 
queryText(String query, StatementContraints contraints) throws IOException;
-
-       /**
-        * @return the set of predicates indexed by the indexer.
-        */
-       public abstract Set<URI> getIndexablePredicates();
-
-       @Override
-       public abstract void flush() throws IOException;
-
-       @Override
-       public abstract void close() throws IOException;
+       public abstract CloseableIteration<Statement, QueryEvaluationException> 
queryText(String query, StatementConstraints contraints) throws IOException;
 }

Reply via email to