All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.espertech.esper.client.soda.SelectClause Maven / Gradle / Ivy

/*
 ***************************************************************************************
 *  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.Serializable;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

/**
 * A select-clause consists of a list of selection elements (expressions, wildcard(s), stream wildcard and the like)
 * and an optional stream selector.
 */
public class SelectClause implements Serializable {
    private static final long serialVersionUID = 0L;

    private boolean distinct;
    private StreamSelector streamSelector;
    private List selectList;

    /**
     * Ctor.
     */
    public SelectClause() {
    }

    /**
     * Creates a wildcard select-clause, additional expressions can still be added.
     *
     * @return select-clause
     */
    public static SelectClause createWildcard() {
        List selectList = new ArrayList();
        selectList.add(new SelectClauseWildcard());
        return new SelectClause(StreamSelector.ISTREAM_ONLY, selectList);
    }

    /**
     * Creates an empty select-clause to be added to via add methods.
     *
     * @return select-clause
     */
    public static SelectClause create() {
        return new SelectClause(StreamSelector.ISTREAM_ONLY, new ArrayList());
    }

    /**
     * Creates a select-clause consisting of a list of property names.
     *
     * @param propertyNames is the names of properties to select
     * @return select-clause
     */
    public static SelectClause create(String... propertyNames) {
        List selectList = new ArrayList();
        for (String name : propertyNames) {
            selectList.add(new SelectClauseExpression(new PropertyValueExpression(name)));
        }
        return new SelectClause(StreamSelector.ISTREAM_ONLY, selectList);
    }

    /**
     * Creates a select-clause with a single stream wildcard selector (e.g. select streamName.* from MyStream as streamName)
     *
     * @param streamName is the name given to a stream
     * @return select-clause
     */
    public static SelectClause createStreamWildcard(String streamName) {
        List selectList = new ArrayList();
        selectList.add(new SelectClauseStreamWildcard(streamName, null));
        return new SelectClause(StreamSelector.ISTREAM_ONLY, selectList);
    }

    /**
     * Creates a wildcard select-clause, additional expressions can still be added.
     *
     * @param streamSelector can be used to select insert or remove streams
     * @return select-clause
     */
    public static SelectClause createWildcard(StreamSelector streamSelector) {
        List selectList = new ArrayList();
        selectList.add(new SelectClauseWildcard());
        return new SelectClause(streamSelector, selectList);
    }

    /**
     * Creates an empty select-clause.
     *
     * @param streamSelector can be used to select insert or remove streams
     * @return select-clause
     */
    public static SelectClause create(StreamSelector streamSelector) {
        return new SelectClause(streamSelector, new ArrayList());
    }

    /**
     * Creates a select-clause consisting of a list of property names.
     *
     * @param propertyNames  is the names of properties to select
     * @param streamSelector can be used to select insert or remove streams
     * @return select-clause
     */
    public static SelectClause create(StreamSelector streamSelector, String... propertyNames) {
        List selectList = new ArrayList();
        for (String name : propertyNames) {
            selectList.add(new SelectClauseExpression(new PropertyValueExpression(name)));
        }
        return new SelectClause(streamSelector, selectList);
    }

    /**
     * Ctor.
     *
     * @param streamSelector selects the stream
     * @param selectList     is a list of elements in the select-clause
     */
    protected SelectClause(StreamSelector streamSelector, List selectList) {
        this.streamSelector = streamSelector;
        this.selectList = selectList;
    }

    /**
     * Adds property names to be selected.
     *
     * @param propertyNames is a list of property names to add
     * @return clause
     */
    public SelectClause add(String... propertyNames) {
        for (String name : propertyNames) {
            selectList.add(new SelectClauseExpression(new PropertyValueExpression(name)));
        }
        return this;
    }

    /**
     * Adds a single property name and an "as"-asName for the column.
     *
     * @param propertyName name of property
     * @param asName       is the "as"-asName for the column
     * @return clause
     */
    public SelectClause addWithAsProvidedName(String propertyName, String asName) {
        selectList.add(new SelectClauseExpression(new PropertyValueExpression(propertyName), asName));
        return this;
    }

    /**
     * Adds an expression to the select clause.
     *
     * @param expression to add
     * @return clause
     */
    public SelectClause add(Expression expression) {
        selectList.add(new SelectClauseExpression(expression));
        return this;
    }

