/*
* #!
* Ontopia Engine
* #-
* Copyright (C) 2001 - 2013 The Ontopia Project
* #-
* 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 net.ontopia.persistence.query.sql;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.ontopia.utils.StringUtils;
/**
* INTERNAL: Represents an abstract SQL query. Holds SQL query
* information in a platform independent form.
*/
public class SQLQuery {
// List of tuples/values to be selected
protected List select = new ArrayList();
protected boolean distinct = false;
protected int limit = -1;
protected int offset = -1;
// The SQL filter (roughly the same as the where clause)
protected SQLExpressionIF filter;
// List of tuples/values to be ordered by
protected List orderby;
public SQLQuery() {
}
public boolean isSetQuery() {
return (getFilter() instanceof SQLSetOperation);
}
public boolean getDistinct() {
return distinct;
}
public void setDistinct(boolean distinct) {
this.distinct = distinct;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
public int getOffset() {
return offset;
}
public void setOffset(int offset) {
this.offset = offset;
}
public List getSelect() {
return select;
}
public void addSelect(SQLValueIF value) {
select.add(value);
}
public void addSelect(SQLAggregateIF aggregate) {
select.add(aggregate);
}
public int getWidth() {
int width = 0;
int length = select.size();
for (int i=0; i < length; i++) {
Object value = select.get(i);
SQLValueIF sqlvalue;
if (value instanceof SQLAggregateIF)
sqlvalue = ((SQLAggregateIF)value).getValue();
else
sqlvalue = (SQLValueIF)value;
width = width + sqlvalue.getArity();
}
return width;
}
public List getOrderBy() {
if (orderby == null)
return Collections.EMPTY_LIST;
else
return orderby;
}
public void addOrderBy(SQLOrderBy sob) {
if (orderby == null) orderby = new ArrayList();
orderby.add(sob);
}
public void addAscending(SQLValueIF value) {
addOrderBy(new SQLOrderBy(value, SQLOrderBy.ASCENDING));
}
public void addDescending(SQLValueIF value) {
addOrderBy(new SQLOrderBy(value, SQLOrderBy.DESCENDING));
}
public void addAscending(SQLAggregateIF aggregate) {
addOrderBy(new SQLOrderBy(aggregate, SQLOrderBy.ASCENDING));
}
public void addDescending(SQLAggregateIF aggregate) {
addOrderBy(new SQLOrderBy(aggregate, SQLOrderBy.DESCENDING));
}
public SQLExpressionIF getFilter() {
return filter;
}
public void setFilter(SQLExpressionIF filter) {
this.filter = filter;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("select ");
if (getDistinct())
sb.append("distinct ");
if (select == null || select.isEmpty())
sb.append("*");
else
StringUtils.join(select, ", ", sb);
if (getFilter() != null) {
sb.append(" from ");
sb.append(getFilter());
}
List _orderby = getOrderBy();
if (!_orderby.isEmpty()) {
sb.append(" order by ");
StringUtils.join(_orderby, ", ", sb);
}
return sb.toString();
}
}