blob: e0b5df9ae5e3e25c2677dd6965293e48e3b1352a [file] [log] [blame]
package org.apache.rya.indexing.pcj.fluo.app;
/*
* 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.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import org.apache.rya.api.domain.RyaStatement;
import org.apache.rya.api.model.VisibilityBindingSet;
import org.eclipse.rdf4j.model.BNode;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
import org.eclipse.rdf4j.query.algebra.StatementPattern;
import com.google.common.base.Preconditions;
/**
* Creates a construct query graph (represented as a Set of
* {@link RyaStatement}s with Binding names subject, predicate, object) from a
* given BindingSet and the underlying {@link ConstructProjection}s.
*
*/
public class ConstructGraph {
private Set<ConstructProjection> projections;
private Set<String> bNodeNames;
/**
* Creates a ConstructGraph from the specified collection of {@link ConstructProjection}s.
* @param projections - ConstructProjections used to create a ConstructGraph
*/
public ConstructGraph(Set<ConstructProjection> projections) {
Preconditions.checkNotNull(projections);
Preconditions.checkArgument(projections.size() > 0);
this.projections = projections;
this.bNodeNames = getBNodeNames(projections);
}
/**
* Creates a ConstructGraph from the given Collection of {@link StatementPattern}s.
* @param patterns - StatementPatterns used to create a ConstructGraph
*/
public ConstructGraph(Collection<StatementPattern> patterns) {
Preconditions.checkNotNull(patterns);
Preconditions.checkArgument(patterns.size() > 0);
Set<ConstructProjection> projections = new HashSet<>();
for(StatementPattern pattern: patterns) {
projections.add(new ConstructProjection(pattern));
}
this.projections = projections;
this.bNodeNames = getBNodeNames(projections);
}
private Set<String> getBNodeNames(Set<ConstructProjection> projections) {
Set<String> bNodeNames = new HashSet<>();
for (ConstructProjection projection : projections) {
Optional<Value> optVal = projection.getSubjValue();
if (optVal.isPresent() && optVal.get() instanceof BNode) {
bNodeNames.add(projection.getSubjectSourceName());
}
}
return bNodeNames;
}
private Map<String, BNode> getBNodeMap() {
Map<String, BNode> bNodeMap = new HashMap<>();
for(String name: bNodeNames) {
bNodeMap.put(name, SimpleValueFactory.getInstance().createBNode(UUID.randomUUID().toString()));
}
return bNodeMap;
}
/**
* @return - the {@link ConstructProjection}s used to build the construct graph
* returned by {@link ConstructGraph#createGraphFromBindingSet(VisibilityBindingSet)}.
*/
public Set<ConstructProjection> getProjections() {
return projections;
}
/**
* Creates a construct query graph represented as a Set of {@link RyaStatement}s
* @param bs - VisibilityBindingSet used to build statement BindingSets
* @return - Set of RyaStatements that represent a construct query graph.
*/
public Set<RyaStatement> createGraphFromBindingSet(VisibilityBindingSet bs) {
Set<RyaStatement> bSets = new HashSet<>();
long ts = System.currentTimeMillis();
Map<String, BNode> bNodes = getBNodeMap();
for(ConstructProjection projection: projections) {
RyaStatement statement = projection.projectBindingSet(bs, bNodes);
//ensure that all RyaStatements in graph have the same timestamp
statement.setTimestamp(ts);
bSets.add(statement);
}
return bSets;
}
@Override
public boolean equals(Object o) {
if(this == o) {
return true;
}
if(o instanceof ConstructGraph) {
ConstructGraph graph = (ConstructGraph) o;
return this.projections.equals(graph.projections);
}
return false;
}
@Override
public int hashCode() {
int hash = 17;
for(ConstructProjection projection: projections) {
hash += projection.hashCode();
}
return hash;
}
}