/*
* Copyright (c) 2013-2015 Josef Hardi <josef.hardi@gmail.com>
*
* 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.obidea.semantika.mapping.base.sql;
import com.obidea.semantika.database.sql.base.ISqlColumn;
import com.obidea.semantika.database.sql.base.ISqlExpression;
import com.obidea.semantika.database.sql.base.ISqlFunction;
import com.obidea.semantika.database.sql.base.ISqlJoin;
import com.obidea.semantika.database.sql.base.ISqlQuery;
import com.obidea.semantika.database.sql.base.ISqlSubQuery;
import com.obidea.semantika.database.sql.base.ISqlTable;
import com.obidea.semantika.database.sql.base.SqlExpressionVisitorAdapter;
import com.obidea.semantika.database.sql.base.SqlJoinCondition;
import com.obidea.semantika.database.sql.base.SqlSelectItem;
/* package */class SqlQueryWalker extends SqlExpressionVisitorAdapter
{
private SqlQuery mSelectQuery;
private SqlInternal mInternalQuery;
public SqlQueryWalker(SqlQuery selectQuery)
{
mSelectQuery = selectQuery;
}
public void doUpdate(SqlInternal internalQuery)
{
mInternalQuery = internalQuery;
visitQuery(mSelectQuery);
}
private void visitQuery(ISqlQuery sqlQuery)
{
if (sqlQuery instanceof SqlQuery) {
sqlQuery.getFromExpression().accept(this);
for (SqlSelectItem selectItem : sqlQuery.getSelectItems()) {
visitSelectItem(selectItem);
selectItem.getExpression().accept(this);
}
for (ISqlExpression whereExpression : sqlQuery.getWhereExpression()) {
whereExpression.accept(this);
}
}
}
private void visitSelectItem(SqlSelectItem selectItem)
{
String selectItemLabel = selectItem.getLabelName();
mInternalQuery.addSelectItem(selectItemLabel, selectItem.getExpression());
}
@Override
public void visit(ISqlColumn columnExpression)
{
if (columnExpression instanceof SqlColumn) {
mInternalQuery.addColumn((SqlColumn) columnExpression);
}
}
@Override
public void visit(ISqlJoin joinExpression)
{
if (joinExpression instanceof SqlJoin) {
joinExpression.getLeftExpression().accept(this);
joinExpression.getRightExpression().accept(this);
for (SqlJoinCondition condition : joinExpression.getJoinConditions()) {
condition.getLeftColumn().accept(this);
condition.getRightColumn().accept(this);
}
for (ISqlExpression filter : joinExpression.getFilters()) {
filter.accept(this);
}
}
}
@Override
public void visit(ISqlSubQuery subQueryExpression)
{
if (subQueryExpression instanceof SqlSubQuery) {
visitQuery(subQueryExpression.getQuery());
}
}
@Override
public void visit(ISqlTable tableExpression)
{
if (tableExpression instanceof SqlTable) {
String tableName = tableExpression.getTableName();
mInternalQuery.addTable(tableName, (SqlTable) tableExpression);
}
}
@Override
public void visit(ISqlFunction filterExpression)
{
if (filterExpression instanceof SqlFunction) {
for (ISqlExpression parameter : filterExpression.getParameterExpressions()) {
parameter.accept(this);
}
}
}
}