RYA-53 Added visibility support Visibility support added for PCJ tables. If no visibilities are defined during the query, only binding sets visible to the accesssor will be returned.
Added and updated tests for PCJ visibility. Added visibility support for Fluo backed Rya Added integration tests for inserting triples through fluo into PCJs with visibility. Added a Decorator pattern for BindingSets Project: http://git-wip-us.apache.org/repos/asf/incubator-rya/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-rya/commit/c53b5402 Tree: http://git-wip-us.apache.org/repos/asf/incubator-rya/tree/c53b5402 Diff: http://git-wip-us.apache.org/repos/asf/incubator-rya/diff/c53b5402 Branch: refs/heads/develop Commit: c53b5402b522c1d4769a5f2553c6ffcfe2c8b2c0 Parents: 8168b85 Author: isper3at <[email protected]> Authored: Mon Mar 21 12:55:56 2016 -0400 Committer: pujav65 <[email protected]> Committed: Fri May 13 09:00:50 2016 -0400 ---------------------------------------------------------------------- .../indexing/accumulo/VisibilityBindingSet.java | 90 +++++ .../indexing/external/BindingSetDecorator.java | 105 ++++++ .../external/tupleSet/BindingSetConverter.java | 4 +- .../tupleSet/BindingSetStringConverter.java | 28 +- .../indexing/external/tupleSet/PcjTables.java | 110 +++--- .../VisibilityBindingSetStringConverter.java | 62 ++++ .../tupleSet/BindingSetStringConverterTest.java | 54 +-- .../tupleSet/PcjTablesIntegrationTests.java | 123 ++++--- ...VisibilityBindingSetStringConverterTest.java | 132 +++++++ .../rya/indexing/pcj/fluo/api/CreatePcj.java | 10 +- .../indexing/pcj/fluo/api/InsertTriples.java | 18 +- .../pcj/fluo/app/FilterResultUpdater.java | 18 +- .../rya/indexing/pcj/fluo/app/IncUpdateDAO.java | 2 +- .../pcj/fluo/app/JoinResultUpdater.java | 90 +++-- .../pcj/fluo/app/QueryResultUpdater.java | 10 +- .../app/export/IncrementalResultExporter.java | 5 +- .../fluo/app/export/rya/RyaResultExporter.java | 4 +- .../fluo/app/observers/BindingSetUpdater.java | 18 +- .../pcj/fluo/app/observers/FilterObserver.java | 7 +- .../pcj/fluo/app/observers/JoinObserver.java | 7 +- .../fluo/app/observers/QueryResultObserver.java | 20 +- .../app/observers/StatementPatternObserver.java | 8 +- .../pcj/fluo/app/observers/TripleObserver.java | 42 ++- .../pcj/fluo/app/query/FluoQueryColumns.java | 2 +- .../fluo/app/query/FluoQueryMetadataDAO.java | 4 +- .../pcj/fluo/app/LeftOuterJoinTest.java | 82 +++-- .../indexing/pcj/fluo/app/NaturalJoinTest.java | 70 ++-- .../pcj/fluo/client/util/FluoLoader.java | 6 +- .../pcj/fluo/demo/FluoAndHistoricPcjsDemo.java | 6 +- .../pcj/fluo/api/CountStatementsIT.java | 3 +- .../indexing/pcj/fluo/api/GetQueryReportIT.java | 3 +- .../indexing/pcj/fluo/integration/InputIT.java | 7 +- .../indexing/pcj/fluo/integration/QueryIT.java | 9 +- .../pcj/fluo/integration/RyaExportIT.java | 6 +- .../pcj/fluo/visibility/PcjVisibilityIT.java | 362 +++++++++++++++++++ 35 files changed, 1183 insertions(+), 344 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c53b5402/extras/indexing/src/main/java/mvm/rya/indexing/accumulo/VisibilityBindingSet.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/accumulo/VisibilityBindingSet.java b/extras/indexing/src/main/java/mvm/rya/indexing/accumulo/VisibilityBindingSet.java new file mode 100644 index 0000000..b9e2351 --- /dev/null +++ b/extras/indexing/src/main/java/mvm/rya/indexing/accumulo/VisibilityBindingSet.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package mvm.rya.indexing.accumulo; + +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.annotation.ParametersAreNonnullByDefault; + +import org.openrdf.query.BindingSet; + +import mvm.rya.indexing.external.BindingSetDecorator; + +/** + * Decorates a {@link BindingSet} with a collection of visibilities. + */ +@ParametersAreNonnullByDefault +public class VisibilityBindingSet extends BindingSetDecorator { + private static final long serialVersionUID = 1L; + private final String visibility; + private volatile int hashCode; + + /** + * @param set - Decorates the {@link BindingSet} with no visibilities. + */ + public VisibilityBindingSet(final BindingSet set) { + this(set, ""); + } + + /** + * Creates a new {@link VisibilityBindingSet} + * @param set - The {@link BindingSet} to decorate + * @param visibility - The visibilities on the {@link BindingSet} (not null) + */ + public VisibilityBindingSet(final BindingSet set, final String visibility) { + super(set); + this.visibility = checkNotNull(visibility); + } + + /** + * @return - The Visibilities on the {@link BindingSet} + */ + public String getVisibility() { + return visibility; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } else if(o instanceof VisibilityBindingSet) { + final VisibilityBindingSet other = (VisibilityBindingSet) o; + return set.equals(other) && visibility.equals(other.getVisibility()); + } + return false; + } + + @Override + public int hashCode() { + int result = hashCode; + if(result == 0) { + result = 31 * result + visibility.hashCode(); + result = 31 * result + super.hashCode(); + hashCode = result; + } + return result; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder(super.toString()); + sb.append("\n Visibility: " + getVisibility() + "\n"); + return sb.toString(); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c53b5402/extras/indexing/src/main/java/mvm/rya/indexing/external/BindingSetDecorator.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/external/BindingSetDecorator.java b/extras/indexing/src/main/java/mvm/rya/indexing/external/BindingSetDecorator.java new file mode 100644 index 0000000..b4909bd --- /dev/null +++ b/extras/indexing/src/main/java/mvm/rya/indexing/external/BindingSetDecorator.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package mvm.rya.indexing.external; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Iterator; +import java.util.Set; + +import org.openrdf.model.Value; +import org.openrdf.query.Binding; +import org.openrdf.query.BindingSet; + +/** + * Abstracts out the decoration of a {@link BindingSet}. + */ +public abstract class BindingSetDecorator implements BindingSet { + private static final long serialVersionUID = 1L; + protected final BindingSet set; + private volatile int hashCode; + + /** + * Constructs a new {@link BindingSetDecorator}, decorating the provided + * {@link BindingSet}. + * @param set - The {@link BindingSet} to be decorated. (not null) + */ + public BindingSetDecorator(final BindingSet set) { + this.set = checkNotNull(set); + } + + @Override + public Iterator<Binding> iterator() { + return set.iterator(); + } + + @Override + public Set<String> getBindingNames() { + return set.getBindingNames(); + } + + @Override + public Binding getBinding(final String bindingName) { + return set.getBinding(bindingName); + } + + @Override + public boolean hasBinding(final String bindingName) { + return set.hasBinding(bindingName); + } + + @Override + public Value getValue(final String bindingName) { + return set.getValue(bindingName); + } + + @Override + public int size() { + return set.size(); + } + + @Override + public boolean equals(final Object o) { + if(!(o instanceof BindingSetDecorator)) { + return false; + } + final BindingSetDecorator other = (BindingSetDecorator) o; + return set.equals(other.set); + } + + @Override + public int hashCode() { + int result = hashCode; + if(result == 0) { + result = 31 * result + set.hashCode(); + hashCode = result; + } + return result; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder(); + sb.append(" names: "); + for (final String name : getBindingNames()) { + sb.append("\n [name]: " + name + " --- [value]: " + getBinding(name).getValue().toString()); + } + return sb.toString(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c53b5402/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/BindingSetConverter.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/BindingSetConverter.java b/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/BindingSetConverter.java index 9c10dfa..84aee0c 100644 --- a/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/BindingSetConverter.java +++ b/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/BindingSetConverter.java @@ -91,7 +91,7 @@ public interface BindingSetConverter<T> { * * @param message - Describes why this exception was thrown. */ - public BindingSetConversionException(String message) { + public BindingSetConversionException(final String message) { super(message); } @@ -101,7 +101,7 @@ public interface BindingSetConverter<T> { * @param message - Describes why this exception was thrown. * @param cause - The exception that caused this one to be thrown. */ - public BindingSetConversionException(String message, Throwable cause) { + public BindingSetConversionException(final String message, final Throwable cause) { super(message, cause); } } http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c53b5402/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/BindingSetStringConverter.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/BindingSetStringConverter.java b/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/BindingSetStringConverter.java index 6d69d5b..c4116f2 100644 --- a/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/BindingSetStringConverter.java +++ b/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/BindingSetStringConverter.java @@ -57,24 +57,24 @@ public class BindingSetStringConverter implements BindingSetConverter<String> { private static final ValueFactory valueFactory = new ValueFactoryImpl(); @Override - public String convert(BindingSet bindingSet, VariableOrder varOrder) { + public String convert(final BindingSet bindingSet, final VariableOrder varOrder) { checkBindingsSubsetOfVarOrder(bindingSet, varOrder); // Convert each Binding to a String. - List<String> bindingStrings = new ArrayList<>(); - for(String varName : varOrder) { + final List<String> bindingStrings = new ArrayList<>(); + for(final String varName : varOrder) { if(bindingSet.hasBinding(varName)) { // Add a value to the binding set. final Value value = bindingSet.getBinding(varName).getValue(); final RyaType ryaValue = RdfToRyaConversions.convertValue(value); - String bindingString = ryaValue.getData() + TYPE_DELIM + ryaValue.getDataType(); + final String bindingString = ryaValue.getData() + TYPE_DELIM + ryaValue.getDataType(); bindingStrings.add(bindingString); } else { // Add a null value to the binding set. - bindingStrings.add(NULL_VALUE_STRING); + bindingStrings.add(NULL_VALUE_STRING); } } - + // Join the bindings using the binding delim. return Joiner.on(BINDING_DELIM).join(bindingStrings); } @@ -82,23 +82,23 @@ public class BindingSetStringConverter implements BindingSetConverter<String> { /** * Checks to see if the names of all the {@link Binding}s in the {@link BindingSet} * are a subset of the variables names in {@link VariableOrder}. - * + * * @param bindingSet - The binding set whose Bindings will be inspected. (not null) * @param varOrder - The names of the bindings that may appear in the BindingSet. (not null) * @throws IllegalArgumentException Indicates the names of the bindings are - * not a subset of the variable order. + * not a subset of the variable order. */ - private static void checkBindingsSubsetOfVarOrder(BindingSet bindingSet, VariableOrder varOrder) throws IllegalArgumentException { + private static void checkBindingsSubsetOfVarOrder(final BindingSet bindingSet, final VariableOrder varOrder) throws IllegalArgumentException { checkNotNull(bindingSet); checkNotNull(varOrder); - Set<String> bindingNames = bindingSet.getBindingNames(); - List<String> varNames = varOrder.getVariableOrders(); + final Set<String> bindingNames = bindingSet.getBindingNames(); + final List<String> varNames = varOrder.getVariableOrders(); checkArgument(varNames.containsAll(bindingNames), "The BindingSet contains a Binding whose name is not part of the VariableOrder."); } @Override - public BindingSet convert(String bindingSetString, VariableOrder varOrder) { + public BindingSet convert(final String bindingSetString, final VariableOrder varOrder) { checkNotNull(bindingSetString); checkNotNull(varOrder); @@ -108,7 +108,7 @@ public class BindingSetStringConverter implements BindingSetConverter<String> { final QueryBindingSet bindingSet = new QueryBindingSet(); for(int i = 0; i < bindingStrings.length; i++) { - String bindingString = bindingStrings[i]; + final String bindingString = bindingStrings[i]; if(!NULL_VALUE_STRING.equals(bindingString)) { final String name = varOrrderArr[i]; final Value value = toValue(bindingStrings[i]); @@ -124,7 +124,7 @@ public class BindingSetStringConverter implements BindingSetConverter<String> { * @param valueString - The String representation of the value. (not null) * @return The {@link Value} representation of the String. */ - private static Value toValue(final String valueString) { + protected static Value toValue(final String valueString) { checkNotNull(valueString); // Split the String that was stored in Fluo into its Value and Type parts. http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c53b5402/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/PcjTables.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/PcjTables.java b/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/PcjTables.java index fc940f6..d8a81a6 100644 --- a/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/PcjTables.java +++ b/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/PcjTables.java @@ -56,6 +56,7 @@ import org.apache.accumulo.core.data.Key; import org.apache.accumulo.core.data.Mutation; import org.apache.accumulo.core.data.Value; import org.apache.accumulo.core.security.Authorizations; +import org.apache.accumulo.core.security.ColumnVisibility; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.hadoop.io.Text; import org.apache.log4j.Logger; @@ -74,7 +75,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; -import mvm.rya.api.resolver.RyaTypeResolverException; +import mvm.rya.indexing.accumulo.VisibilityBindingSet; import mvm.rya.indexing.external.tupleSet.BindingSetConverter.BindingSetConversionException; /** @@ -132,9 +133,9 @@ public class PcjTables { * * @param varOrder - An ordered array of Binding Set variables. (not null) */ - public VariableOrder(String... varOrder) { + public VariableOrder(final String... varOrder) { checkNotNull(varOrder); - this.variableOrder = ImmutableList.copyOf(varOrder); + variableOrder = ImmutableList.copyOf(varOrder); } /** @@ -142,9 +143,9 @@ public class PcjTables { * * @param varOrder - An ordered collection of Binding Set variables. (not null) */ - public VariableOrder(Collection<String> varOrder) { + public VariableOrder(final Collection<String> varOrder) { checkNotNull(varOrder); - this.variableOrder = ImmutableList.copyOf(varOrder); + variableOrder = ImmutableList.copyOf(varOrder); } /** @@ -152,9 +153,9 @@ public class PcjTables { * * @param varOrderString - The String representation of a VariableOrder. (not null) */ - public VariableOrder(String varOrderString) { + public VariableOrder(final String varOrderString) { checkNotNull(varOrderString); - this.variableOrder = ImmutableList.copyOf( varOrderString.split(VAR_ORDER_DELIM) ); + variableOrder = ImmutableList.copyOf( varOrderString.split(VAR_ORDER_DELIM) ); } /** @@ -168,7 +169,7 @@ public class PcjTables { * @return The variable order as an ordered array of Strings. This array is mutable. */ public String[] toArray() { - String[] array = new String[ variableOrder.size() ]; + final String[] array = new String[ variableOrder.size() ]; return variableOrder.toArray( array ); } @@ -183,11 +184,11 @@ public class PcjTables { } @Override - public boolean equals(Object o) { + public boolean equals(final Object o) { if(this == o) { return true; } else if(o instanceof VariableOrder) { - VariableOrder varOrder = (VariableOrder) o; + final VariableOrder varOrder = (VariableOrder) o; return variableOrder.equals( varOrder.variableOrder ); } return false; @@ -342,7 +343,7 @@ public class PcjTables { public static class ShiftVarOrderFactory implements PcjVarOrderFactory { @Override public Set<VariableOrder> makeVarOrders(final VariableOrder varOrder) { - Set<VariableOrder> varOrders = new HashSet<>(); + final Set<VariableOrder> varOrders = new HashSet<>(); final List<String> cyclicBuff = Lists.newArrayList( varOrder.getVariableOrders() ); final String[] varOrderBuff = new String[ cyclicBuff.size() ]; @@ -373,7 +374,7 @@ public class PcjTables { * * @param message - Describes why the exception is being thrown. */ - public PcjException(String message) { + public PcjException(final String message) { super(message); } @@ -383,7 +384,7 @@ public class PcjTables { * @param message - Describes why the exception is being thrown. * @param cause - The exception that caused this one to be thrown. */ - public PcjException(String message, Throwable cause) { + public PcjException(final String message, final Throwable cause) { super(message, cause); } } @@ -470,24 +471,24 @@ public class PcjTables { // SPARQL Query Mutation mutation = new Mutation(PCJ_METADATA_ROW_ID); - Value query = new Value( stringLexicoder.encode(metadata.getSparql()) ); + final Value query = new Value( stringLexicoder.encode(metadata.getSparql()) ); mutation.put(PCJ_METADATA_FAMILY, PCJ_METADATA_SPARQL_QUERY, query); mutations.add(mutation); // Cardinality mutation = new Mutation(PCJ_METADATA_ROW_ID); - Value cardinality = new Value( longLexicoder.encode(new Long(metadata.getCardinality())) ); + final Value cardinality = new Value( longLexicoder.encode(new Long(metadata.getCardinality())) ); mutation.put(PCJ_METADATA_FAMILY, PCJ_METADATA_CARDINALITY, cardinality); mutations.add(mutation); // Variable Orders - List<String> varOrderStrings = new ArrayList<>(); - for(VariableOrder varOrder : metadata.getVarOrders()) { + final List<String> varOrderStrings = new ArrayList<>(); + for(final VariableOrder varOrder : metadata.getVarOrders()) { varOrderStrings.add( varOrder.toString() ); } mutation = new Mutation(PCJ_METADATA_ROW_ID); - Value variableOrders = new Value( listLexicoder.encode(varOrderStrings) ); + final Value variableOrders = new Value( listLexicoder.encode(varOrderStrings) ); mutation.put(PCJ_METADATA_FAMILY, PCJ_METADATA_VARIABLE_ORDERS, variableOrders); mutations.add(mutation); @@ -512,7 +513,7 @@ public class PcjTables { try { // Create an Accumulo scanner that iterates through the metadata entries. - Scanner scanner = accumuloConn.createScanner(pcjTableName, new Authorizations()); + final Scanner scanner = accumuloConn.createScanner(pcjTableName, new Authorizations()); final Iterator<Entry<Key, Value>> entries = scanner.iterator(); // No metadata has been stored in the table yet. @@ -527,15 +528,15 @@ public class PcjTables { while(entries.hasNext()) { final Entry<Key, Value> entry = entries.next(); - Text columnQualifier = entry.getKey().getColumnQualifier(); - byte[] value = entry.getValue().get(); + final Text columnQualifier = entry.getKey().getColumnQualifier(); + final byte[] value = entry.getValue().get(); if(columnQualifier.equals(PCJ_METADATA_SPARQL_QUERY)) { sparql = stringLexicoder.decode(value); } else if(columnQualifier.equals(PCJ_METADATA_CARDINALITY)) { cardinality = longLexicoder.decode(value); } else if(columnQualifier.equals(PCJ_METADATA_VARIABLE_ORDERS)) { - for(String varOrderStr : listLexicoder.decode(value)) { + for(final String varOrderStr : listLexicoder.decode(value)) { varOrders.add( new VariableOrder(varOrderStr) ); } } @@ -543,7 +544,7 @@ public class PcjTables { return new PcjMetadata(sparql, cardinality, varOrders); - } catch (TableNotFoundException e) { + } catch (final TableNotFoundException e) { throw new PcjException("Could not add results to a PCJ because the PCJ table does not exist.", e); } } @@ -563,7 +564,7 @@ public class PcjTables { public void addResults( final Connector accumuloConn, final String pcjTableName, - final Collection<BindingSet> results) throws PcjException { + final Collection<VisibilityBindingSet> results) throws PcjException { checkNotNull(accumuloConn); checkNotNull(pcjTableName); checkNotNull(results); @@ -587,20 +588,20 @@ public class PcjTables { private void writeResults( final Connector accumuloConn, final String pcjTableName, - final Collection<BindingSet> results) throws PcjException { + final Collection<VisibilityBindingSet> results) throws PcjException { checkNotNull(accumuloConn); checkNotNull(pcjTableName); checkNotNull(results); // Fetch the variable orders from the PCJ table. - PcjMetadata metadata = getPcjMetadata(accumuloConn, pcjTableName); + final PcjMetadata metadata = getPcjMetadata(accumuloConn, pcjTableName); // Write each result formatted using each of the variable orders. BatchWriter writer = null; try { writer = accumuloConn.createBatchWriter(pcjTableName, new BatchWriterConfig()); - for(BindingSet result : results) { - Set<Mutation> addResultMutations = makeWriteResultMutations(metadata.getVarOrders(), result); + for(final VisibilityBindingSet result : results) { + final Set<Mutation> addResultMutations = makeWriteResultMutations(metadata.getVarOrders(), result); writer.addMutations( addResultMutations ); } } catch (TableNotFoundException | MutationsRejectedException e) { @@ -609,7 +610,7 @@ public class PcjTables { if(writer != null) { try { writer.close(); - } catch (MutationsRejectedException e) { + } catch (final MutationsRejectedException e) { throw new PcjException("Could not add results to a PCJ table because some of the mutations were rejected.", e); } } @@ -627,23 +628,24 @@ public class PcjTables { */ private static Set<Mutation> makeWriteResultMutations( final Set<VariableOrder> varOrders, - final BindingSet result) throws PcjException { + final VisibilityBindingSet result) throws PcjException { checkNotNull(varOrders); checkNotNull(result); - Set<Mutation> mutations = new HashSet<>(); - AccumuloPcjSerializer converter = new AccumuloPcjSerializer(); - + final Set<Mutation> mutations = new HashSet<>(); + final AccumuloPcjSerializer converter = new AccumuloPcjSerializer(); + for(final VariableOrder varOrder : varOrders) { try { // Serialize the result to the variable order. - byte[] serializedResult = converter.convert(result, varOrder); + final byte[] serializedResult = converter.convert(result, varOrder); // Row ID = binding set values, Column Family = variable order of the binding set. - Mutation addResult = new Mutation(serializedResult); - addResult.put(varOrder.toString(), "", ""); + final Mutation addResult = new Mutation(serializedResult); + final String visibility = result.getVisibility(); + addResult.put(varOrder.toString(), "", new ColumnVisibility(visibility), ""); mutations.add(addResult); - } catch(BindingSetConversionException e) { + } catch(final BindingSetConversionException e) { throw new PcjException("Could not serialize a result.", e); } } @@ -673,9 +675,9 @@ public class PcjTables { boolean updated = false; while(!updated) { // Write the conditional update request to Accumulo. - long cardinality = getPcjMetadata(accumuloConn, pcjTableName).getCardinality(); - ConditionalMutation mutation = makeUpdateCardinalityMutation(cardinality, delta); - ConditionalWriter.Result result = conditionalWriter.write(mutation); + final long cardinality = getPcjMetadata(accumuloConn, pcjTableName).getCardinality(); + final ConditionalMutation mutation = makeUpdateCardinalityMutation(cardinality, delta); + final ConditionalWriter.Result result = conditionalWriter.write(mutation); // Interpret the result. switch(result.getStatus()) { @@ -688,7 +690,7 @@ public class PcjTables { // We do not know if the mutation succeeded. At best, we can hope the metadata hasn't been updated // since we originally fetched it and try again. Otherwise, continue forwards as if it worked. It's // okay if this number is slightly off. - long newCardinality = getPcjMetadata(accumuloConn, pcjTableName).getCardinality(); + final long newCardinality = getPcjMetadata(accumuloConn, pcjTableName).getCardinality(); if(newCardinality != cardinality) { updated = true; } @@ -717,20 +719,20 @@ public class PcjTables { * @param delta - How much the cardinality will change. * @return The mutation that will perform the conditional update. */ - private static ConditionalMutation makeUpdateCardinalityMutation(long current, long delta) { + private static ConditionalMutation makeUpdateCardinalityMutation(final long current, final long delta) { // Try to update the cardinality by the delta. - ConditionalMutation mutation = new ConditionalMutation(PCJ_METADATA_ROW_ID); - Condition lastCardinalityStillCurrent = new Condition( + final ConditionalMutation mutation = new ConditionalMutation(PCJ_METADATA_ROW_ID); + final Condition lastCardinalityStillCurrent = new Condition( PCJ_METADATA_FAMILY, PCJ_METADATA_CARDINALITY); // Require the old cardinality to be the value we just read. - byte[] currentCardinalityBytes = longLexicoder.encode( current ); + final byte[] currentCardinalityBytes = longLexicoder.encode( current ); lastCardinalityStillCurrent.setValue( currentCardinalityBytes ); mutation.addCondition(lastCardinalityStillCurrent); // If that is the case, then update to the new value. - Value newCardinality = new Value( longLexicoder.encode(current + delta) ); + final Value newCardinality = new Value( longLexicoder.encode(current + delta) ); mutation.put(PCJ_METADATA_FAMILY, PCJ_METADATA_CARDINALITY, newCardinality); return mutation; } @@ -757,17 +759,17 @@ public class PcjTables { try { // Fetch the query that needs to be executed from the PCJ table. - PcjMetadata pcjMetadata = getPcjMetadata(accumuloConn, pcjTableName); - String sparql = pcjMetadata.getSparql(); + final PcjMetadata pcjMetadata = getPcjMetadata(accumuloConn, pcjTableName); + final String sparql = pcjMetadata.getSparql(); // Query Rya for results to the SPARQL query. - TupleQuery query = ryaConn.prepareTupleQuery(QueryLanguage.SPARQL, sparql); - TupleQueryResult results = query.evaluate(); + final TupleQuery query = ryaConn.prepareTupleQuery(QueryLanguage.SPARQL, sparql); + final TupleQueryResult results = query.evaluate(); // Load batches of 1000 of them at a time into the PCJ table - Set<BindingSet> batch = new HashSet<>(1000); + final Set<VisibilityBindingSet> batch = new HashSet<>(1000); while(results.hasNext()) { - batch.add( results.next() ); + batch.add( new VisibilityBindingSet(results.next()) ); if(batch.size() == 1000) { addResults(accumuloConn, pcjTableName, batch); @@ -819,8 +821,8 @@ public class PcjTables { checkNotNull(pcjVarOrderFactory); // Create the PCJ's variable orders. - PcjVarOrderFactory varOrderFactory = pcjVarOrderFactory.or(DEFAULT_VAR_ORDER_FACTORY); - Set<VariableOrder> varOrders = varOrderFactory.makeVarOrders( new VariableOrder(resultVariables) ); + final PcjVarOrderFactory varOrderFactory = pcjVarOrderFactory.or(DEFAULT_VAR_ORDER_FACTORY); + final Set<VariableOrder> varOrders = varOrderFactory.makeVarOrders( new VariableOrder(resultVariables) ); // Create the PCJ table in Accumulo. createPcjTable(accumuloConn, pcjTableName, varOrders, sparql); http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c53b5402/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/VisibilityBindingSetStringConverter.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/VisibilityBindingSetStringConverter.java b/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/VisibilityBindingSetStringConverter.java new file mode 100644 index 0000000..832186c --- /dev/null +++ b/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/VisibilityBindingSetStringConverter.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package mvm.rya.indexing.external.tupleSet; + +import javax.annotation.ParametersAreNonnullByDefault; + +import org.openrdf.query.BindingSet; + +import com.google.common.base.Strings; + +import mvm.rya.indexing.accumulo.VisibilityBindingSet; +import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder; + +/** + * Converts {@link BindingSet}s to Strings and back again. The Strings do not + * include the binding names and are ordered with a {@link VariableOrder}. + */ +@ParametersAreNonnullByDefault +public class VisibilityBindingSetStringConverter extends BindingSetStringConverter { + public static final char VISIBILITY_DELIM = 1; + + @Override + public String convert(final BindingSet bindingSet, final VariableOrder varOrder) { + String visibility = ""; + if(bindingSet instanceof VisibilityBindingSet) { + final VisibilityBindingSet visiSet = (VisibilityBindingSet) bindingSet; + if(!Strings.isNullOrEmpty(visiSet.getVisibility())) { + visibility = VISIBILITY_DELIM + visiSet.getVisibility(); + } + } + return super.convert(bindingSet, varOrder) + visibility; + } + + @Override + public BindingSet convert(final String bindingSetString, final VariableOrder varOrder) { + final String[] visiStrings = bindingSetString.split("" + VISIBILITY_DELIM); + BindingSet bindingSet = super.convert(visiStrings[0], varOrder); + + if(visiStrings.length > 1) { + bindingSet = new VisibilityBindingSet(bindingSet, visiStrings[1]); + } else { + bindingSet = new VisibilityBindingSet(bindingSet); + } + return bindingSet; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c53b5402/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/BindingSetStringConverterTest.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/BindingSetStringConverterTest.java b/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/BindingSetStringConverterTest.java index 725e557..dc24de0 100644 --- a/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/BindingSetStringConverterTest.java +++ b/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/BindingSetStringConverterTest.java @@ -49,7 +49,7 @@ public class BindingSetStringConverterTest { // Convert it to a String. final VariableOrder varOrder = new VariableOrder("y", "z", "x"); - BindingSetConverter<String> converter = new BindingSetStringConverter(); + final BindingSetConverter<String> converter = new BindingSetStringConverter(); final String bindingSetString = converter.convert(originalBindingSet, varOrder); // Ensure it converted to the expected result.l @@ -69,7 +69,7 @@ public class BindingSetStringConverterTest { // Convert it to a String. final VariableOrder varOrder = new VariableOrder("x"); - BindingSetConverter<String> converter = new BindingSetStringConverter(); + final BindingSetConverter<String> converter = new BindingSetStringConverter(); final String bindingSetString = converter.convert(originalBindingSet, varOrder); // Ensure it converted to the expected result. @@ -85,7 +85,7 @@ public class BindingSetStringConverterTest { // Convert it to a String. final VariableOrder varOrder = new VariableOrder("x"); - BindingSetConverter<String> converter = new BindingSetStringConverter(); + final BindingSetConverter<String> converter = new BindingSetStringConverter(); final String bindingSetString = converter.convert(originalBindingSet, varOrder); // Ensure it converted to the expected result. @@ -101,7 +101,7 @@ public class BindingSetStringConverterTest { // Convert it to a String. final VariableOrder varOrder = new VariableOrder("x"); - BindingSetConverter<String> converter = new BindingSetStringConverter(); + final BindingSetConverter<String> converter = new BindingSetStringConverter(); final String bindingSetString = converter.convert(originalBindingSet, varOrder); // Ensure it converted to the expected result. @@ -124,11 +124,11 @@ public class BindingSetStringConverterTest { final VariableOrder varOrder = new VariableOrder("x", "y"); // Create the String representation of the BindingSet. - BindingSetConverter<String> converter = new BindingSetStringConverter(); - String bindingSetString = converter.convert(originalBindingSet, varOrder); + final BindingSetConverter<String> converter = new BindingSetStringConverter(); + final String bindingSetString = converter.convert(originalBindingSet, varOrder); // Ensure the expected value was created. - String expected = + final String expected = "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" + "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI"; assertEquals(expected, bindingSetString); @@ -150,11 +150,11 @@ public class BindingSetStringConverterTest { final VariableOrder varOrder = new VariableOrder("x", "a", "y", "b"); // Create the String representation of the BindingSet. - BindingSetConverter<String> converter = new BindingSetStringConverter(); - String bindingSetString = converter.convert(originalBindingSet, varOrder); + final BindingSetConverter<String> converter = new BindingSetStringConverter(); + final String bindingSetString = converter.convert(originalBindingSet, varOrder); // Ensure the expected value was created. - String expected = + final String expected = "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" + BindingSetStringConverter.NULL_VALUE_STRING + ":::" + "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" + @@ -178,7 +178,7 @@ public class BindingSetStringConverterTest { final VariableOrder varOrder = new VariableOrder("x", "y"); // Create the String representation of the BindingSet. This will throw an exception. - BindingSetConverter<String> converter = new BindingSetStringConverter(); + final BindingSetConverter<String> converter = new BindingSetStringConverter(); converter.convert(originalBindingSet, varOrder); } @@ -192,7 +192,7 @@ public class BindingSetStringConverterTest { // Convert it to a BindingSet final VariableOrder varOrder = new VariableOrder("y", "z", "x"); - BindingSetConverter<String> converter = new BindingSetStringConverter(); + final BindingSetConverter<String> converter = new BindingSetStringConverter(); final BindingSet bindingSet = converter.convert(bindingSetString, varOrder); // Ensure it converted to the expected result. @@ -205,7 +205,7 @@ public class BindingSetStringConverterTest { } /** - * Ensures that when a binding set is converted from a String back to a + * Ensures that when a binding set is converted from a String back to a * BindingSet, null values do not get converted into Bindings. */ @Test @@ -216,27 +216,27 @@ public class BindingSetStringConverterTest { BindingSetStringConverter.NULL_VALUE_STRING + ":::" + "http://value 2<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" + BindingSetStringConverter.NULL_VALUE_STRING; - + // Convert it to a BindingSet - VariableOrder varOrder = new VariableOrder("x", "a", "y", "b"); - BindingSetConverter<String> converter = new BindingSetStringConverter(); - BindingSet bindingSet = converter.convert(bindingSetString, varOrder); - + final VariableOrder varOrder = new VariableOrder("x", "a", "y", "b"); + final BindingSetConverter<String> converter = new BindingSetStringConverter(); + final BindingSet bindingSet = converter.convert(bindingSetString, varOrder); + // Ensure it converted to the expected reuslt. final MapBindingSet expected = new MapBindingSet(); expected.addBinding("x", new URIImpl("http://value 1")); expected.addBinding("y", new URIImpl("http://value 2")); - + assertEquals(expected, bindingSet); } - + @Test public void fromString_Decimal() throws BindingSetConversionException { // Setup the String that will be converted. final String bindingSetString = "2.5<<~>>http://www.w3.org/2001/XMLSchema#decimal"; // Convert it to a BindingSet - BindingSetConverter<String> converter = new BindingSetStringConverter(); + final BindingSetConverter<String> converter = new BindingSetStringConverter(); final BindingSet bindingSet = converter.convert(bindingSetString, new VariableOrder("x")); // Ensure it converted to the expected result. @@ -252,7 +252,7 @@ public class BindingSetStringConverterTest { final String bindingSetString = "true<<~>>http://www.w3.org/2001/XMLSchema#boolean"; // Convert it to a BindingSet - BindingSetConverter<String> converter = new BindingSetStringConverter(); + final BindingSetConverter<String> converter = new BindingSetStringConverter(); final BindingSet bindingSet = converter.convert(bindingSetString, new VariableOrder("x")); // Ensure it converted to the expected result. @@ -268,7 +268,7 @@ public class BindingSetStringConverterTest { final String bindingSetString = "5<<~>>http://www.w3.org/2001/XMLSchema#integer"; // Convert it to a BindingSet - BindingSetConverter<String> converter = new BindingSetStringConverter(); + final BindingSetConverter<String> converter = new BindingSetStringConverter(); final BindingSet bindingSet = converter.convert(bindingSetString, new VariableOrder("x")); // Ensure it converted to the expected result. @@ -286,10 +286,10 @@ public class BindingSetStringConverterTest { "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI"; // This variable order is too short. - VariableOrder varOrder = new VariableOrder("x"); + final VariableOrder varOrder = new VariableOrder("x"); // The conversion should throw an exception. - BindingSetConverter<String> converter = new BindingSetStringConverter(); + final BindingSetConverter<String> converter = new BindingSetStringConverter(); converter.convert(bindingSetString, varOrder); } @@ -301,10 +301,10 @@ public class BindingSetStringConverterTest { "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI"; // This variable order is too long. - VariableOrder varOrder = new VariableOrder("x", "y", "z"); + final VariableOrder varOrder = new VariableOrder("x", "y", "z"); // The conversion should throw an exception. - BindingSetConverter<String> converter = new BindingSetStringConverter(); + final BindingSetConverter<String> converter = new BindingSetStringConverter(); converter.convert(bindingSetString, varOrder); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c53b5402/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/PcjTablesIntegrationTests.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/PcjTablesIntegrationTests.java b/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/PcjTablesIntegrationTests.java index bb21d33..c452aad 100644 --- a/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/PcjTablesIntegrationTests.java +++ b/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/PcjTablesIntegrationTests.java @@ -8,9 +8,9 @@ package mvm.rya.indexing.external.tupleSet; * 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 @@ -28,21 +28,6 @@ import java.util.HashSet; import java.util.Map.Entry; import java.util.Set; -import mvm.rya.accumulo.AccumuloRdfConfiguration; -import mvm.rya.accumulo.AccumuloRyaDAO; -import mvm.rya.api.RdfCloudTripleStoreConfiguration; -import mvm.rya.api.resolver.RyaTypeResolverException; -import mvm.rya.indexing.accumulo.ConfigUtils; -import mvm.rya.indexing.external.tupleSet.BindingSetConverter.BindingSetConversionException; -import mvm.rya.indexing.external.tupleSet.PcjTables.PcjException; -import mvm.rya.indexing.external.tupleSet.PcjTables.PcjMetadata; -import mvm.rya.indexing.external.tupleSet.PcjTables.PcjTableNameFactory; -import mvm.rya.indexing.external.tupleSet.PcjTables.PcjVarOrderFactory; -import mvm.rya.indexing.external.tupleSet.PcjTables.ShiftVarOrderFactory; -import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder; -import mvm.rya.rdftriplestore.RdfCloudTripleStore; -import mvm.rya.rdftriplestore.RyaSailRepository; - import org.apache.accumulo.core.client.AccumuloException; import org.apache.accumulo.core.client.AccumuloSecurityException; import org.apache.accumulo.core.client.Connector; @@ -77,6 +62,21 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import com.google.common.io.Files; +import mvm.rya.accumulo.AccumuloRdfConfiguration; +import mvm.rya.accumulo.AccumuloRyaDAO; +import mvm.rya.api.RdfCloudTripleStoreConfiguration; +import mvm.rya.indexing.accumulo.ConfigUtils; +import mvm.rya.indexing.accumulo.VisibilityBindingSet; +import mvm.rya.indexing.external.tupleSet.BindingSetConverter.BindingSetConversionException; +import mvm.rya.indexing.external.tupleSet.PcjTables.PcjException; +import mvm.rya.indexing.external.tupleSet.PcjTables.PcjMetadata; +import mvm.rya.indexing.external.tupleSet.PcjTables.PcjTableNameFactory; +import mvm.rya.indexing.external.tupleSet.PcjTables.PcjVarOrderFactory; +import mvm.rya.indexing.external.tupleSet.PcjTables.ShiftVarOrderFactory; +import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder; +import mvm.rya.rdftriplestore.RdfCloudTripleStore; +import mvm.rya.rdftriplestore.RyaSailRepository; + /** * Performs integration test using {@link MiniAccumuloCluster} to ensure the * functions of {@link PcjTables} work within a cluster setting. @@ -85,7 +85,7 @@ public class PcjTablesIntegrationTests { private static final Logger log = Logger.getLogger(PcjTablesIntegrationTests.class); private static final AccumuloPcjSerializer converter = new AccumuloPcjSerializer(); - + protected static final String RYA_TABLE_PREFIX = "demo_"; // Rya data store and connections. @@ -122,8 +122,8 @@ public class PcjTablesIntegrationTests { // Create a PCJ table in the Mini Accumulo. final String pcjTableName = new PcjTableNameFactory().makeTableName(RYA_TABLE_PREFIX, "testPcj"); - Set<VariableOrder> varOrders = new ShiftVarOrderFactory().makeVarOrders(new VariableOrder("name;age")); - PcjTables pcjs = new PcjTables(); + final Set<VariableOrder> varOrders = new ShiftVarOrderFactory().makeVarOrders(new VariableOrder("name;age")); + final PcjTables pcjs = new PcjTables(); pcjs.createPcjTable(accumuloConn, pcjTableName, varOrders, sparql); // Fetch the PcjMetadata and ensure it has the correct values. @@ -151,35 +151,38 @@ public class PcjTablesIntegrationTests { // Create a PCJ table in the Mini Accumulo. final String pcjTableName = new PcjTableNameFactory().makeTableName(RYA_TABLE_PREFIX, "testPcj"); - Set<VariableOrder> varOrders = new ShiftVarOrderFactory().makeVarOrders(new VariableOrder("name;age")); - PcjTables pcjs = new PcjTables(); + final Set<VariableOrder> varOrders = new ShiftVarOrderFactory().makeVarOrders(new VariableOrder("name;age")); + final PcjTables pcjs = new PcjTables(); pcjs.createPcjTable(accumuloConn, pcjTableName, varOrders, sparql); // Add a few results to the PCJ table. - MapBindingSet alice = new MapBindingSet(); + final MapBindingSet alice = new MapBindingSet(); alice.addBinding("name", new URIImpl("http://Alice")); alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); - MapBindingSet bob = new MapBindingSet(); + final MapBindingSet bob = new MapBindingSet(); bob.addBinding("name", new URIImpl("http://Bob")); bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); - MapBindingSet charlie = new MapBindingSet(); + final MapBindingSet charlie = new MapBindingSet(); charlie.addBinding("name", new URIImpl("http://Charlie")); charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER)); - Set<BindingSet> results = Sets.<BindingSet>newHashSet(alice, bob, charlie); - pcjs.addResults(accumuloConn, pcjTableName, results); + final Set<BindingSet> results = Sets.<BindingSet>newHashSet(alice, bob, charlie); + pcjs.addResults(accumuloConn, pcjTableName, Sets.<VisibilityBindingSet>newHashSet( + new VisibilityBindingSet(alice), + new VisibilityBindingSet(bob), + new VisibilityBindingSet(charlie))); // Make sure the cardinality was updated. - PcjMetadata metadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName); + final PcjMetadata metadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName); assertEquals(3, metadata.getCardinality()); // Scan Accumulo for the stored results. - Multimap<String, BindingSet> fetchedResults = loadPcjResults(accumuloConn, pcjTableName); + final Multimap<String, BindingSet> fetchedResults = loadPcjResults(accumuloConn, pcjTableName); // Ensure the expected results match those that were stored. - Multimap<String, BindingSet> expectedResults = HashMultimap.create(); + final Multimap<String, BindingSet> expectedResults = HashMultimap.create(); expectedResults.putAll("name;age", results); expectedResults.putAll("age;name", results); assertEquals(expectedResults, fetchedResults); @@ -194,7 +197,7 @@ public class PcjTablesIntegrationTests { @Test public void populatePcj() throws RepositoryException, PcjException, TableNotFoundException, BindingSetConversionException { // Load some Triples into Rya. - Set<Statement> triples = new HashSet<>(); + final Set<Statement> triples = new HashSet<>(); triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) ); triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) ); @@ -204,7 +207,7 @@ public class PcjTablesIntegrationTests { triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) ); triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - for(Statement triple : triples) { + for(final Statement triple : triples) { ryaConn.add(triple); } @@ -218,36 +221,36 @@ public class PcjTablesIntegrationTests { "}"; final String pcjTableName = new PcjTableNameFactory().makeTableName(RYA_TABLE_PREFIX, "testPcj"); - Set<VariableOrder> varOrders = new ShiftVarOrderFactory().makeVarOrders(new VariableOrder("name;age")); - PcjTables pcjs = new PcjTables(); + final Set<VariableOrder> varOrders = new ShiftVarOrderFactory().makeVarOrders(new VariableOrder("name;age")); + final PcjTables pcjs = new PcjTables(); pcjs.createPcjTable(accumuloConn, pcjTableName, varOrders, sparql); // Populate the PCJ table using a Rya connection. pcjs.populatePcj(accumuloConn, pcjTableName, ryaConn); // Scan Accumulo for the stored results. - Multimap<String, BindingSet> fetchedResults = loadPcjResults(accumuloConn, pcjTableName); + final Multimap<String, BindingSet> fetchedResults = loadPcjResults(accumuloConn, pcjTableName); // Make sure the cardinality was updated. - PcjMetadata metadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName); + final PcjMetadata metadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName); assertEquals(3, metadata.getCardinality()); // Ensure the expected results match those that were stored. - MapBindingSet alice = new MapBindingSet(); + final MapBindingSet alice = new MapBindingSet(); alice.addBinding("name", new URIImpl("http://Alice")); alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); - MapBindingSet bob = new MapBindingSet(); + final MapBindingSet bob = new MapBindingSet(); bob.addBinding("name", new URIImpl("http://Bob")); bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); - MapBindingSet charlie = new MapBindingSet(); + final MapBindingSet charlie = new MapBindingSet(); charlie.addBinding("name", new URIImpl("http://Charlie")); charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER)); - Set<BindingSet> results = Sets.<BindingSet>newHashSet(alice, bob, charlie); + final Set<BindingSet> results = Sets.<BindingSet>newHashSet(alice, bob, charlie); - Multimap<String, BindingSet> expectedResults = HashMultimap.create(); + final Multimap<String, BindingSet> expectedResults = HashMultimap.create(); expectedResults.putAll("name;age", results); expectedResults.putAll("age;name", results); assertEquals(expectedResults, fetchedResults); @@ -262,7 +265,7 @@ public class PcjTablesIntegrationTests { @Test public void createAndPopulatePcj() throws RepositoryException, PcjException, TableNotFoundException, BindingSetConversionException { // Load some Triples into Rya. - Set<Statement> triples = new HashSet<>(); + final Set<Statement> triples = new HashSet<>(); triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) ); triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) ); @@ -272,7 +275,7 @@ public class PcjTablesIntegrationTests { triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) ); triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - for(Statement triple : triples) { + for(final Statement triple : triples) { ryaConn.add(triple); } @@ -288,32 +291,32 @@ public class PcjTablesIntegrationTests { final String pcjTableName = new PcjTableNameFactory().makeTableName(RYA_TABLE_PREFIX, "testPcj"); // Create and populate the PCJ table. - PcjTables pcjs = new PcjTables(); + final PcjTables pcjs = new PcjTables(); pcjs.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent()); // Make sure the cardinality was updated. - PcjMetadata metadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName); + final PcjMetadata metadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName); assertEquals(3, metadata.getCardinality()); // Scan Accumulo for the stored results. - Multimap<String, BindingSet> fetchedResults = loadPcjResults(accumuloConn, pcjTableName); + final Multimap<String, BindingSet> fetchedResults = loadPcjResults(accumuloConn, pcjTableName); // Ensure the expected results match those that were stored. - MapBindingSet alice = new MapBindingSet(); + final MapBindingSet alice = new MapBindingSet(); alice.addBinding("name", new URIImpl("http://Alice")); alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); - MapBindingSet bob = new MapBindingSet(); + final MapBindingSet bob = new MapBindingSet(); bob.addBinding("name", new URIImpl("http://Bob")); bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); - MapBindingSet charlie = new MapBindingSet(); + final MapBindingSet charlie = new MapBindingSet(); charlie.addBinding("name", new URIImpl("http://Charlie")); charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER)); - Set<BindingSet> results = Sets.<BindingSet>newHashSet(alice, bob, charlie); + final Set<BindingSet> results = Sets.<BindingSet>newHashSet(alice, bob, charlie); - Multimap<String, BindingSet> expectedResults = HashMultimap.create(); + final Multimap<String, BindingSet> expectedResults = HashMultimap.create(); expectedResults.putAll("name;age", results); expectedResults.putAll("age;name", results); @@ -325,21 +328,21 @@ public class PcjTablesIntegrationTests { * multimap stores a set of deserialized binding sets that were in the PCJ * table for every variable order that is found in the PCJ metadata. */ - private static Multimap<String, BindingSet> loadPcjResults(Connector accumuloConn, String pcjTableName) throws PcjException, TableNotFoundException, BindingSetConversionException { - Multimap<String, BindingSet> fetchedResults = HashMultimap.create(); + private static Multimap<String, BindingSet> loadPcjResults(final Connector accumuloConn, final String pcjTableName) throws PcjException, TableNotFoundException, BindingSetConversionException { + final Multimap<String, BindingSet> fetchedResults = HashMultimap.create(); // Get the variable orders the data was written to. - PcjTables pcjs = new PcjTables(); - PcjMetadata pcjMetadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName); + final PcjTables pcjs = new PcjTables(); + final PcjMetadata pcjMetadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName); // Scan Accumulo for the stored results. - for(VariableOrder varOrder : pcjMetadata.getVarOrders()) { - Scanner scanner = accumuloConn.createScanner(pcjTableName, new Authorizations()); + for(final VariableOrder varOrder : pcjMetadata.getVarOrders()) { + final Scanner scanner = accumuloConn.createScanner(pcjTableName, new Authorizations()); scanner.fetchColumnFamily( new Text(varOrder.toString()) ); - for(Entry<Key, Value> entry : scanner) { - byte[] serializedResult = entry.getKey().getRow().getBytes(); - BindingSet result = converter.convert(serializedResult, varOrder); + for(final Entry<Key, Value> entry : scanner) { + final byte[] serializedResult = entry.getKey().getRow().getBytes(); + final BindingSet result = converter.convert(serializedResult, varOrder); fetchedResults.put(varOrder.toString(), result); } } http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c53b5402/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/VisibilityBindingSetStringConverterTest.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/VisibilityBindingSetStringConverterTest.java b/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/VisibilityBindingSetStringConverterTest.java new file mode 100644 index 0000000..ccd27ac --- /dev/null +++ b/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/VisibilityBindingSetStringConverterTest.java @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package mvm.rya.indexing.external.tupleSet; + +import static mvm.rya.indexing.external.tupleSet.VisibilityBindingSetStringConverter.VISIBILITY_DELIM; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.openrdf.model.impl.URIImpl; +import org.openrdf.query.BindingSet; +import org.openrdf.query.impl.MapBindingSet; + +import mvm.rya.indexing.accumulo.VisibilityBindingSet; +import mvm.rya.indexing.external.tupleSet.BindingSetConverter.BindingSetConversionException; +import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder; + +/** + * Tests the methods of {@link BindingSetStringConverter}. + */ +public class VisibilityBindingSetStringConverterTest { + @Test + public void toString_URIs() throws BindingSetConversionException { + // Setup the binding set that will be converted. + final MapBindingSet originalBindingSet = new MapBindingSet(); + originalBindingSet.addBinding("x", new URIImpl("http://a")); + originalBindingSet.addBinding("y", new URIImpl("http://b")); + originalBindingSet.addBinding("z", new URIImpl("http://c")); + + final VisibilityBindingSet visiSet = new VisibilityBindingSet(originalBindingSet, "A&B&C"); + + // Convert it to a String. + final VariableOrder varOrder = new VariableOrder("y", "z", "x"); + final VisibilityBindingSetStringConverter converter = new VisibilityBindingSetStringConverter(); + final String bindingSetString = converter.convert(visiSet, varOrder); + + // Ensure it converted to the expected result.l + final String expected = + "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" + + "http://c<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" + + "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI" + + VISIBILITY_DELIM + "A&B&C"; + + assertEquals(expected, bindingSetString); + } + + @Test + public void fromString() throws BindingSetConversionException { + // Setup the String that will be converted. + final String bindingSetString = + "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" + + "http://c<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" + + "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI" + + VISIBILITY_DELIM + "A&B"; + + // Convert it to a BindingSet + final VariableOrder varOrder = new VariableOrder("y", "z", "x"); + final VisibilityBindingSetStringConverter converter = new VisibilityBindingSetStringConverter(); + final BindingSet bindingSet = converter.convert(bindingSetString, varOrder); + + // Ensure it converted to the expected result. + final MapBindingSet expected = new MapBindingSet(); + expected.addBinding("z", new URIImpl("http://c")); + expected.addBinding("y", new URIImpl("http://b")); + expected.addBinding("x", new URIImpl("http://a")); + final VisibilityBindingSet visiSet = new VisibilityBindingSet(expected, "A&B"); + + assertEquals(visiSet, bindingSet); + } + + @Test + public void toString_URIs_noVisi() throws BindingSetConversionException { + // Setup the binding set that will be converted. + final MapBindingSet originalBindingSet = new MapBindingSet(); + originalBindingSet.addBinding("x", new URIImpl("http://a")); + originalBindingSet.addBinding("y", new URIImpl("http://b")); + originalBindingSet.addBinding("z", new URIImpl("http://c")); + + final VisibilityBindingSet visiSet = new VisibilityBindingSet(originalBindingSet); + + // Convert it to a String. + final VariableOrder varOrder = new VariableOrder("y", "z", "x"); + final VisibilityBindingSetStringConverter converter = new VisibilityBindingSetStringConverter(); + final String bindingSetString = converter.convert(visiSet, varOrder); + + // Ensure it converted to the expected result.l + final String expected = + "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" + + "http://c<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" + + "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI"; + + assertEquals(expected, bindingSetString); + } + + @Test + public void fromString_noVisi() throws BindingSetConversionException { + // Setup the String that will be converted. + final String bindingSetString = + "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" + + "http://c<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" + + "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI"; + + // Convert it to a BindingSet + final VariableOrder varOrder = new VariableOrder("y", "z", "x"); + final VisibilityBindingSetStringConverter converter = new VisibilityBindingSetStringConverter(); + final BindingSet bindingSet = converter.convert(bindingSetString, varOrder); + + // Ensure it converted to the expected result. + final MapBindingSet expected = new MapBindingSet(); + expected.addBinding("z", new URIImpl("http://c")); + expected.addBinding("y", new URIImpl("http://b")); + expected.addBinding("x", new URIImpl("http://a")); + final VisibilityBindingSet visiSet = new VisibilityBindingSet(expected); + + assertEquals(visiSet, bindingSet); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c53b5402/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreatePcj.java ---------------------------------------------------------------------- diff --git a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreatePcj.java b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreatePcj.java index 12e32b6..58e2f9a 100644 --- a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreatePcj.java +++ b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreatePcj.java @@ -232,7 +232,7 @@ public class CreatePcj { checkNotNull(spMetadata); checkNotNull(batch); - BindingSetStringConverter converter = new BindingSetStringConverter(); + final BindingSetStringConverter converter = new BindingSetStringConverter(); try(TypedTransaction tx = STRING_TYPED_LAYER.wrap(fluo.newTransaction())) { // Get the node's variable order. @@ -240,13 +240,13 @@ public class CreatePcj { final VariableOrder varOrder = spMetadata.getVariableOrder(); for(final BindingSet bindingSet : batch) { - MapBindingSet spBindingSet = new MapBindingSet(); - for(String var : varOrder) { - Binding binding = bindingSet.getBinding(var); + final MapBindingSet spBindingSet = new MapBindingSet(); + for(final String var : varOrder) { + final Binding binding = bindingSet.getBinding(var); spBindingSet.addBinding(binding); } - String bindingSetStr = converter.convert(spBindingSet, varOrder); + final String bindingSetStr = converter.convert(spBindingSet, varOrder); // Write the binding set entry to Fluo for the statement pattern. tx.mutate().row(spNodeId + NODEID_BS_DELIM + bindingSetStr) http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c53b5402/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/InsertTriples.java ---------------------------------------------------------------------- diff --git a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/InsertTriples.java b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/InsertTriples.java index 02e871f..092ad9c 100644 --- a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/InsertTriples.java +++ b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/InsertTriples.java @@ -28,7 +28,11 @@ import org.apache.log4j.Logger; import org.apache.rya.indexing.pcj.fluo.app.StringTypeLayer; import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns; +import com.google.common.base.Optional; + import io.fluo.api.client.FluoClient; +import io.fluo.api.types.Encoder; +import io.fluo.api.types.StringEncoder; import io.fluo.api.types.TypedTransaction; import mvm.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT; import mvm.rya.api.domain.RyaStatement; @@ -53,14 +57,17 @@ public class InsertTriples { */ private static final WholeRowTripleResolver TRIPLE_RESOLVER = new WholeRowTripleResolver(); + private static final Encoder ENCODER = new StringEncoder(); + /** * Inserts a triple into Fluo. * * @param fluo - A connection to the Fluo table that will be updated. (not null) * @param triple - The triple to insert. (not null) + * @param visibility - The visibility/permissions required to view this triple once stored. (not null) */ - public void insert(final FluoClient fluo, final RyaStatement triple) { - insert(fluo, Collections.singleton(triple)); + public void insert(final FluoClient fluo, final RyaStatement triple, final Optional<String> visibility) { + insert(fluo, Collections.singleton(triple), visibility); } /** @@ -68,15 +75,18 @@ public class InsertTriples { * * @param fluo - A connection to the Fluo table that will be updated. (not null) * @param triples - The triples to insert. (not null) + * @param visibility - The visibility/permissions required to view the triples once stored. + * Note: The same visibility will be applied to each triple.(not null) */ - public void insert(final FluoClient fluo, final Collection<RyaStatement> triples) { + public void insert(final FluoClient fluo, final Collection<RyaStatement> triples, final Optional<String> visibility) { checkNotNull(fluo); checkNotNull(triples); + checkNotNull(visibility); try(TypedTransaction tx = STRING_TYPED_LAYER.wrap(fluo.newTransaction())) { for(final RyaStatement triple : triples) { try { - tx.mutate().row(spoFormat(triple)).col(FluoQueryColumns.TRIPLES).set(); + tx.mutate().row(spoFormat(triple)).col(FluoQueryColumns.TRIPLES).set(ENCODER.encode(visibility.or(""))); } catch (final TripleRowResolverException e) { log.error("Could not convert a Triple into the SPO format: " + triple); } http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c53b5402/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FilterResultUpdater.java ---------------------------------------------------------------------- diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FilterResultUpdater.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FilterResultUpdater.java index 3af079f..fc88a3c 100644 --- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FilterResultUpdater.java +++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FilterResultUpdater.java @@ -50,8 +50,10 @@ import io.fluo.api.data.Bytes; import io.fluo.api.data.Column; import io.fluo.api.types.Encoder; import io.fluo.api.types.StringEncoder; +import mvm.rya.indexing.accumulo.VisibilityBindingSet; import mvm.rya.indexing.external.tupleSet.BindingSetStringConverter; import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder; +import mvm.rya.indexing.external.tupleSet.VisibilityBindingSetStringConverter; /** * Updates the results of a Filter node when its child has added a new Binding @@ -60,9 +62,10 @@ import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder; @ParametersAreNonnullByDefault public class FilterResultUpdater { - private final Encoder encoder = new StringEncoder(); + private static final Encoder ENCODER = new StringEncoder(); - private final BindingSetStringConverter converter = new BindingSetStringConverter(); + private static final BindingSetStringConverter ID_CONVERTER = new BindingSetStringConverter(); + private static final VisibilityBindingSetStringConverter VALUE_CONVERTER = new VisibilityBindingSetStringConverter(); /** * A utility class used to search SPARQL queries for Filters. @@ -102,7 +105,7 @@ public class FilterResultUpdater { */ public void updateFilterResults( final TransactionBase tx, - final BindingSet childBindingSet, + final VisibilityBindingSet childBindingSet, final FilterMetadata filterMetadata) throws Exception { checkNotNull(tx); checkNotNull(childBindingSet); @@ -126,11 +129,14 @@ public class FilterResultUpdater { filterBindingSet.addBinding(binding); } } - final String filterBindingSetString = converter.convert(filterBindingSet, filterVarOrder); - final Bytes row = encoder.encode( filterMetadata.getNodeId() + NODEID_BS_DELIM + filterBindingSetString ); + final String filterBindingSetIdString = ID_CONVERTER.convert(filterBindingSet, filterVarOrder); + String filterBindingSetValueString = ""; + filterBindingSetValueString = VALUE_CONVERTER.convert(childBindingSet, filterVarOrder); + + final Bytes row = ENCODER.encode( filterMetadata.getNodeId() + NODEID_BS_DELIM + filterBindingSetIdString ); final Column col = FluoQueryColumns.FILTER_BINDING_SET; - final Bytes value = encoder.encode(filterBindingSetString); + final Bytes value = ENCODER.encode(filterBindingSetValueString); tx.set(row, col, value); } } http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c53b5402/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/IncUpdateDAO.java ---------------------------------------------------------------------- diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/IncUpdateDAO.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/IncUpdateDAO.java index 5cb9869..5bc9d0a 100644 --- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/IncUpdateDAO.java +++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/IncUpdateDAO.java @@ -44,7 +44,7 @@ public class IncUpdateDAO { private static final StringTypeLayer stl = new StringTypeLayer(); private static final WholeRowTripleResolver tr = new WholeRowTripleResolver(); - private static RyaStatement deserializeTriple(final Bytes row) { + public static RyaStatement deserializeTriple(final Bytes row) { final byte[] rowArray = row.toArray(); RyaStatement rs = null;
