Return-Path: X-Original-To: apmail-rya-dev-archive@minotaur.apache.org Delivered-To: apmail-rya-dev-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id ADF8918EE9 for ; Mon, 7 Dec 2015 12:05:10 +0000 (UTC) Received: (qmail 11074 invoked by uid 500); 7 Dec 2015 12:05:01 -0000 Delivered-To: apmail-rya-dev-archive@rya.apache.org Received: (qmail 11024 invoked by uid 500); 7 Dec 2015 12:05:01 -0000 Mailing-List: contact dev-help@rya.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@rya.incubator.apache.org Delivered-To: mailing list dev@rya.incubator.apache.org Received: (qmail 11002 invoked by uid 99); 7 Dec 2015 12:05:01 -0000 Received: from Unknown (HELO spamd4-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 07 Dec 2015 12:05:01 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd4-us-west.apache.org (ASF Mail Server at spamd4-us-west.apache.org) with ESMTP id 75684C0481 for ; Mon, 7 Dec 2015 12:05:00 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd4-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.227 X-Spam-Level: * X-Spam-Status: No, score=1.227 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-0.554, URIBL_BLOCKED=0.001] autolearn=disabled Received: from mx1-us-east.apache.org ([10.40.0.8]) by localhost (spamd4-us-west.apache.org [10.40.0.11]) (amavisd-new, port 10024) with ESMTP id dVquRqaRTKZr for ; Mon, 7 Dec 2015 12:04:44 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-us-east.apache.org (ASF Mail Server at mx1-us-east.apache.org) with SMTP id 104AE4452F for ; Mon, 7 Dec 2015 12:04:32 +0000 (UTC) Received: (qmail 9212 invoked by uid 99); 7 Dec 2015 12:04:32 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 07 Dec 2015 12:04:32 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id EB4C4E0513; Mon, 7 Dec 2015 12:04:31 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: mihalik@apache.org To: dev@rya.incubator.apache.org Date: Mon, 07 Dec 2015 12:05:10 -0000 Message-Id: <23d5c4015d23400cbb547eeb40995803@git.apache.org> In-Reply-To: <2a784369c62044fb831722b10b522d49@git.apache.org> References: <2a784369c62044fb831722b10b522d49@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [40/51] [partial] incubator-rya git commit: Cannot delete temp branch, doc'd it. http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5a03ef61/extras/indexing/src/main/java/mvm/rya/accumulo/mr/fileinput/RyaBatchWriterInputTool.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/accumulo/mr/fileinput/RyaBatchWriterInputTool.java b/extras/indexing/src/main/java/mvm/rya/accumulo/mr/fileinput/RyaBatchWriterInputTool.java deleted file mode 100644 index fb80804..0000000 --- a/extras/indexing/src/main/java/mvm/rya/accumulo/mr/fileinput/RyaBatchWriterInputTool.java +++ /dev/null @@ -1,243 +0,0 @@ -package mvm.rya.accumulo.mr.fileinput; - -/* - * 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 com.google.common.base.Preconditions.checkNotNull; - -import java.io.IOException; -import java.io.StringReader; - -import mvm.rya.accumulo.mr.RyaOutputFormat; -import mvm.rya.accumulo.mr.StatementWritable; -import mvm.rya.accumulo.mr.utils.MRUtils; -import mvm.rya.indexing.accumulo.ConfigUtils; - -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.conf.Configured; -import org.apache.hadoop.fs.Path; -import org.apache.hadoop.io.LongWritable; -import org.apache.hadoop.io.NullWritable; -import org.apache.hadoop.io.Text; -import org.apache.hadoop.io.Writable; -import org.apache.hadoop.mapreduce.Job; -import org.apache.hadoop.mapreduce.Mapper; -import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; -import org.apache.hadoop.util.Tool; -import org.apache.hadoop.util.ToolRunner; -import org.apache.log4j.Logger; -import org.openrdf.model.Resource; -import org.openrdf.model.Statement; -import org.openrdf.model.URI; -import org.openrdf.model.Value; -import org.openrdf.model.ValueFactory; -import org.openrdf.model.impl.ValueFactoryImpl; -import org.openrdf.rio.ParserConfig; -import org.openrdf.rio.RDFFormat; -import org.openrdf.rio.RDFHandlerException; -import org.openrdf.rio.RDFParseException; -import org.openrdf.rio.RDFParser; -import org.openrdf.rio.Rio; -import org.openrdf.rio.helpers.RDFHandlerBase; - -import com.google.common.base.Preconditions; - -/** - * Take large ntrips files and use MapReduce to ingest into other indexing - */ -public class RyaBatchWriterInputTool extends Configured implements Tool { - private static final Logger logger = Logger.getLogger(RyaBatchWriterInputTool.class); - - @Override - public int run(final String[] args) throws Exception { - String userName = null; - String pwd = null; - String instance = null; - String zk = null; - String format = null; - - final Configuration conf = getConf(); - // conf - zk = conf.get(MRUtils.AC_ZK_PROP, zk); - instance = conf.get(MRUtils.AC_INSTANCE_PROP, instance); - userName = conf.get(MRUtils.AC_USERNAME_PROP, userName); - pwd = conf.get(MRUtils.AC_PWD_PROP, pwd); - format = conf.get(MRUtils.FORMAT_PROP, RDFFormat.NTRIPLES.getName()); - - String auths = conf.get(MRUtils.AC_CV_PROP, ""); - - conf.set(MRUtils.FORMAT_PROP, format); - Preconditions.checkNotNull(zk, MRUtils.AC_ZK_PROP + " not set"); - Preconditions.checkNotNull(instance, MRUtils.AC_INSTANCE_PROP + " not set"); - Preconditions.checkNotNull(userName, MRUtils.AC_USERNAME_PROP + " not set"); - Preconditions.checkNotNull(pwd, MRUtils.AC_PWD_PROP + " not set"); - - // map the config values to free text configure values - conf.set(ConfigUtils.CLOUDBASE_ZOOKEEPERS, zk); - conf.set(ConfigUtils.CLOUDBASE_INSTANCE, instance); - conf.set(ConfigUtils.CLOUDBASE_USER, userName); - conf.set(ConfigUtils.CLOUDBASE_PASSWORD, pwd); - conf.set(ConfigUtils.CLOUDBASE_AUTHS, auths); - - final String inputDir = args[0]; - - String tablePrefix = conf.get(MRUtils.TABLE_PREFIX_PROPERTY, null); - Preconditions.checkNotNull(tablePrefix, MRUtils.TABLE_PREFIX_PROPERTY + " not set"); - - String docTextTable = tablePrefix + "text"; - conf.set(ConfigUtils.FREE_TEXT_DOC_TABLENAME, docTextTable); - - String docTermTable = tablePrefix + "terms"; - conf.set(ConfigUtils.FREE_TEXT_TERM_TABLENAME, docTermTable); - - String geoTable = tablePrefix + "geo"; - conf.set(ConfigUtils.GEO_TABLENAME, geoTable); - - logger.info("Loading data into tables[rya, freetext, geo]"); - logger.info("Loading data into tables[" + docTermTable + " " + docTextTable + " " + geoTable + "]"); - - Job job = new Job(new Configuration(conf), "Batch Writer load data into Rya Core and Indexing Tables"); - job.setJarByClass(this.getClass()); - - // setting long job - Configuration jobConf = job.getConfiguration(); - jobConf.setBoolean("mapred.map.tasks.speculative.execution", false); - - jobConf.setInt("mapred.task.timeout", 1000 * 60 * 60 * 24); // timeout after 1 day - - job.setInputFormatClass(TextInputFormat.class); - - job.setMapperClass(ParseNtripsMapper.class); - - job.setNumReduceTasks(0); - - // Use Rya Output Format - job.setOutputFormatClass(RyaOutputFormat.class); - job.setOutputKeyClass(NullWritable.class); - job.setOutputValueClass(StatementWritable.class); - job.setMapOutputKeyClass(NullWritable.class); - job.setMapOutputValueClass(StatementWritable.class); - - TextInputFormat.setInputPaths(job, new Path(inputDir)); - - job.waitForCompletion(true); - - return 0; - } - - public static void main(String[] args) throws Exception { - ToolRunner.run(new Configuration(), new RyaBatchWriterInputTool(), args); - } - - public static class ParseNtripsMapper extends Mapper { - private static final Logger logger = Logger.getLogger(ParseNtripsMapper.class); - - private RDFParser parser; - private RDFFormat rdfFormat; - - @Override - protected void setup(final Context context) throws IOException, InterruptedException { - super.setup(context); - Configuration conf = context.getConfiguration(); - - final ValueFactory vf = new ValueFactoryImpl(); - - String rdfFormatName = conf.get(MRUtils.FORMAT_PROP); - checkNotNull(rdfFormatName, "Rdf format cannot be null"); - rdfFormat = RDFFormat.valueOf(rdfFormatName); - - String namedGraphString = conf.get(MRUtils.NAMED_GRAPH_PROP); - checkNotNull(namedGraphString, MRUtils.NAMED_GRAPH_PROP + " cannot be null"); - - final Resource namedGraph = vf.createURI(namedGraphString); - - parser = Rio.createParser(rdfFormat); - parser.setParserConfig(new ParserConfig(true, true, true, RDFParser.DatatypeHandling.VERIFY)); - parser.setRDFHandler(new RDFHandlerBase() { - @Override - public void handleStatement(Statement statement) throws RDFHandlerException { - Statement output; - if (rdfFormat.equals(RDFFormat.NTRIPLES)) { - output = new ConextStatementWrapper(statement, namedGraph); - } else { - output = statement; - } - try { - context.write(NullWritable.get(), new StatementWritable(output)); - } catch (IOException e) { - logger.error("Error writing statement", e); - throw new RDFHandlerException(e); - } catch (InterruptedException e) { - logger.error("Error writing statement", e); - throw new RDFHandlerException(e); - } - } - - }); - } - - @Override - public void map(LongWritable key, Text value, Context output) throws IOException, InterruptedException { - String rdf = value.toString(); - try { - parser.parse(new StringReader(rdf), ""); - } catch (RDFParseException e) { - logger.error("Line[" + rdf + "] cannot be formatted with format[" + rdfFormat + "]. Exception[" + e.getMessage() - + "]", e); - } catch (Exception e) { - logger.error("error during map", e); - throw new IOException("Exception occurred parsing triple[" + rdf + "]", e); - } - } - } - - @SuppressWarnings("serial") - private static class ConextStatementWrapper implements Statement { - private Statement statementWithoutConext; - private Resource context; - - public ConextStatementWrapper(Statement statementWithoutConext, Resource context) { - this.statementWithoutConext = statementWithoutConext; - this.context = context; - } - - @Override - public Resource getSubject() { - return statementWithoutConext.getSubject(); - } - - @Override - public URI getPredicate() { - return statementWithoutConext.getPredicate(); - } - - @Override - public Value getObject() { - return statementWithoutConext.getObject(); - } - - @Override - public Resource getContext() { - return context; - } - } - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5a03ef61/extras/indexing/src/main/java/mvm/rya/accumulo/precompQuery/AccumuloPrecompQueryIndexer.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/accumulo/precompQuery/AccumuloPrecompQueryIndexer.java b/extras/indexing/src/main/java/mvm/rya/accumulo/precompQuery/AccumuloPrecompQueryIndexer.java deleted file mode 100644 index 86cb73e..0000000 --- a/extras/indexing/src/main/java/mvm/rya/accumulo/precompQuery/AccumuloPrecompQueryIndexer.java +++ /dev/null @@ -1,326 +0,0 @@ -package mvm.rya.accumulo.precompQuery; - -/* - * 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 info.aduna.iteration.CloseableIteration; - -import java.io.IOException; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Map.Entry; -import java.util.Set; - -import org.apache.accumulo.core.client.BatchScanner; -import org.apache.accumulo.core.client.Connector; -import org.apache.accumulo.core.client.TableNotFoundException; -import org.apache.accumulo.core.data.Key; -import org.apache.accumulo.core.data.Range; -import org.apache.accumulo.core.data.Value; -import org.apache.accumulo.core.security.Authorizations; -import org.apache.hadoop.io.Text; -import org.openrdf.query.Binding; -import org.openrdf.query.BindingSet; -import org.openrdf.query.QueryEvaluationException; -import org.openrdf.query.algebra.evaluation.QueryBindingSet; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; - -import mvm.rya.indexing.PrecompQueryIndexer; -import mvm.rya.indexing.external.tupleSet.AccumuloIndexSet.AccValueFactory; - -public class AccumuloPrecompQueryIndexer implements PrecompQueryIndexer { - - - private Connector accCon; - private String tableName; - private Map bindings; - - - - public AccumuloPrecompQueryIndexer(Connector accCon, String tableName) { - this.accCon = accCon; - this.tableName = tableName; - } - - - @Override - public void storeBindingSet(BindingSet bs) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void storeBindingSets(Collection bindingSets) throws IOException, IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public CloseableIteration queryPrecompJoin(List varOrder, - String localityGroup, Map bindings, Map valMap, Collection bsConstraints) - throws QueryEvaluationException, TableNotFoundException { - - - final int prefixLength = Integer.parseInt(varOrder.remove(varOrder.size()-1)); - final Iterator> accIter; - final HashMultimap map = HashMultimap.create(); - final List extProdList = Lists.newArrayList(); - final Map bindingMap = bindings; - final List order = varOrder; - final BatchScanner bs = accCon.createBatchScanner(tableName, new Authorizations(), 10); - final Set ranges = Sets.newHashSet(); - - - - bs.fetchColumnFamily(new Text(localityGroup)); - - //process bindingSet and constant constraints - for (BindingSet bSet : bsConstraints) { - StringBuffer rangePrefix = new StringBuffer(); - int i = 0; - - for (String b : order) { - - if (i >= prefixLength) { - break; - } - - if (b.startsWith("-const-")) { - String val = bindings.get(b).create(valMap.get(b)); - rangePrefix.append(val); - rangePrefix.append("\u0000"); - } else { - - Binding v = bSet.getBinding(b); - if (v == null) { - throw new IllegalStateException("Binding set can't have null value!"); - } - String val = bindings.get(b).create(bSet.getValue(b)); - rangePrefix.append(val); - rangePrefix.append("\u0000"); - - } - - i++; - - } - if (rangePrefix.length() > 0) { - String prefixWithOutNull = rangePrefix.deleteCharAt(rangePrefix.length() - 1).toString(); - String prefixWithNull = prefixWithOutNull + "\u0001"; - Range r = new Range(new Key(prefixWithOutNull), true, new Key(prefixWithNull), false); - map.put(r, bSet); - ranges.add(r); - } else if (bSet.size() > 0) { - extProdList.add(bSet); - } - } - - //constant constraints and no bindingSet constraints - //add range of entire table if no constant constraints and - //bsConstraints consists of single, empty set (occurs when AIS is - //first node evaluated in query) - if (ranges.isEmpty() && bsConstraints.size() > 0) { - - if (prefixLength > 0) { - StringBuffer rangePrefix = new StringBuffer(); - - int i = 0; - for (String b : order) { - if (i >= prefixLength) { - break; - } - if (b.startsWith("-const-")) { - String val = bindings.get(b).create(valMap.get(b)); - rangePrefix.append(val); - rangePrefix.append("\u0000"); - } - i++; - } - - String prefixWithOutNull = rangePrefix.deleteCharAt(rangePrefix.length() - 1).toString(); - String prefixWithNull = prefixWithOutNull + "\u0001"; - Range r = new Range(new Key(prefixWithOutNull), true, new Key(prefixWithNull), false); - ranges.add(r); - - } else { // no constant or bindingSet constraints - ranges.add(new Range("", true, "~", false)); - } - } - - if (ranges.size() == 0) { - accIter = null; - } else { - bs.setRanges(ranges); - accIter = bs.iterator(); - } - - - return new CloseableIteration() { - - @Override - public void remove() throws QueryEvaluationException { - throw new UnsupportedOperationException(); - } - - private Iterator inputSet = null; - private QueryBindingSet currentSolutionBs = null; - private boolean hasNextCalled = false; - private boolean isEmpty = false; - - - - @Override - public BindingSet next() throws QueryEvaluationException { - QueryBindingSet bs = new QueryBindingSet(); - - if (hasNextCalled) { - hasNextCalled = false; - if (inputSet != null) { - bs.addAll(inputSet.next()); - } - bs.addAll(currentSolutionBs); - } else if (isEmpty) { - throw new NoSuchElementException(); - } else { - if (this.hasNext()) { - hasNextCalled = false; - if (inputSet != null) { - bs.addAll(inputSet.next()); - } - bs.addAll(currentSolutionBs); - } else { - throw new NoSuchElementException(); - } - } - - return bs; - } - - @Override - public boolean hasNext() throws QueryEvaluationException { - - if(accIter == null ) { - isEmpty = true; - return false; - } - - if (!hasNextCalled && !isEmpty) { - while (accIter.hasNext() || (inputSet != null && inputSet.hasNext())) { - - if(inputSet != null && inputSet.hasNext()) { - hasNextCalled = true; - return true; - } - - - Key k = accIter.next().getKey(); - final String[] s = k.getRow().toString().split("\u0000"); - - StringBuilder rangePrefix = new StringBuilder(); - // TODO Assuming that order specifies order of variables - // commmon to - // bindingSet passed in and variables in index table - // --size is equal to - - for (int i = 0; i < prefixLength; i++) { - rangePrefix.append(s[i]); - rangePrefix.append("\u0000"); - } - - // TODO I need to remember what the type was! - currentSolutionBs = new QueryBindingSet(); - int i = 0; - for (String b : order) { - if (b.startsWith("-const")) { - i++; - } else { - final String v = s[i]; - currentSolutionBs.addBinding(b, bindingMap.get(b).create(v)); - i++; - } - - } - //check to see if bindingSet constraints exist - if (map.size() > 0) { - String prefixWithOutNull = rangePrefix.deleteCharAt(rangePrefix.length() - 1).toString(); - String prefixWithNull = prefixWithOutNull + "\u0001"; - Range r = new Range(new Key(prefixWithOutNull), true, new Key(prefixWithNull), false); - inputSet = map.get(r).iterator(); - if (!inputSet.hasNext()) { - continue; - } else { - hasNextCalled = true; - return true; - } // check to see if binding set constraints exist, but no common vars - } else if (extProdList.size() > 0) { - inputSet = extProdList.iterator(); - hasNextCalled = true; - return true; - }else { //no bindingsSet constraints--only constant constraints or none - hasNextCalled = true; - return true; - } - } - - isEmpty = true; - return false; - - } else if (isEmpty) { - return false; - } else { - return true; - } - - } - - @Override - public void close() throws QueryEvaluationException { - bs.close(); - } - - }; - } - - - - @Override - public void flush() throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void close() throws IOException { - // TODO Auto-generated method stub - - } - - - - - - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5a03ef61/extras/indexing/src/main/java/mvm/rya/indexing/DocIdIndexer.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/DocIdIndexer.java b/extras/indexing/src/main/java/mvm/rya/indexing/DocIdIndexer.java deleted file mode 100644 index 21d5de7..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/DocIdIndexer.java +++ /dev/null @@ -1,47 +0,0 @@ -package mvm.rya.indexing; - -/* - * 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 info.aduna.iteration.CloseableIteration; - -import java.io.Closeable; -import java.io.IOException; -import java.util.Collection; - -import mvm.rya.indexing.accumulo.entity.StarQuery; - -import org.apache.accumulo.core.client.TableNotFoundException; -import org.openrdf.query.BindingSet; -import org.openrdf.query.QueryEvaluationException; - -public interface DocIdIndexer extends Closeable { - - - - public abstract CloseableIteration queryDocIndex(StarQuery query, - Collection constraints) throws TableNotFoundException, QueryEvaluationException; - - - - @Override - public abstract void close() throws IOException; - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5a03ef61/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 deleted file mode 100644 index 5d2678b..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/FilterFunctionOptimizer.java +++ /dev/null @@ -1,358 +0,0 @@ -package mvm.rya.indexing; - -/* - * 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.io.IOException; -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.MongoGeoIndexer; - -import org.apache.accumulo.core.client.AccumuloException; -import org.apache.accumulo.core.client.AccumuloSecurityException; -import org.apache.accumulo.core.client.TableExistsException; -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.geotools.feature.SchemaException; -import org.openrdf.model.Resource; -import org.openrdf.model.URI; -import org.openrdf.model.Value; -import org.openrdf.model.ValueFactory; -import org.openrdf.model.impl.URIImpl; -import org.openrdf.model.impl.ValueFactoryImpl; -import org.openrdf.query.BindingSet; -import org.openrdf.query.Dataset; -import org.openrdf.query.algebra.And; -import org.openrdf.query.algebra.Filter; -import org.openrdf.query.algebra.FunctionCall; -import org.openrdf.query.algebra.Join; -import org.openrdf.query.algebra.LeftJoin; -import org.openrdf.query.algebra.QueryModelNode; -import org.openrdf.query.algebra.StatementPattern; -import org.openrdf.query.algebra.TupleExpr; -import org.openrdf.query.algebra.ValueConstant; -import org.openrdf.query.algebra.ValueExpr; -import org.openrdf.query.algebra.Var; -import org.openrdf.query.algebra.evaluation.QueryOptimizer; -import org.openrdf.query.algebra.helpers.QueryModelVisitorBase; - -import com.google.common.collect.Lists; - -public class FilterFunctionOptimizer implements QueryOptimizer, Configurable { - - 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 { - this.conf = conf; - init(); - } - - //setConf initializes FilterFunctionOptimizer so reflection can be used - //to create optimizer in RdfCloudTripleStoreConnection - @Override - public void setConf(Configuration conf) { - this.conf = conf; - init(); - } - - - private void init() { - if (!init) { - if (ConfigUtils.getUseMongo(conf)) { - this.geoIndexer = new MongoGeoIndexer(); - geoIndexer.setConf(conf); - } else { - this.geoIndexer = new GeoMesaGeoIndexer(); - geoIndexer.setConf(conf); - this.freeTextIndexer = new AccumuloFreeTextIndexer(); - freeTextIndexer.setConf(conf); - this.temporalIndexer = new AccumuloTemporalIndexer(); - temporalIndexer.setConf(conf); - init = true; - } - } - } - - @Override - public void optimize(TupleExpr tupleExpr, Dataset dataset, BindingSet bindings) { - // find variables used in property and resource based searches: - SearchVarVisitor searchVars = new SearchVarVisitor(); - tupleExpr.visit(searchVars); - // rewrites for property searches: - processPropertySearches(tupleExpr, searchVars.searchProperties); - - } - - - - private void processPropertySearches(TupleExpr tupleExpr, Collection searchProperties) { - MatchStatementVisitor matchStatements = new MatchStatementVisitor(searchProperties); - tupleExpr.visit(matchStatements); - for (StatementPattern matchStatement: matchStatements.matchStatements) { - 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) { - //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) - matchStatement.getParentNode().replaceWith(new Join(leftJoin.getLeftArg(), leftJoin.getRightArg())); - } - FilterFunction fVisitor = new FilterFunction(matchStatement.getObjectVar().getName()); - tupleExpr.visit(fVisitor); - List 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))); - } - removeMatchedPattern(tupleExpr, matchStatement, new IndexerExprReplacer(results)); - - } - - //find vars contained in filters - private static class SearchVarVisitor extends QueryModelVisitorBase { - - private final Collection searchProperties = new ArrayList(); - - @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)) - searchProperties.add(result); - } - } - - //find StatementPatterns containing filter variables - private static class MatchStatementVisitor extends QueryModelVisitorBase { - private final Collection propertyVars; - private final Collection usedVars = new ArrayList(); - private final List matchStatements = new ArrayList(); - - public MatchStatementVisitor(Collection propertyVars) { - this.propertyVars = propertyVars; - } - - @Override public void meet(StatementPattern statement) { - 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 { - usedVars.add(object); - matchStatements.add(statement); - } - } - } - - private abstract class AbstractEnhanceVisitor extends QueryModelVisitorBase { - final String matchVar; - List func = Lists.newArrayList(); - List args = Lists.newArrayList(); - - public AbstractEnhanceVisitor(String matchVar) { - this.matchVar = matchVar; - } - - protected void addFilter(URI uri, Value[] values) { - func.add(uri); - args.add(values); - } - } - - //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) { - super(matchVar); - } - - @Override - public void meet(FunctionCall call) { - URI fnUri = valueFactory.createURI(call.getURI()); - 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) - call.replaceWith(new ValueConstant(valueFactory.createLiteral(true))); - 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]; - 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())) - continue; - if (arg instanceof ValueConstant) - args[argI] = ((ValueConstant)arg).getValue(); - else if (arg instanceof Var && ((Var)arg).hasValue()) - args[argI] = ((Var)arg).getValue(); - else - throw new IllegalArgumentException("Query error: Found " + arg + ", expected a Literal, BNode or URI"); - ++argI; - } - return args; - } - - @Override - public void meet(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 indexTuples = replacer.createReplacement(pattern); - if (indexTuples.size() > 1) { - VarExchangeVisitor vev = new VarExchangeVisitor(pattern); - tupleExpr.visit(vev); - Join join = new Join(indexTuples.remove(0), indexTuples.remove(0)); - for (TupleExpr geo : indexTuples) { - join = new Join(join, geo); - } - pattern.replaceWith(join); - } else if (indexTuples.size() == 1) { - pattern.replaceWith(indexTuples.get(0)); - pattern.setParentNode(null); - } else { - throw new IllegalStateException("Must have at least one replacement for matched StatementPattern."); - } - } - - private interface TupleExprReplacer { - List createReplacement(TupleExpr org); - } - - - //replace each filter pertinent StatementPattern with corresponding index expr - private class IndexerExprReplacer implements TupleExprReplacer { - private final List indxExpr; - private FUNCTION_TYPE type; - - public IndexerExprReplacer(List indxExpr) { - this.indxExpr = indxExpr; - URI func = indxExpr.get(0).getFunction(); - this.type = IndexingFunctionRegistry.getFunctionType(func); - } - - @Override - public List createReplacement(TupleExpr org) { - List indexTuples = Lists.newArrayList(); - switch (type) { - case GEO: - for (IndexingExpr indx : indxExpr) { - indexTuples.add(new GeoTupleSet(indx, geoIndexer)); - } - break; - case FREETEXT: - for (IndexingExpr indx : indxExpr) { - indexTuples.add(new FreeTextTupleSet(indx, freeTextIndexer)); - } - break; - case TEMPORAL: - for (IndexingExpr indx : indxExpr) { - indexTuples.add(new TemporalTupleSet(indx, temporalIndexer)); - } - break; - default: - throw new IllegalArgumentException("Incorrect type!"); - - } - return indexTuples; - } - } - - - private static class VarExchangeVisitor extends QueryModelVisitorBase { - - private final StatementPattern exchangeVar; - - public VarExchangeVisitor(StatementPattern sp) { - this.exchangeVar = sp; - } - - @Override - public void meet(Join node) { - QueryModelNode lNode = node.getLeftArg(); - if (lNode instanceof StatementPattern) { - exchangeVar.replaceWith(lNode); - node.setLeftArg(exchangeVar); - } else { - super.meet(node); - } - } - } - - - - - - - @Override - public Configuration getConf() { - return conf; - } - - - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5a03ef61/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 deleted file mode 100644 index 2d8bae9..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/FreeTextIndexer.java +++ /dev/null @@ -1,62 +0,0 @@ -package mvm.rya.indexing; - -/* - * 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 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. - */ -public interface FreeTextIndexer extends RyaSecondaryIndexer { - - /** - * Query the Free Text Index with specific constraints. A null or empty parameters imply no constraint. - * - * @param query - * the query to perform - * @param contraints - * the constraints on the statements returned - * @return the set of statements that meet the query and other constraints. - * @throws IOException - */ - public abstract CloseableIteration queryText(String query, StatementContraints contraints) throws IOException; - - /** - * @return the set of predicates indexed by the indexer. - */ - public abstract Set 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/5a03ef61/extras/indexing/src/main/java/mvm/rya/indexing/GeoIndexer.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/GeoIndexer.java b/extras/indexing/src/main/java/mvm/rya/indexing/GeoIndexer.java deleted file mode 100644 index 7c04903..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/GeoIndexer.java +++ /dev/null @@ -1,201 +0,0 @@ -package mvm.rya.indexing; - -/* - * 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 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; - -import com.vividsolutions.jts.geom.Geometry; - -/** - * A repository to store, index, and retrieve {@link Statement}s based on geospatial features. - */ -public interface GeoIndexer extends RyaSecondaryIndexer { - /** - * Returns statements that contain a geometry that is equal to the queried {@link Geometry} and meet the {@link StatementContraints}. - * - *

