/************************************************************************************** * Copyright (C) 2008 EsperTech, Inc. All rights reserved. * * http://esper.codehaus.org * * 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 com.espertech.esper.util.JavaClassHelper; import java.io.Serializable; import java.io.StringWriter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Arrays; /** * Create a named window, defining the parameter of the named window such as window name and data window view name(s). */ public class CreateWindowClause implements Serializable { private static final long serialVersionUID = 0L; private String windowName; private List<View> views = new ArrayList<View>(); private boolean insert; private Expression insertWhereClause; private List<SchemaColumnDesc> columns = new ArrayList<SchemaColumnDesc>(); /** * Ctor. */ public CreateWindowClause() { } /** * Creates a clause to create a named window. * @param windowName is the name of the named window * @param view is a data window view * @return create window clause */ public static CreateWindowClause create(String windowName, View view) { return new CreateWindowClause(windowName, new View[] {view}); } /** * Creates a clause to create a named window. * @param windowName is the name of the named window * @param views is the data window views * @return create window clause */ public static CreateWindowClause create(String windowName, View... views) { return new CreateWindowClause(windowName, views); } /** * Adds an un-parameterized view to the named window. * @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 named window creation clause */ public CreateWindowClause addView(String namespace, String name) { views.add(View.create(namespace, name)); return this; } /** * Adds a parameterized view to the named window. * @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 named window creation clause */ public CreateWindowClause addView(String namespace, String name, List<Expression> parameters) { views.add(View.create(namespace, name, parameters)); return this; } /** * Adds a parameterized view to the named window. * @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 named window creation clause */ public CreateWindowClause addView(String namespace, String name, Expression... parameters) { views.add(View.create(namespace, name, parameters)); return this; } /** * Ctor. * @param windowName is the name of the window to create * @param viewArr is the list of data window views */ public CreateWindowClause(String windowName, View[] viewArr) { this.windowName = windowName; views = new ArrayList<View>(); if (viewArr != null) { views.addAll(Arrays.asList(viewArr)); } } /** * Ctor. * @param windowName is the name of the window to create * @param views is a list of data window views */ public CreateWindowClause(String windowName, List<View> views) { this.windowName = windowName; this.views = views; } /** * Renders the clause in textual representation. * @param writer to output to */ public void toEPL(StringWriter writer) { writer.write("create window "); writer.write(windowName); ProjectedStream.toEPLViews(writer, views); } /** * Renders the clause in textual representation. * @param writer to output to */ public void toEPLInsertPart(StringWriter writer) { if (insert) { writer.write(" insert"); if (insertWhereClause != null) { writer.write(" where "); insertWhereClause.toEPL(writer, ExpressionPrecedenceEnum.MINIMUM); } } } /** * Returns the window name. * @return window name */ public String getWindowName() { return windowName; } /** * Sets the window name. * @param windowName is the name to set */ public void setWindowName(String windowName) { this.windowName = windowName; } /** * Returns the views onto the named window. * @return named window data views */ public List<View> getViews() { return views; } /** * Returns true if inserting from another named window, false if not. * @return insert from named window */ public boolean isInsert() { return insert; } /** * Returns true if inserting from another named window, false if not. * @return insert from named window */ public boolean getInsert() { return insert; } /** * Filter expression for inserting from another named window, or null if not inserting from another named window. * @return filter expression */ public Expression getInsertWhereClause() { return insertWhereClause; } /** * Sets flag indicating that an insert from another named window should take place at the time of window creation. * @param insert true for insert from another named window * @return clause */ public CreateWindowClause insert(boolean insert) { this.insert = insert; return this; } /** * Sets flag indicating that an insert from another named window should take place at the time of window creation. * @param insert true for insert from another named window */ public void setInsert(boolean insert) { this.insert = insert; } /** * Sets the filter expression for inserting from another named window * @param insertWhereClause filter expression * @return create window clause */ public CreateWindowClause insertWhereClause(Expression insertWhereClause) { this.insertWhereClause = insertWhereClause; return this; } /** * Sets the filter expression for inserting from another named window * @param insertWhereClause filter expression */ public void setInsertWhereClause(Expression insertWhereClause) { this.insertWhereClause = insertWhereClause; } /** * Sets the views onto the named window. * @param views to set */ public void setViews(List<View> views) { this.views = views; } /** * Returns all columns for use when create-table syntax is used to define the named window type. * @return columns */ public List<SchemaColumnDesc> getColumns() { return columns; } /** * Adds a column for use when create-table syntax is used to define the named window type. * @param col column to add */ public void addColumn(SchemaColumnDesc col) { columns.add(col); } /** * Sets the columns for use when create-table syntax is used to define the named window type. * @param columns to set */ public void setColumns(List<SchemaColumnDesc> columns) { this.columns = columns; } /** * To-EPL for create-table syntax. * @param writer to use */ public void toEPLCreateTablePart(StringWriter writer) { String delimiter = ""; writer.write('('); for (SchemaColumnDesc col : columns) { writer.append(delimiter); col.toEPL(writer); delimiter = ", "; } writer.write(')'); } }