blob: 61ebcc60db6f83249219f142a4ca4bb606ba4066 [file] [log] [blame]
/*
* 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 org.apache.rya.indexing.pcj.fluo.app.query;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.rya.indexing.pcj.fluo.app.util.PeriodicQueryUtil;
import org.eclipse.rdf4j.query.algebra.QueryModelVisitor;
import org.eclipse.rdf4j.query.algebra.TupleExpr;
import org.eclipse.rdf4j.query.algebra.UnaryTupleOperator;
import org.eclipse.rdf4j.query.algebra.evaluation.function.Function;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* This is a {@link UnaryTupleOperator} that gets placed in the parsed query
* {@link TupleExpr} when a {@link Filter} is encountered in the SPARQL String that
* contains the Periodic {@link Function} {@link PeriodicQueryUtil#PeriodicQueryURI}.
* The PeiodicQueryNode is created from the arguments passed to the Periodic Function,
* which consist of a time unit, a temporal period, a temporal window of time, and the
* temporal variable in the query, which assumes a value indicated by the
* Time ontology: http://www.w3.org/2006/time. The purpose of the PeriodicQueryNode
* is to filter out all events that did not occur within the specified window of time
* of this instant and to generate notifications at a regular interval indicated by the period.
*
*/
public class PeriodicQueryNode extends UnaryTupleOperator {
private TimeUnit unit;
private long windowDuration;
private long periodDuration;
private String temporalVar;
/**
* Creates a PeriodicQueryNode from the specified values.
* @param window - specifies the window of time that event must occur within from this instant
* @param period - regular interval at which notifications are generated (must be leq window).
* @param unit - time unit of the period and window
* @param temporalVar - temporal variable in query used for filtering
* @param arg - child of PeriodicQueryNode in parsed query
*/
public PeriodicQueryNode(long window, long period, TimeUnit unit, String temporalVar, TupleExpr arg) {
super(checkNotNull(arg));
checkArgument(0 < period && period <= window);
this.temporalVar = checkNotNull(temporalVar);
this.unit = checkNotNull(unit);
this.windowDuration = window;
this.periodDuration = period;
}
/**
* @return - temporal variable used to filter events
*/
public String getTemporalVariable() {
return temporalVar;
}
/**
* @return window duration in millis
*/
public long getWindowSize() {
return windowDuration;
}
/**
* @return period duration in millis
*/
public long getPeriod() {
return periodDuration;
}
/**
* @return {@link TimeUnit} for window duration and period duration
*/
public TimeUnit getUnit() {
return unit;
}
@Override
public <X extends Exception> void visit(QueryModelVisitor<X> visitor) throws X {
visitor.meetOther(this);
}
@Override
public boolean equals(Object other) {
if(this == other) {
return true;
}
if (other instanceof PeriodicQueryNode) {
if (super.equals(other)) {
PeriodicQueryNode metadata = (PeriodicQueryNode) other;
return new EqualsBuilder().append(windowDuration, metadata.windowDuration).append(periodDuration, metadata.periodDuration)
.append(unit, metadata.unit).append(temporalVar, metadata.temporalVar).isEquals();
}
return false;
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(arg, unit, windowDuration, periodDuration, temporalVar);
}
/**
* @return String representation of this node that is printed in when query tree is printed.
*/
@Override
public String getSignature() {
StringBuilder sb = new StringBuilder();
sb.append("PeriodicQueryNode(");
sb.append("Var = " + temporalVar + ", ");
sb.append("Window = " + windowDuration + " ms, ");
sb.append("Period = " + periodDuration + " ms, ");
sb.append("Time Unit = " + unit + ")");
return sb.toString();
}
@Override
public PeriodicQueryNode clone() {
PeriodicQueryNode clone = (PeriodicQueryNode)super.clone();
clone.setArg(getArg().clone());
clone.periodDuration = periodDuration;
clone.windowDuration = windowDuration;
clone.unit = unit;
clone.temporalVar = temporalVar;
return clone;
}
}