/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
***************************************************************************************
*/
package com.espertech.esper.client.soda;
import java.io.StringWriter;
import java.util.List;
/**
* Context dimension descriptor for a start-and-end temporal (single instance) or initiated-terminated (overlapping) context
*/
public class ContextDescriptorInitiatedTerminated implements ContextDescriptor {
private static final long serialVersionUID = 8185386941253467559L;
private ContextDescriptorCondition startCondition;
private ContextDescriptorCondition endCondition;
private boolean overlapping;
private List<Expression> optionalDistinctExpressions;
/**
* Ctor.
*/
public ContextDescriptorInitiatedTerminated() {
}
/**
* Ctor.
*
* @param startCondition the condition that starts/initiates a context partition
* @param endCondition the condition that ends/terminates a context partition
* @param overlapping true for overlapping contexts
* @param optionalDistinctExpressions list of distinct-value expressions, can be null
*/
public ContextDescriptorInitiatedTerminated(ContextDescriptorCondition startCondition, ContextDescriptorCondition endCondition, boolean overlapping, List<Expression> optionalDistinctExpressions) {
this.startCondition = startCondition;
this.endCondition = endCondition;
this.overlapping = overlapping;
this.optionalDistinctExpressions = optionalDistinctExpressions;
}
/**
* Ctor.
*
* @param startCondition the condition that starts/initiates a context partition
* @param endCondition the condition that ends/terminates a context partition
* @param overlapping true for overlapping contexts
*/
public ContextDescriptorInitiatedTerminated(ContextDescriptorCondition startCondition, ContextDescriptorCondition endCondition, boolean overlapping) {
this.startCondition = startCondition;
this.endCondition = endCondition;
this.overlapping = overlapping;
}
/**
* Returns the condition that starts/initiates a context partition
*
* @return start condition
*/
public ContextDescriptorCondition getStartCondition() {
return startCondition;
}
/**
* Sets the condition that starts/initiates a context partition
*
* @param startCondition start condition
*/
public void setStartCondition(ContextDescriptorCondition startCondition) {
this.startCondition = startCondition;
}
/**
* Returns the condition that ends/terminates a context partition
*
* @return end condition
*/
public ContextDescriptorCondition getEndCondition() {
return endCondition;
}
/**
* Sets the condition that ends/terminates a context partition
*
* @param endCondition end condition
*/
public void setEndCondition(ContextDescriptorCondition endCondition) {
this.endCondition = endCondition;
}
/**
* Returns true for overlapping context, false for non-overlapping.
*
* @return overlap indicator
*/
public boolean isOverlapping() {
return overlapping;
}
/**
* Set to true for overlapping context, false for non-overlapping.
*
* @param overlapping overlap indicator
*/
public void setOverlapping(boolean overlapping) {
this.overlapping = overlapping;
}
/**
* Returns the list of expressions providing distinct keys, if any
*
* @return distinct expressions
*/
public List<Expression> getOptionalDistinctExpressions() {
return optionalDistinctExpressions;
}
/**
* Sets the list of expressions providing distinct keys, if any
*
* @param optionalDistinctExpressions distinct expressions
*/
public void setOptionalDistinctExpressions(List<Expression> optionalDistinctExpressions) {
this.optionalDistinctExpressions = optionalDistinctExpressions;
}
public void toEPL(StringWriter writer, EPStatementFormatter formatter) {
writer.append(overlapping ? "initiated by " : "start ");
if (optionalDistinctExpressions != null && optionalDistinctExpressions.size() > 0) {
writer.append("distinct(");
String delimiter = "";
for (Expression expression : optionalDistinctExpressions) {
writer.write(delimiter);
expression.toEPL(writer, ExpressionPrecedenceEnum.MINIMUM);
delimiter = ", ";
}
writer.append(") ");
}
startCondition.toEPL(writer, formatter);
if (!(endCondition instanceof ContextDescriptorConditionNever)) {
writer.append(" ");
writer.append(overlapping ? "terminated " : "end ");
endCondition.toEPL(writer, formatter);
}
}
}