/*
***************************************************************************************
* 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;
/**
* Abstract base class for streams that can be projected via views providing data window, uniqueness or other projections
* or deriving further information from streams.
*/
public abstract class ProjectedStream extends Stream {
private static final long serialVersionUID = -8999968913067920696L;
private List<View> views;
private boolean unidirectional;
private boolean retainUnion;
private boolean retainIntersection;
/**
* Ctor.
*/
public ProjectedStream() {
}
/**
* Represent as textual.
*
* @param writer to output to
* @param formatter for newline-whitespace formatting
*/
public abstract void toEPLProjectedStream(StringWriter writer, EPStatementFormatter formatter);
/**
* Represent type as textual non complete.
*
* @param writer to output to
*/
public abstract void toEPLProjectedStreamType(StringWriter writer);
/**
* Ctor.
*
* @param views is a list of views upon the stream
* @param optStreamName is the stream as-name, or null if unnamed
*/
protected ProjectedStream(List<View> views, String optStreamName) {
super(optStreamName);
this.views = views;
}
/**
* Adds an un-parameterized view to the stream.
*
* @param namespace is the view namespace, for example "win" for most data windows
* @param name is the view name, for example "length" for a length window
* @return stream
*/
public ProjectedStream addView(String namespace, String name) {
views.add(View.create(namespace, name));
return this;
}
/**
* Adds a parameterized view to the stream.
*
* @param namespace is the view namespace, for example "win" for most data windows
* @param name is the view name, for example "length" for a length window
* @param parameters is a list of view parameters
* @return stream
*/
public ProjectedStream addView(String namespace, String name, List<Expression> parameters) {
views.add(View.create(namespace, name, parameters));
return this;
}
/**
* Adds a parameterized view to the stream.
*
* @param namespace is the view namespace, for example "win" for most data windows
* @param name is the view name, for example "length" for a length window
* @param parameters is a list of view parameters
* @return stream
*/
public ProjectedStream addView(String namespace, String name, Expression... parameters) {
views.add(View.create(namespace, name, parameters));
return this;
}
/**
* Adds a parameterized view to the stream.
*
* @param name is the view name, for example "length" for a length window
* @param parameters is a list of view parameters
* @return stream
*/
public ProjectedStream addView(String name, Expression... parameters) {
views.add(View.create(null, name, parameters));
return this;
}
/**
* Add a view to the stream.
*
* @param view to add
* @return stream
*/
public ProjectedStream addView(View view) {
views.add(view);
return this;
}
/**
* Returns the list of views added to the stream.
*
* @return list of views
*/
public List<View> getViews() {
return views;
}
/**
* Sets the list of views onto the stream.
*
* @param views list of views
*/
public void setViews(List<View> views) {
this.views = views;
}
/**
* Renders the clause in textual representation.
*
* @param writer to output to
*/
public void toEPLStream(StringWriter writer, EPStatementFormatter formatter) {
toEPLProjectedStream(writer, formatter);
toEPLViews(writer, views);
}
public void toEPLStreamType(StringWriter writer) {
toEPLProjectedStreamType(writer);
if ((views != null) && (views.size() != 0)) {
writer.write('.');
String delimiter = "";
for (View view : views) {
writer.write(delimiter);
writer.append(view.getNamespace()).append(".").append(view.getName()).append("()");
delimiter = ".";
}
}
}
/**
* Returns true if the stream as unidirectional, for use in unidirectional joins.
*
* @return true for unidirectional stream, applicable only for joins
*/
public boolean isUnidirectional() {
return unidirectional;
}
/**
* Set to true to indicate that a stream is unidirectional, for use in unidirectional joins.
*
* @param isUnidirectional true for unidirectional stream, applicable only for joins
*/
public void setUnidirectional(boolean isUnidirectional) {
this.unidirectional = isUnidirectional;
}
/**
* Set to unidirectional.
*
* @param isUnidirectional try if unidirectional
* @return stream
*/
public ProjectedStream unidirectional(boolean isUnidirectional) {
this.unidirectional = isUnidirectional;
return this;
}
/**
* Returns true if multiple data window shall be treated as a union.
*
* @return retain union
*/
public boolean isRetainUnion() {
return retainUnion;
}
/**
* Set to true to have multiple data window be treated as a union.
*
* @param retainUnion indicator to union
*/
public void setRetainUnion(boolean retainUnion) {
this.retainUnion = retainUnion;
}
/**
* Returns true if multiple data window shall be treated as an intersection.
*
* @return retain intersection
*/
public boolean isRetainIntersection() {
return retainIntersection;
}
/**
* Set to true to have multiple data window be treated as a intersection.
*
* @param retainIntersection indicator to intersection
*/
public void setRetainIntersection(boolean retainIntersection) {
this.retainIntersection = retainIntersection;
}
/**
* Renders the views onto the projected stream.
*
* @param writer to render to
* @param views to render
*/
protected static void toEPLViews(StringWriter writer, List<View> views) {
if ((views != null) && (views.size() != 0)) {
if (views.iterator().next().getNamespace() == null) {
writer.write('#');
String delimiter = "";
for (View view : views) {
writer.write(delimiter);
view.toEPLWithHash(writer);
delimiter = "#";
}
} else {
writer.write('.');
String delimiter = "";
for (View view : views) {
writer.write(delimiter);
view.toEPL(writer);
delimiter = ".";
}
}
}
}
public void toEPLStreamOptions(StringWriter writer) {
if (unidirectional) {
writer.write(" unidirectional");
} else if (retainUnion) {
writer.write(" retain-union");
} else if (retainIntersection) {
writer.write(" retain-intersection");
}
}
}