
dk.eobjects.metamodel.dialects.AbstractQueryRewriter Maven / Gradle / Ivy
The newest version!
/**
* This file is part of MetaModel.
*
* MetaModel is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MetaModel is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MetaModel. If not, see .
*/
package dk.eobjects.metamodel.dialects;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import dk.eobjects.metamodel.JdbcDataContextStrategy;
import dk.eobjects.metamodel.query.FilterClause;
import dk.eobjects.metamodel.query.FilterItem;
import dk.eobjects.metamodel.query.FromClause;
import dk.eobjects.metamodel.query.FromItem;
import dk.eobjects.metamodel.query.GroupByClause;
import dk.eobjects.metamodel.query.GroupByItem;
import dk.eobjects.metamodel.query.OrderByClause;
import dk.eobjects.metamodel.query.OrderByItem;
import dk.eobjects.metamodel.query.Query;
import dk.eobjects.metamodel.query.QueryClause;
import dk.eobjects.metamodel.query.SelectClause;
import dk.eobjects.metamodel.query.SelectItem;
/**
* Abstract implementation of query rewriter. This implementation delegates the
* rewriting of the Query into several subtasks according to the query items to
* be rendered. This makes it easy to overload single methods in order to
* correct syntax quirks.
*/
public class AbstractQueryRewriter implements IQueryRewriter {
protected final Log _log = LogFactory.getLog(getClass());
public String rewriteQuery(JdbcDataContextStrategy strategy, Query query) {
query = beforeRewrite(strategy, query);
StringBuilder sb = new StringBuilder();
sb
.append(rewriteSelectClause(strategy, query, query
.getSelectClause()));
sb.append(rewriteFromClause(strategy, query, query.getFromClause()));
sb.append(rewriteWhereClause(strategy, query, query.getWhereClause()));
sb.append(rewriteGroupByClause(strategy, query, query
.getGroupByClause()));
sb
.append(rewriteHavingClause(strategy, query, query
.getHavingClause()));
sb.append(rewriteOrderByClause(strategy, query, query
.getOrderByClause()));
return sb.toString();
}
/**
* Method to modify query before rewriting begins. Overwrite this method if
* you want to change parts of the query that are not just rendering
* related. Cloning the query before modifying is recommended in order to
* not violate referential integrity of clients (the query is mutable).
*
* @param strategy
* @param query
* @return the modified query
*/
protected Query beforeRewrite(JdbcDataContextStrategy strategy, Query query) {
return query;
}
protected String rewriteOrderByClause(JdbcDataContextStrategy strategy,
Query query, OrderByClause orderByClause) {
StringBuilder sb = new StringBuilder();
if (orderByClause.getItemCount() > 0) {
sb.append(QueryClause.PREFIX_ORDER_BY);
List items = orderByClause.getItems();
for (int i = 0; i < items.size(); i++) {
OrderByItem item = items.get(i);
if (i != 0) {
sb.append(QueryClause.DELIM_COMMA);
}
sb.append(rewriteOrderByItem(strategy, query, item));
}
}
return sb.toString();
}
protected String rewriteOrderByItem(JdbcDataContextStrategy strategy,
Query query, OrderByItem item) {
return item.toString();
}
protected String rewriteHavingClause(JdbcDataContextStrategy strategy,
Query query, FilterClause havingClause) {
StringBuilder sb = new StringBuilder();
if (havingClause.getItemCount() > 0) {
sb.append(QueryClause.PREFIX_HAVING);
List items = havingClause.getItems();
for (int i = 0; i < items.size(); i++) {
FilterItem item = items.get(i);
if (i != 0) {
sb.append(QueryClause.DELIM_AND);
}
sb.append(rewriteFilterItem(strategy, query, item));
}
}
return sb.toString();
}
protected String rewriteGroupByClause(JdbcDataContextStrategy strategy,
Query query, GroupByClause groupByClause) {
StringBuilder sb = new StringBuilder();
if (groupByClause.getItemCount() > 0) {
sb.append(QueryClause.PREFIX_GROUP_BY);
List items = groupByClause.getItems();
for (int i = 0; i < items.size(); i++) {
GroupByItem item = items.get(i);
if (i != 0) {
sb.append(QueryClause.DELIM_COMMA);
}
sb.append(rewriteGroupByItem(strategy, query, item));
}
}
return sb.toString();
}
protected String rewriteGroupByItem(JdbcDataContextStrategy strategy,
Query query, GroupByItem item) {
return item.toString();
}
protected String rewriteWhereClause(JdbcDataContextStrategy strategy,
Query query, FilterClause whereClause) {
StringBuilder sb = new StringBuilder();
if (whereClause.getItemCount() > 0) {
sb.append(QueryClause.PREFIX_WHERE);
List items = whereClause.getItems();
for (int i = 0; i < items.size(); i++) {
FilterItem item = items.get(i);
if (i != 0) {
sb.append(QueryClause.DELIM_AND);
}
sb.append(rewriteFilterItem(strategy, query, item));
}
}
return sb.toString();
}
protected String rewriteFilterItem(JdbcDataContextStrategy strategy,
Query query, FilterItem item) {
return item.toString();
}
protected String rewriteFromClause(JdbcDataContextStrategy strategy,
Query query, FromClause fromClause) {
StringBuilder sb = new StringBuilder();
if (fromClause.getItemCount() > 0) {
sb.append(QueryClause.PREFIX_FROM);
List items = fromClause.getItems();
for (int i = 0; i < items.size(); i++) {
FromItem item = items.get(i);
if (i != 0) {
sb.append(QueryClause.DELIM_COMMA);
}
sb.append(rewriteFromItem(strategy, query, item));
}
}
return sb.toString();
}
protected String rewriteFromItem(JdbcDataContextStrategy strategy,
Query query, FromItem item) {
return item.toString();
}
protected String rewriteSelectClause(JdbcDataContextStrategy strategy,
Query query, SelectClause selectClause) {
StringBuilder sb = new StringBuilder();
if (selectClause.getItemCount() > 0) {
sb.append(QueryClause.PREFIX_SELECT);
if (selectClause.isDistinct()) {
sb.append("DISTINCT ");
}
List items = selectClause.getItems();
for (int i = 0; i < items.size(); i++) {
SelectItem item = items.get(i);
if (i != 0) {
sb.append(QueryClause.DELIM_COMMA);
}
sb.append(rewriteSelectItem(strategy, query, item));
}
}
return sb.toString();
}
protected String rewriteSelectItem(JdbcDataContextStrategy strategy,
Query query, SelectItem item) {
return item.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy