blob: e57ec8834849e04344fd2ebf65056f39f9b4fca3 [file] [log] [blame]
package org.apache.rya.indexing.pcj.fluo.app.batch;
/*
* 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.Objects;
import org.apache.fluo.api.data.Column;
import org.apache.fluo.api.data.Span;
import org.apache.rya.api.function.join.LazyJoiningIterator.Side;
import org.apache.rya.api.model.VisibilityBindingSet;
import org.apache.rya.indexing.pcj.fluo.app.query.JoinMetadata.JoinType;
import org.eclipse.rdf4j.query.Binding;
/**
* This class updates join results based on parameters specified for the join's
* children. The join has two children, and for one child a VisibilityBindingSet
* is specified along with the Side of that child. This BindingSet represents an
* update to that join child. For the other child, a Span, Column and
* VariableOrder are specified. This is so that the sibling node (the node that
* wasn't updated) can be scanned to obtain results that can be joined with the
* VisibilityBindingSet. The assumption here is that the Span is derived from
* the {@link Binding}s of common variables between the join children. This class
* represents a batch order to perform a given task on join BindingSet results.
* The {@link Task} is to Add, Delete, or Update. This batch order is processed
* by the {@link BatchObserver} and used with the nodeId provided to the
* Observer to process the Task specified by the batch order. If the Task is to
* add, the BatchBindingSetUpdater returned by
* {@link JoinBatchInformation#getBatchUpdater()} will scan the join's child for
* results using the indicated Span and Column. These results are joined with
* the indicated VisibilityBindingSet, and the results are added to the parent
* join. The other Tasks are performed analogously.
*
*/
public class JoinBatchInformation extends AbstractSpanBatchInformation {
private static final BatchBindingSetUpdater updater = new JoinBatchBindingSetUpdater();
private final VisibilityBindingSet bs; //update for join child indicated by side
private final Side side; //join child that was updated by bs
private final JoinType join;
/**
* @param batchSize - batch size that Tasks are performed in
* @param task - Add, Delete, or Update
* @param column - Column of join child to be scanned
* @param span - span of join child to be scanned (derived from common variables of left and right join children)
* @param bs - BindingSet to be joined with results of child scan
* @param side - The side of the child that the VisibilityBindingSet update occurred at
* @param join - JoinType (left, right, natural inner)
*/
public JoinBatchInformation(final int batchSize, final Task task, final Column column, final Span span, final VisibilityBindingSet bs, final Side side, final JoinType join) {
super(batchSize, task, column, span);
this.bs = Objects.requireNonNull(bs);
this.side = Objects.requireNonNull(side);
this.join = Objects.requireNonNull(join);
}
public JoinBatchInformation(final Task task, final Column column, final Span span, final VisibilityBindingSet bs, final Side side, final JoinType join) {
this(DEFAULT_BATCH_SIZE, task, column, span, bs, side, join);
}
/**
* Indicates the join child that the BindingSet result {@link JoinBatchInformation#getBs()} updated.
* This BindingSet is join with the results obtained by scanning over the value of {@link JoinBatchInformation#getSpan()}.
* @return {@link Side} indicating which side new result occurred on in join
*/
public Side getSide() {
return side;
}
/**
* @return {@link JoinType} indicating type of join (left join, right join, natural inner join,...)
*/
public JoinType getJoinType() {
return join;
}
/**
* Sets the VisibilityBindingSet that represents an update to the join child. The join child
* updated is indicated by the value of {@link JoinBatchInformation#getSide()}.
* @return VisibilityBindingSet that will be joined with results returned by scan over given
* {@link Span}.
*/
public VisibilityBindingSet getBs() {
return bs;
}
/**
* @return BatchBindingSetUpdater used to apply {@link Task} to results formed by joining the given
* VisibilityBindingSet with the results returned by scanned over the Span.
*/
@Override
public BatchBindingSetUpdater getBatchUpdater() {
return updater;
}
@Override
public String toString() {
return new StringBuilder()
.append("Span Batch Information {\n")
.append(" Batch Size: " + super.getBatchSize() + "\n")
.append(" Task: " + super.getTask() + "\n")
.append(" Column: " + super.getColumn() + "\n")
.append(" Join Type: " + join + "\n")
.append(" Join Side: " + side + "\n")
.append(" Binding Set: " + bs + "\n")
.append("}")
.toString();
}
@Override
public boolean equals(final Object other) {
if (this == other) {
return true;
}
if (!(other instanceof JoinBatchInformation)) {
return false;
}
final JoinBatchInformation batch = (JoinBatchInformation) other;
return super.equals(other) && Objects.equals(bs, batch.bs) && Objects.equals(join, batch.join)
&& Objects.equals(side, batch.side);
}
@Override
public int hashCode() {
return Objects.hash(super.getBatchSize(), super.getColumn(), super.getSpan(), super.getTask(), bs, join, side);
}
public static Builder builder() {
return new Builder();
}
public static class Builder {
private int batchSize = DEFAULT_BATCH_SIZE;
private Task task;
private Column column;
private Span span;
private VisibilityBindingSet bs;
private JoinType join;
private Side side;
/**
* @param batchSize - batch size that {@link Task}s are performed in
*/
public Builder setBatchSize(final int batchSize) {
this.batchSize = batchSize;
return this;
}
/**
* @param task - Task performed (Add, Delete, Update)
*/
public Builder setTask(final Task task) {
this.task = task;
return this;
}
/**
* @param column - Column of join child to be scanned
*/
public Builder setColumn(final Column column) {
this.column = column;
return this;
}
/**
* Span to scan results for one child of the join. The Span corresponds to the side of
* the join that is not indicated by Side. So if Side is Left, then the
* Span will scan the right child of the join. It is assumed that the span is derived from
* the common variables of the left and right join children.
* @param span - Span over join child to be scanned
*/
public Builder setSpan(final Span span) {
this.span = span;
return this;
}
/**
* Sets the BindingSet that corresponds to an update to the join child indicated
* by Side.
* @param bs - BindingSet update of join child to be joined with results of scan
*/
public Builder setBs(final VisibilityBindingSet bs) {
this.bs = bs;
return this;
}
/**
* @param join - JoinType (left, right, natural inner)
*/
public Builder setJoinType(final JoinType join) {
this.join = join;
return this;
}
/**
* Indicates the join child corresponding to the VisibilityBindingSet update
* @param side - side of join the child BindingSet update appeared at
*/
public Builder setSide(final Side side) {
this.side = side;
return this;
}
/**
* @return an instance of {@link JoinBatchInformation} constructed from the parameters passed to this Builder
*/
public JoinBatchInformation build() {
return new JoinBatchInformation(batchSize, task, column, span, bs, side, join);
}
}
}