// Path: src/main/java/com/indeed/imhotep/sql/ast/Expression.java
// public interface Expression {
//     public <Z> Z match(Matcher<Z> matcher);
// 
//     public static abstract class Matcher<Z> {
// 
//         protected Z binaryExpression(Expression left, Op op, Expression right) {
//             return otherwise();
//         }
// 
//         protected Z unaryExpression(Op op, Expression operand) {
//             return otherwise();
//         }
// 
//         protected Z functionExpression(String name, List<Expression> args) {
//             return otherwise();
//         }
// 
//         protected Z nameExpression(String name) {
//             return otherwise();
//         }
// 
//         protected Z numberExpression(String value) {
//             return otherwise();
//         }
// 
//         protected Z stringExpression(String value) {
//             return otherwise();
//         }
// 
//         protected Z tupleExpression(List<Expression> values) {
//             return otherwise();
//         }
// 
//         protected Z bracketsExpression(String field, String content) {
//             return otherwise();
//         }
// 
//         protected Z nameExplodeExpression(String name) {
//             return otherwise();
//         }
// 
//         protected Z otherwise() {
//             throw new UnsupportedOperationException();
//         }
//     }
// }


import java.io.Serializable;
import java.util.List;
import com.indeed.imhotep.sql.ast.Expression;
/*
 * Copyright (C) 2014 Indeed Inc.
 *
 * Licensed 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 com.indeed.imhotep.sql.ast2;



/**
 * @author vladimir
 */

public class SelectStatement extends IQLStatement implements Serializable {
    public final SelectClause select;
    public final FromClause from;
    public final WhereClause where;
    public final GroupByClause groupBy;
    public final int limit;

    public SelectStatement(SelectClause select, FromClause from, WhereClause where, GroupByClause groupBy, int limit) {
        this.select = select;
        this.from = from;
        this.where = where;
        this.groupBy = groupBy;
        this.limit = limit;
    }

    // convenience constructor that constructs the clauses for you
    public SelectStatement(
            List<Expression> projections, FromClause from, Expression where,
            List<Expression> groupBy, int limit) {
        this.select = new SelectClause(projections);
        this.from = from;
        this.where = new WhereClause(where);
        this.groupBy = new GroupByClause(groupBy);
        this.limit = limit;
    }

    // limit default constructor
    public SelectStatement(
// Path: src/main/java/com/indeed/imhotep/sql/ast/Expression.java
// public interface Expression {
//     public <Z> Z match(Matcher<Z> matcher);
// 
//     public static abstract class Matcher<Z> {
// 
//         protected Z binaryExpression(Expression left, Op op, Expression right) {
//             return otherwise();
//         }
// 
//         protected Z unaryExpression(Op op, Expression operand) {
//             return otherwise();
//         }
// 
//         protected Z functionExpression(String name, List<Expression> args) {
//             return otherwise();
//         }
// 
//         protected Z nameExpression(String name) {
//             return otherwise();
//         }
// 
//         protected Z numberExpression(String value) {
//             return otherwise();
//         }
// 
//         protected Z stringExpression(String value) {
//             return otherwise();
//         }
// 
//         protected Z tupleExpression(List<Expression> values) {
//             return otherwise();
//         }
// 
//         protected Z bracketsExpression(String field, String content) {
//             return otherwise();
//         }
// 
//         protected Z nameExplodeExpression(String name) {
//             return otherwise();
//         }
// 
//         protected Z otherwise() {
//             throw new UnsupportedOperationException();
//         }
//     }
// }


// Path: src/main/java/com/indeed/imhotep/sql/ast2/SelectStatement.java
import java.io.Serializable;
import java.util.List;
import com.indeed.imhotep.sql.ast.Expression;

/*
 * Copyright (C) 2014 Indeed Inc.
 *
 * Licensed 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 com.indeed.imhotep.sql.ast2;



/**
 * @author vladimir
 */

public class SelectStatement extends IQLStatement implements Serializable {
    public final SelectClause select;
    public final FromClause from;
    public final WhereClause where;
    public final GroupByClause groupBy;
    public final int limit;

    public SelectStatement(SelectClause select, FromClause from, WhereClause where, GroupByClause groupBy, int limit) {
        this.select = select;
        this.from = from;
        this.where = where;
        this.groupBy = groupBy;
        this.limit = limit;
    }

    // convenience constructor that constructs the clauses for you
    public SelectStatement(
            List<Expression> projections, FromClause from, Expression where,
            List<Expression> groupBy, int limit) {
        this.select = new SelectClause(projections);
        this.from = from;
        this.where = new WhereClause(where);
        this.groupBy = new GroupByClause(groupBy);
        this.limit = limit;
    }

    // limit default constructor
    public SelectStatement(
            List<Expression> projections, FromClause from, Expression where,