/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * 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 org.dashbuilder.dataprovider.sql.model; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.dashbuilder.dataprovider.sql.JDBCUtils; import org.dashbuilder.dataprovider.sql.dialect.Dialect; public class Select extends SQLStatement<Select> { protected List<Column> columns = new ArrayList<Column>(); protected String fromSelect = null; protected List<Condition> wheres = new ArrayList<Condition>(); protected List<Column> groupBys = new ArrayList<Column>(); protected List<SortColumn> orderBys = new ArrayList<SortColumn>(); protected int limit = -1; protected int offset = -1; protected boolean offsetPostProcessing = false; protected List<String> quotedFields = null; public Select(Connection connection, Dialect dialect) { super(connection, dialect); } public boolean isOffsetPostProcessing() { return offsetPostProcessing; } public void setOffsetPostProcessing(boolean offsetPostProcessing) { this.offsetPostProcessing = offsetPostProcessing; } public List<Column> getColumns() { return columns; } public String getFromSelect() { return fromSelect; } public Table getFromTable() { return super.getTable(); } public List<Condition> getWheres() { return wheres; } public List<Column> getGroupBys() { return groupBys; } public List<SortColumn> getOrderBys() { return orderBys; } public int getLimit() { return limit; } public int getOffset() { return offset; } public Select columns(Column... cols) { for (Column column : cols) { columns.add(fix(column)); } return this; } public Select columns(Collection<Column> cols) { for (Column column : cols) { columns.add(fix(column)); } return this; } public Select from(String sql) { fromSelect = sql; return this; } public Select from(Table table) { return super.table(table); } public Select where(Condition condition) { if (condition != null) { fix(condition); wheres.add(condition); } return this; } public Select groupBy(Column column) { if (column != null) { groupBys.add(fix(column)); } return this; } public Select orderBy(SortColumn... columns) { for (SortColumn column : columns) { fix(column.getSource()); orderBys.add(column); } return this; } public Select orderBy(List<SortColumn> columns) { for (SortColumn column : columns) { fix(column.getSource()); orderBys.add(column); } return this; } public Select limit(int limit) { this.limit = limit; return this; } public Select offset(int offset) { this.offset = offset; return this; } public String getSQL() { quotedFields = JDBCUtils.getWordsBetweenQuotes(fromSelect); for (Column column : _columnsRefs) { String name = column.getName(); if (quotedFields.contains(name)) { name = dialect.getColumnNameQuotedSQL(name); } else { name = JDBCUtils.fixCase(connection, name); } column.setName(name); } fromSelect = fixCase(fromSelect); return dialect.getSQL(this); } @Override public String toString() { return getSQL(); } // Fetch public int fetchCount() throws SQLException { String countSql = dialect.getCountQuerySQL(this); ResultSet _rs = JDBCUtils.executeQuery(connection, countSql); if (_rs.next()) { return _rs.getInt(1); } else { return 0; } } public ResultSet fetch() throws SQLException { String sql = getSQL(); return JDBCUtils.executeQuery(connection, sql); } }