/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.ignite.internal.processors.query.h2.sql; import javax.cache.CacheException; import org.h2.command.dml.SelectUnion; import org.h2.util.StatementBuilder; /** * Select query with UNION. */ public class GridSqlUnion extends GridSqlQuery { /** */ public static final int LEFT_CHILD = 2; /** */ public static final int RIGHT_CHILD = 3; /** */ private int unionType; /** */ private GridSqlQuery right; /** */ private GridSqlQuery left; /** {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public <E extends GridSqlAst> E child(int childIdx) { if (childIdx < LEFT_CHILD) return super.child(childIdx); switch (childIdx) { case LEFT_CHILD: assert left != null; return (E)left; case RIGHT_CHILD: assert right != null; return (E)right; default: throw new IllegalStateException("Child index: " + childIdx); } } /** {@inheritDoc} */ @Override public <E extends GridSqlAst> void child(int childIdx, E child) { if (childIdx < LEFT_CHILD) { super.child(childIdx, child); return; } switch (childIdx) { case LEFT_CHILD: left = (GridSqlQuery)child; break; case RIGHT_CHILD: right = (GridSqlQuery)child; break; default: throw new IllegalStateException("Child index: " + childIdx); } } /** {@inheritDoc} */ @Override public int size() { return 4; // OFFSET + LIMIT + LEFT + RIGHT } /** {@inheritDoc} */ @Override protected int visibleColumns() { return left.visibleColumns(); } /** {@inheritDoc} */ @Override protected GridSqlElement column(int col) { throw new IllegalStateException(); } /** {@inheritDoc} */ @Override public String getSQL() { StatementBuilder buff = new StatementBuilder(explain() ? "EXPLAIN \n" : ""); buff.append('(').append(left.getSQL()).append(')'); switch (unionType()) { case SelectUnion.UNION_ALL: buff.append("\nUNION ALL\n"); break; case SelectUnion.UNION: buff.append("\nUNION\n"); break; case SelectUnion.INTERSECT: buff.append("\nINTERSECT\n"); break; case SelectUnion.EXCEPT: buff.append("\nEXCEPT\n"); break; default: throw new CacheException("type=" + unionType); } buff.append('(').append(right.getSQL()).append(')'); getSortLimitSQL(buff); return buff.toString(); } /** {@inheritDoc} */ @Override public boolean simpleQuery() { return unionType() == SelectUnion.UNION_ALL && sort().isEmpty() && offset() == null && limit() == null && left().simpleQuery() && right().simpleQuery(); } /** * @return Union type. */ public int unionType() { return unionType; } /** * @param unionType New union type. */ public void unionType(int unionType) { this.unionType = unionType; } /** * @return Right. */ public GridSqlQuery right() { return right; } /** * @param right New right. */ public void right(GridSqlQuery right) { this.right = right; } /** * @return Left. */ public GridSqlQuery left() { return left; } /** * @param left New left. */ public void left(GridSqlQuery left) { this.left = left; } }