- * From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM): - *

    - *
  • - * "Two geometries are topologically equal if their interiors intersect and no part of the interior or boundary of one geometry intersects the exterior of the other" - *
  • "A is equal to B if A is within B and A contains B" - *
- * - * @param query - * the queried geometry - * @param contraints - * the {@link StatementContraints} - * @return - */ - public abstract CloseableIteration queryEquals(Geometry query, StatementContraints contraints); - - /** - * Returns statements that contain a geometry that is disjoint to the queried {@link Geometry} and meet the {@link StatementContraints}. - * - *

- * From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM): - *

    - *
  • "A and B are disjoint if they have no point in common. They form a set of disconnected geometries." - *
  • "A and B are disjoint if A does not intersect B" - *
- * - * @param query - * the queried geometry - * @param contraints - * the {@link StatementContraints} - * @return - */ - public abstract CloseableIteration queryDisjoint(Geometry query, StatementContraints contraints); - - /** - * Returns statements that contain a geometry that Intersects the queried {@link Geometry} and meet the {@link StatementContraints}. - * - *

- * From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM): - *

    - *
  • "a intersects b: geometries a and b have at least one point in common." - *
  • "not Disjoint" - *
- * - * - * @param query - * the queried geometry - * @param contraints - * the {@link StatementContraints} - * @return - */ - public abstract CloseableIteration queryIntersects(Geometry query, StatementContraints contraints); - - /** - * Returns statements that contain a geometry that Touches the queried {@link Geometry} and meet the {@link StatementContraints}. - * - *

- * From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM): - *

    - *
  • "a touches b, they have at least one boundary point in common, but no interior points." - *
- * - * - * @param query - * the queried geometry - * @param contraints - * the {@link StatementContraints} - * @return - */ - public abstract CloseableIteration queryTouches(Geometry query, StatementContraints contraints); - - /** - * Returns statements that contain a geometry that crosses the queried {@link Geometry} and meet the {@link StatementContraints}. - * - *

- * From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM): - *

    - *
  • - * "a crosses b, they have some but not all interior points in common (and the dimension of the intersection is less than that of at least one of them)." - *
- * - * @param query - * the queried geometry - * @param contraints - * the {@link StatementContraints} - * @return - */ - public abstract CloseableIteration queryCrosses(Geometry query, StatementContraints contraints); - - /** - * Returns statements that contain a geometry that is Within the queried {@link Geometry} and meet the {@link StatementContraints}. - * - *

- * From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM): - *

    - *
  • "a is within b, a lies in the interior of b" - *
  • Same as: "Contains(b,a)" - *
- * - * - * @param query - * the queried geometry - * @param contraints - * the {@link StatementContraints} - * @return - */ - public abstract CloseableIteration queryWithin(Geometry query, StatementContraints contraints); - - /** - * Returns statements that contain a geometry that Contains the queried {@link Geometry} and meet the {@link StatementContraints}. - * - *

- * From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM): - *

    - *
  • b is within a. Geometry b lies in the interior of a. Another definition: - * "a 'contains' b iff no points of b lie in the exterior of a, and at least one point of the interior of b lies in the interior of a" - *
  • Same: Within(b,a) - *
- * - * - * @param query - * the queried geometry - * @param contraints - * the {@link StatementContraints} - * @return - */ - public abstract CloseableIteration queryContains(Geometry query, StatementContraints contraints); - - /** - * Returns statements that contain a geometry that Overlaps the queried {@link Geometry} and meet the {@link StatementContraints}. - * - *

- * From Wikipedia (http://en.wikipedia.org/wiki/DE-9IM): - *

    - *
  • a crosses b, they have some but not all interior points in common (and the dimension of the intersection is less than that of at - * least one of them). - *
- * - * - * @param query - * the queried geometry - * @param contraints - * the {@link StatementContraints} - * @return - */ - public abstract CloseableIteration queryOverlaps(Geometry query, StatementContraints contraints); - - /** - * @return the set of predicates indexed by the indexer. - */ - public abstract Set 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/5a03ef61/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/ExternalIndexMatcher.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/ExternalIndexMatcher.java b/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/ExternalIndexMatcher.java deleted file mode 100644 index ee3d444..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/ExternalIndexMatcher.java +++ /dev/null @@ -1,34 +0,0 @@ -package mvm.rya.indexing.IndexPlanValidator; - -/* - * 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.util.Iterator; - -import org.openrdf.query.algebra.TupleExpr; - -public interface ExternalIndexMatcher { - - - public Iterator getIndexedTuples(); - - - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5a03ef61/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessor.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessor.java b/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessor.java deleted file mode 100644 index 27a0d15..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessor.java +++ /dev/null @@ -1,730 +0,0 @@ -package mvm.rya.indexing.IndexPlanValidator; - -/* - * 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.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import mvm.rya.indexing.external.QueryVariableNormalizer.VarCollector; -import mvm.rya.indexing.external.tupleSet.ExternalTupleSet; - -import org.openrdf.query.algebra.BindingSetAssignment; -import org.openrdf.query.algebra.Filter; -import org.openrdf.query.algebra.Join; -import org.openrdf.query.algebra.Projection; -import org.openrdf.query.algebra.QueryModelNode; -import org.openrdf.query.algebra.StatementPattern; -import org.openrdf.query.algebra.TupleExpr; -import org.openrdf.query.algebra.Var; -import org.openrdf.query.algebra.helpers.QueryModelVisitorBase; -import org.openrdf.query.algebra.helpers.StatementPatternCollector; - -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; - -/** - * Processes a {@link TupleExpr} and replaces sets of elements in the tree with {@link ExternalTupleSet} objects. - */ -public class GeneralizedExternalProcessor { - - - /** - * Iterates through list of normalized indexes and replaces all subtrees of query which match index with index. - * - * @param query - * @return TupleExpr - */ - public static TupleExpr process(TupleExpr query, List indexSet) { - - boolean indexPlaced = false; - TupleExpr rtn = query.clone(); - - - //TODO optimization: turn on when testing done - QueryNodeCount qnc = new QueryNodeCount(); - rtn.visit(qnc); - - if(qnc.getNodeCount()/2 < indexSet.size()) { - return null; - } - - - //move BindingSetAssignment Nodes out of the way - organizeBSAs(rtn); - - - // test to see if query contains no other nodes - // than filter, join, projection, and statement pattern and - // test whether query contains duplicate StatementPatterns and filters - if (isTupleValid(rtn)) { - - for (ExternalTupleSet index : indexSet) { - - // test to see if index contains at least one StatementPattern, - // that StatementPatterns are unique, - // and that all variables found in filters occur in some - // StatementPattern - if (isTupleValid(index.getTupleExpr())) { - - ExternalTupleSet eTup = (ExternalTupleSet) index.clone(); - SPBubbleDownVisitor indexVistor = new SPBubbleDownVisitor(eTup); - rtn.visit(indexVistor); - FilterBubbleManager fbmv = new FilterBubbleManager(eTup); - rtn.visit(fbmv); - SubsetEqualsVisitor subIndexVis = new SubsetEqualsVisitor(eTup, rtn); - rtn.visit(subIndexVis); - indexPlaced = subIndexVis.indexPlaced(); - if(!indexPlaced) { - break; - } - - } - - } - if(indexPlaced) { -// if(indexSet.size() == 3) { -// System.out.println("IndexSet is " + indexSet); -// System.out.println("Tuple is " + rtn); -// } - return rtn; - } else { -// if(indexSet.size() == 3) { -// System.out.println("IndexSet is " + indexSet); -// } -// - return null; - } - - } else { - throw new IllegalArgumentException("Invalid Query."); - } - } - - - - - - // determines whether query is valid, which requires that a - // query must contain a StatementPattern, not contain duplicate - // Statement Patterns or Filters, not be comprised of only Projection, - // Join, StatementPattern, and Filter nodes, and that any variable - // appearing in a Filter must appear in a StatementPattern. - private static boolean isTupleValid(QueryModelNode node) { - - ValidQueryVisitor vqv = new ValidQueryVisitor(); - node.visit(vqv); - - Set spVars = getVarNames(getQNodes("sp", node)); - - if (vqv.isValid() && (spVars.size() > 0)) { - - FilterCollector fvis = new FilterCollector(); - node.visit(fvis); - List fList = fvis.getFilters(); - return (fList.size() == Sets.newHashSet(fList).size() && getVarNames(fList).size() <= spVars.size()); - - } else { - return false; - } - } - - private static Set getQNodes(QueryModelNode queryNode) { - Set rtns = new HashSet(); - - StatementPatternCollector spc = new StatementPatternCollector(); - queryNode.visit(spc); - rtns.addAll(spc.getStatementPatterns()); - - FilterCollector fvis = new FilterCollector(); - queryNode.visit(fvis); - rtns.addAll(fvis.getFilters()); - - ExternalTupleCollector eVis = new ExternalTupleCollector(); - queryNode.visit(eVis); - rtns.addAll(eVis.getExtTup()); - - return rtns; - } - - private static Set getQNodes(String node, QueryModelNode queryNode) { - - if (node.equals("sp")) { - Set eSet = new HashSet(); - StatementPatternCollector spc = new StatementPatternCollector(); - queryNode.visit(spc); - List spList = spc.getStatementPatterns(); - eSet.addAll(spList); - // returns empty set if list contains duplicate StatementPatterns - if (spList.size() > eSet.size()) { - return Sets.newHashSet(); - } else { - return eSet; - } - } else if (node.equals("filter")) { - - FilterCollector fvis = new FilterCollector(); - queryNode.visit(fvis); - - return Sets.newHashSet(fvis.getFilters()); - } else { - - throw new IllegalArgumentException("Invalid node type."); - } - } - - // moves StatementPatterns in query that also occur in index to bottom of - // query tree. - private static class SPBubbleDownVisitor extends QueryModelVisitorBase { - - private TupleExpr tuple; - private QueryModelNode indexQNode; - private Set sSet = Sets.newHashSet(); - - public SPBubbleDownVisitor(ExternalTupleSet index) { - - this.tuple = index.getTupleExpr(); - indexQNode = ((Projection) tuple).getArg(); - sSet = getQNodes("sp", indexQNode); - - } - - public void meet(Projection node) { - // moves external tuples above statement patterns before attempting - // to bubble down index statement patterns found in query tree - - organizeExtTuples(node); - - super.meet(node); - } - - public void meet(Join node) { - // if right node contained in index, move it to bottom of query tree - if (sSet.contains(node.getRightArg())) { - - Set eSet = getQNodes("sp", node); - Set compSet = Sets.difference(eSet, sSet); - - if (eSet.containsAll(sSet)) { - - QNodeExchanger qne = new QNodeExchanger(node.getRightArg(), compSet); - node.visit(qne); - node.replaceChildNode(node.getRightArg(), qne.getReplaced()); - - super.meet(node); - } - return; - } - // if left node contained in index, move it to bottom of query tree - else if (sSet.contains(node.getLeftArg())) { - - Set eSet = getQNodes("sp", node); - Set compSet = Sets.difference(eSet, sSet); - - if (eSet.containsAll(sSet)) { - - QNodeExchanger qne = new QNodeExchanger(node.getLeftArg(), compSet); - node.visit(qne); - node.replaceChildNode(node.getLeftArg(), qne.getReplaced()); - - super.meet(node); - } - return; - - } else { - super.meet(node); - } - - } - - // moves all ExternalTupleSets in query tree above remaining - // StatementPatterns - private static void organizeExtTuples(QueryModelNode node) { - - ExternalTupleCollector eVis = new ExternalTupleCollector(); - node.visit(eVis); - - ExtTupleExchangeVisitor oev = new ExtTupleExchangeVisitor(eVis.getExtTup()); - node.visit(oev); - } - - } - - // given a replacement QueryModelNode and compSet, this visitor replaces the - // first - // element in the query tree that occurs in compSet with replacement and - // returns - // the element that was replaced. - private static class QNodeExchanger extends QueryModelVisitorBase { - - private QueryModelNode toBeReplaced; - private QueryModelNode replacement; - private Set compSet; - - public QNodeExchanger(QueryModelNode replacement, Set compSet) { - this.replacement = replacement; - this.toBeReplaced = replacement; - this.compSet = compSet; - } - - public QueryModelNode getReplaced() { - return toBeReplaced; - } - - public void meet(Join node) { - - if (compSet.contains(node.getRightArg())) { - this.toBeReplaced = node.getRightArg(); - node.replaceChildNode(node.getRightArg(), replacement); - return; - } else if (compSet.contains(node.getLeftArg())) { - this.toBeReplaced = node.getLeftArg(); - node.replaceChildNode(node.getLeftArg(), replacement); - return; - } else { - super.meet(node); - } - - } - - } - - // moves filter that occurs in both query and index down the query tree so - // that that it is positioned - // above statement patterns associated with index. Precondition for calling - // this method is that - // SPBubbleDownVisitor has been called to position index StatementPatterns - // within query tree. - //TODO this visitor assumes that all filters are positioned at top of query tree - //could lead to problems if filter optimizer called before external processor - private static class FilterBubbleDownVisitor extends QueryModelVisitorBase { - - private QueryModelNode filter; - private Set compSet; - private boolean filterPlaced = false; - - public FilterBubbleDownVisitor(QueryModelNode filter, Set compSet) { - this.filter = filter; - this.compSet = compSet; - - } - - public boolean filterPlaced() { - return filterPlaced; - } - - public void meet(Join node) { - - if (!compSet.contains(node.getRightArg())) { - // looks for placed to position filter node. if right node is - // contained in index - // and left node is statement pattern node contained in index or - // is a join, place - // filter above join. - if (node.getLeftArg() instanceof Join || !(compSet.contains(node.getLeftArg()))) { - - QueryModelNode pNode = node.getParentNode(); - ((Filter) filter).setArg(node); - pNode.replaceChildNode(node, filter); - filterPlaced = true; - - return; - } // otherwise place filter below join and above right arg - else { - ((Filter) filter).setArg(node.getRightArg()); - node.replaceChildNode(node.getRightArg(), filter); - filterPlaced = true; - return; - - } - } else if ((node.getLeftArg() instanceof StatementPattern) && !compSet.contains(node.getLeftArg())) { - - ((Filter) filter).setArg(node.getLeftArg()); - node.replaceChildNode(node.getLeftArg(), filter); - filterPlaced = true; - - return; - } else { - super.meet(node); - } - } - - } - - private static Set getVarNames(Collection nodes) { - - List tempVars; - Set nodeVarNames = Sets.newHashSet(); - - for (QueryModelNode s : nodes) { - tempVars = VarCollector.process(s); - for (String t : tempVars) - nodeVarNames.add(t); - } - return nodeVarNames; - - } - - // visitor which determines whether or not to reposition a filter by calling - // FilterBubbleDownVisitor - private static class FilterBubbleManager extends QueryModelVisitorBase { - - private TupleExpr tuple; - private QueryModelNode indexQNode; - private Set sSet = Sets.newHashSet(); - private Set bubbledFilters = Sets.newHashSet(); - - public FilterBubbleManager(ExternalTupleSet index) { - this.tuple = index.getTupleExpr(); - indexQNode = ((Projection) tuple).getArg(); - sSet = getQNodes(indexQNode); - - } - - public void meet(Filter node) { - - Set eSet = getQNodes(node); - Set compSet = Sets.difference(eSet, sSet); - - // if index contains filter node and it hasn't already been moved, - // move it down - // query tree just above position of statement pattern nodes found - // in both query tree - // and index (assuming that SPBubbleDownVisitor has already been - // called) - if (sSet.contains(node.getCondition()) && !bubbledFilters.contains(node.getCondition())) { - FilterBubbleDownVisitor fbdv = new FilterBubbleDownVisitor((Filter) node.clone(), compSet); - node.visit(fbdv); - bubbledFilters.add(node.getCondition()); - // checks if filter correctly placed, and if it has been, - // removes old copy of filter - if (fbdv.filterPlaced()) { - - QueryModelNode pNode = node.getParentNode(); - TupleExpr cNode = node.getArg(); - pNode.replaceChildNode(node, cNode); - - - super.meetNode(pNode); - } - super.meet(node); - - } else { - super.meet(node); - } - } - } - - // iterates through the query tree and attempts to match subtrees with - // index. When a match is - // found, the subtree is replaced by an ExternalTupleSet formed from the - // index. Pre-condition for - // calling this method is that both SPBubbleDownVisitor and - // FilterBubbleManager have been called - // to position the StatementPatterns and Filters. - private static class SubsetEqualsVisitor extends QueryModelVisitorBase { - - private TupleExpr query; - private TupleExpr tuple; - private QueryModelNode indexQNode; - private ExternalTupleSet set; - private Set sSet = Sets.newHashSet(); - private TupleExpr temp; - private boolean indexPlaced = false; - - - public SubsetEqualsVisitor(ExternalTupleSet index, TupleExpr query) { - this.query = query; - this.tuple = index.getTupleExpr(); - this.set = index; - indexQNode = ((Projection) tuple).getArg(); - sSet = getQNodes(indexQNode); - - } - - public boolean indexPlaced() { - return indexPlaced; - } - - - public void meet(Join node) { - - Set eSet = getQNodes(node); - - if (eSet.containsAll(sSet) && !(node.getRightArg() instanceof BindingSetAssignment)) { - -// System.out.println("Eset is " + eSet + " and sSet is " + sSet); - - if (eSet.equals(sSet)) { - node.replaceWith(set); - indexPlaced = true; - return; - } else { - if (node.getLeftArg() instanceof StatementPattern && sSet.size() == 1) { - if(sSet.contains(node.getLeftArg())) { - node.setLeftArg(set); - indexPlaced = true; - } else if(sSet.contains(node.getRightArg())) { - node.setRightArg(set); - indexPlaced = true; - } else { - return; - } - } - else { - super.meet(node); - } - } - } else if (eSet.containsAll(sSet)) { - - super.meet(node); - - } else { - return; - } - - } - //TODO might need to include BindingSetAssignment Condition here - //to account for index consisting of only filter and BindingSetAssignment nodes - public void meet(Filter node) { - - Set eSet = getQNodes(node); - - if (eSet.containsAll(sSet)) { - - if (eSet.equals(sSet)) { - node.replaceWith(set); - indexPlaced = true; - return; - } else { - node.getArg().visit(this); - } - } - } - - - public void meet(StatementPattern node) { - return; - } - } - - // visitor which determines whether a query is valid (i.e. it does not - // contain nodes other than - // Projection, Join, Filter, StatementPattern ) - private static class ValidQueryVisitor extends QueryModelVisitorBase { - - private boolean isValid = true; - - public boolean isValid() { - return isValid; - } - - public void meet(Projection node) { - node.getArg().visit(this); - } - - public void meet(Filter node) { - node.getArg().visit(this); - } - - - - - - public void meetNode(QueryModelNode node) { - - if (!((node instanceof Join) || (node instanceof StatementPattern) || (node instanceof BindingSetAssignment) || (node instanceof Var))) { - isValid = false; - return; - - } else{ - super.meetNode(node); - } - } - - } - - // repositions ExternalTuples above StatementPatterns within query tree - private static class ExtTupleExchangeVisitor extends QueryModelVisitorBase { - - private Set extTuples; - - public ExtTupleExchangeVisitor(Set extTuples) { - this.extTuples = extTuples; - } - - public void meet(Join queryNode) { - - // if query tree contains external tuples and they are not - // positioned above statement pattern node - // reposition - if (this.extTuples.size() > 0 && !(queryNode.getRightArg() instanceof ExternalTupleSet) - && !(queryNode.getRightArg() instanceof BindingSetAssignment)) { - - if (queryNode.getLeftArg() instanceof ExternalTupleSet) { - QueryModelNode temp = queryNode.getLeftArg(); - queryNode.setLeftArg(queryNode.getRightArg()); - queryNode.setRightArg((TupleExpr)temp); - } else { - - QNodeExchanger qnev = new QNodeExchanger((QueryModelNode) queryNode.getRightArg(), this.extTuples); - queryNode.visit(qnev); - queryNode.replaceChildNode(queryNode.getRightArg(), qnev.getReplaced()); - super.meet(queryNode); - } - } else { - super.meet(queryNode); - } - - } - - } - - private static class ExternalTupleCollector extends QueryModelVisitorBase { - - private Set eSet = new HashSet(); - - @Override - public void meetNode(QueryModelNode node) throws RuntimeException { - if (node instanceof ExternalTupleSet) { - eSet.add(node); - } - super.meetNode(node); - } - - public Set getExtTup() { - return eSet; - } - - } - - private static class FilterCollector extends QueryModelVisitorBase { - - private List filterList = Lists.newArrayList(); - - public List getFilters() { - return filterList; - } - - @Override - public void meet(Filter node) { - filterList.add(node.getCondition()); - super.meet(node); - } - - } - - private static void organizeBSAs(QueryModelNode node) { - - BindingSetAssignmentCollector bsac = new BindingSetAssignmentCollector(); - node.visit(bsac); - - if (bsac.containsBSAs()) { - Set bsaSet = bsac.getBindingSetAssignments(); - BindingSetAssignmentExchangeVisitor bsaev = new BindingSetAssignmentExchangeVisitor(bsaSet); - node.visit(bsaev); - } - } - - // repositions ExternalTuples above StatementPatterns within query tree - private static class BindingSetAssignmentExchangeVisitor extends QueryModelVisitorBase { - - private Set bsas; - - public BindingSetAssignmentExchangeVisitor(Set bsas) { - this.bsas = bsas; - } - - public void meet(Join queryNode) { - - // if query tree contains external tuples and they are not - // positioned above statement pattern node - // reposition - if (this.bsas.size() > 0 && !(queryNode.getRightArg() instanceof BindingSetAssignment)) { - QNodeExchanger qnev = new QNodeExchanger((QueryModelNode) queryNode.getRightArg(), bsas); - queryNode.visit(qnev); - queryNode.replaceChildNode(queryNode.getRightArg(), qnev.getReplaced()); - super.meet(queryNode); - } else { - super.meet(queryNode); - } - - } - - } - - - public static class BindingSetAssignmentCollector extends QueryModelVisitorBase { - - private Set bindingSetList = Sets.newHashSet(); - - public Set getBindingSetAssignments() { - return bindingSetList; - } - - public boolean containsBSAs() { - return (bindingSetList.size() > 0); - } - - @Override - public void meet(BindingSetAssignment node) { - bindingSetList.add(node); - super.meet(node); - } - - } - - - - public static class QueryNodeCount extends QueryModelVisitorBase { - - private int nodeCount; - - public QueryNodeCount() { - nodeCount = 0; - } - - public int getNodeCount() { - return nodeCount; - } - - - @Override - public void meet(StatementPattern node) { - nodeCount += 1; - return; - } - - @Override - public void meet(Filter node) { - nodeCount += 1; - node.getArg().visit(this); - } - - } - - - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5a03ef61/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/IndexListPruner.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/IndexListPruner.java b/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/IndexListPruner.java deleted file mode 100644 index fa1dc13..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/IndexListPruner.java +++ /dev/null @@ -1,35 +0,0 @@ -package mvm.rya.indexing.IndexPlanValidator; - -/* - * 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.util.List; - - - -import java.util.Set; - -import mvm.rya.indexing.external.tupleSet.ExternalTupleSet; - -public interface IndexListPruner { - - public Set getRelevantIndices(List indexList); - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5a03ef61/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/IndexPlanValidator.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/IndexPlanValidator.java b/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/IndexPlanValidator.java deleted file mode 100644 index 74df958..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/IndexPlanValidator.java +++ /dev/null @@ -1,210 +0,0 @@ -package mvm.rya.indexing.IndexPlanValidator; - -/* - * 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.util.Iterator; -import java.util.NoSuchElementException; -import java.util.Set; - -import mvm.rya.indexing.external.tupleSet.ExternalTupleSet; - -import org.openrdf.query.algebra.BindingSetAssignment; -import org.openrdf.query.algebra.Filter; -import org.openrdf.query.algebra.Join; -import org.openrdf.query.algebra.Projection; -import org.openrdf.query.algebra.StatementPattern; -import org.openrdf.query.algebra.TupleExpr; -import org.openrdf.query.algebra.helpers.QueryModelVisitorBase; - -import com.google.common.collect.Sets; - - - - -public class IndexPlanValidator implements TupleValidator { - - private boolean omitCrossProd = false; - - - public IndexPlanValidator(boolean omitCrossProd) { - this.omitCrossProd = omitCrossProd; - } - - public void setOmitCrossProd(boolean omitCrossProd) { - this.omitCrossProd = omitCrossProd; - } - - - @Override - public boolean isValid(TupleExpr te) { - - TupleValidateVisitor tv = new TupleValidateVisitor(); - te.visit(tv); - - return tv.isValid(); - } - - - - - public int getValidTupleSize(Iterator iter) { - - int size = 0; - - while(iter.hasNext()) { - if(isValid(iter.next())) { - size++; - } - } - - return size; - - } - - - - @Override - public Iterator getValidTuples(Iterator tupleIter) { - - final Iterator iter = tupleIter; - - return new Iterator() { - - private TupleExpr next = null; - private boolean hasNextCalled = false; - private boolean isEmpty = false; - - @Override - public boolean hasNext() { - - if (!hasNextCalled && !isEmpty) { - while (iter.hasNext()) { - TupleExpr temp = iter.next(); - if (isValid(temp)) { - next = temp; - hasNextCalled = true; - return true; - } - } - isEmpty = true; - return false; - } else if(isEmpty) { - return false; - }else { - return true; - } - } - - @Override - public TupleExpr next() { - - if (hasNextCalled) { - hasNextCalled = false; - return next; - } else if(isEmpty) { - throw new NoSuchElementException(); - }else { - if (this.hasNext()) { - hasNextCalled = false; - return next; - } else { - throw new NoSuchElementException(); - } - } - } - - @Override - public void remove() { - - throw new UnsupportedOperationException("Cannot delete from iterator!"); - - } - - }; - } - - private boolean isJoinValid(Join join) { - - Set leftBindingNames = join.getLeftArg().getBindingNames(); - Set rightBindingNames = join.getRightArg().getBindingNames(); - - - //System.out.println("Left binding names are " + leftBindingNames + " and right binding names are " + rightBindingNames); - - if (Sets.intersection(leftBindingNames, rightBindingNames).size() == 0) { - if (omitCrossProd) { - return false; - } else { - return true; - } - - } else { - if (join.getRightArg() instanceof ExternalTupleSet) { - - return ((ExternalTupleSet) join.getRightArg()).supportsBindingSet(leftBindingNames); - - } else { - return true; - } - } - - } - - public class TupleValidateVisitor extends QueryModelVisitorBase { - - private boolean isValid = true; - - public boolean isValid() { - return isValid; - } - - @Override - public void meet(Projection node) { - node.getArg().visit(this); - } - - @Override - public void meet(StatementPattern node) { - return; - } - - public void meet(BindingSetAssignment node) { - return; - } - - @Override - public void meet(Filter node) { - node.getArg().visit(this); - } - - @Override - public void meet(Join node) { - if (isJoinValid(node)) { - super.meet(node); - } else { - isValid = false; - return; - } - } - - } - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5a03ef61/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/IndexTupleGenerator.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/IndexTupleGenerator.java b/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/IndexTupleGenerator.java deleted file mode 100644 index 3586a5e..0000000 --- a/extras/indexing/src/main/java/mvm/rya/indexing/IndexPlanValidator/IndexTupleGenerator.java +++ /dev/null @@ -1,33 +0,0 @@ -package mvm.rya.indexing.IndexPlanValidator; - -/* - * 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.util.Iterator; - -import org.openrdf.query.algebra.TupleExpr; - -public interface IndexTupleGenerator { - - - public Iterator getPlans(Iterator indexPlans); - - -}