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; }