    /**
     * Adds an expression to the select clause and an "as"-asName for the column.
     *
     * @param expression to add
     * @param asName     is the "as"-provided for the column
     * @return clause
     */
    public SelectClause add(Expression expression, String asName) {
        selectList.add(new SelectClauseExpression(expression, asName));
        return this;
    }

    /**
     * Returns the list of expressions in the select clause.
     *
     * @return list of expressions with column names
     */
    public List getSelectList() {
        return selectList;
    }

    /**
     * Adds to the select-clause a stream wildcard selector (e.g. select streamName.* from MyStream as streamName)
     *
     * @param streamName is the name given to a stream
     * @return select-clause
     */
    public SelectClause addStreamWildcard(String streamName) {
        selectList.add(new SelectClauseStreamWildcard(streamName, null));
        return this;
    }

    /**
     * Adds to the select-clause a  wildcard selector (e.g. select * from MyStream as streamName)
     *
     * @return select-clause
     */
    public SelectClause addWildcard() {
        selectList.add(new SelectClauseWildcard());
        return this;
    }

    /**
     * Adds to the select-clause a stream wildcard selector with column name (e.g. select streamName.* as colName from MyStream as streamName)
     *
     * @param streamName is the name given to a stream
     * @param columnName the name given to the column
     * @return select-clause
     */
    public SelectClause addStreamWildcard(String streamName, String columnName) {
        selectList.add(new SelectClauseStreamWildcard(streamName, columnName));
        return this;
    }

    /**
     * Sets the stream selector.
     *
     * @param streamSelector stream selector to set
     */
    public void setStreamSelector(StreamSelector streamSelector) {
        this.streamSelector = streamSelector;
    }

    /**
     * Sets the stream selector.
     *
     * @param streamSelector stream selector to set
     * @return select clause
     */
    public SelectClause streamSelector(StreamSelector streamSelector) {
        this.streamSelector = streamSelector;
        return this;
    }

    /**
     * Returns the stream selector.
     *
     * @return stream selector
     */
    public StreamSelector getStreamSelector() {
        return streamSelector;
    }

    /**
     * Sets the list of expressions in the select clause.
     *
     * @param selectList list of expressions with column names
     */
    public void setSelectList(List selectList) {
        this.selectList = selectList;
    }

    /**
     * Add a select expression element.
     *
     * @param selectClauseElements to add
     */
    public void addElements(List selectClauseElements) {
        selectList.addAll(selectClauseElements);
    }

    /**
     * Renders the clause in textual representation.
     *
     * @param writer     to output to
     * @param formatter  for newline-whitespace formatting
     * @param isTopLevel to indicate if this select-clause is inside other clauses.
     * @param andDelete  indicator whether select and delete
     */
    public void toEPL(StringWriter writer, EPStatementFormatter formatter, boolean isTopLevel, boolean andDelete) {
        formatter.beginSelect(writer, isTopLevel);
        writer.write("select ");

        if (andDelete) {
            writer.write("and delete ");
        }

        if (distinct) {
            writer.write("distinct ");
        }
        if (streamSelector == StreamSelector.ISTREAM_ONLY) {
            // the default, no action
        } else if (streamSelector == StreamSelector.RSTREAM_ONLY) {
            writer.write("rstream ");
        } else if (streamSelector == StreamSelector.RSTREAM_ISTREAM_BOTH) {
            writer.write("irstream ");
        }

        if (selectList != null && !selectList.isEmpty()) {
            String delimiter = "";
            for (SelectClauseElement element : selectList) {
                writer.write(delimiter);
                element.toEPLElement(writer);
                delimiter = ", ";
            }
        } else {
            writer.write('*');
        }
    }

    /**
     * Returns indicator whether distinct or not.
     *
     * @return distinct indicator
     */
    public boolean isDistinct() {
        return distinct;
    }

    /**
     * Returns indicator whether distinct or not.
     *
     * @return distinct indicator
     */
    public boolean getDistinct() {
        return distinct;
    }

    /**
     * Returns indicator whether distinct or not.
     *
     * @param distinct distinct indicator
     */
    public void setDistinct(boolean distinct) {
        this.distinct = distinct;
    }

    /**
     * Sets distinct
     *
     * @param distinct distinct indicator
     * @return the select clause
     */
    public SelectClause distinct(boolean distinct) {
        this.distinct = distinct;
        return this;
    }

    /**
     * Sets distinct to true.
     *
     * @return the select clause
     */
    public SelectClause distinct() {
        this.distinct = true;
        return this;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy