/* * Copyright Aduna (http://www.aduna-software.com/) (c) 2008. * * Licensed under the Aduna BSD-style license. */ package org.openrdf.sail.rdbms.algebra.base; import java.util.ArrayList; import java.util.List; import org.openrdf.query.algebra.QueryModelNode; import org.openrdf.query.algebra.QueryModelVisitor; import org.openrdf.sail.rdbms.algebra.ColumnVar; /** * An item in the SQL from clause. * * @author James Leigh * */ public abstract class FromItem extends RdbmsQueryModelNodeBase { private String alias; private boolean left; private List<FromItem> joins = new ArrayList<FromItem>(); private List<SqlExpr> filters = new ArrayList<SqlExpr>(); public FromItem(String alias) { super(); this.alias = alias; } public String getAlias() { return alias; } public boolean isLeft() { return left; } public void setLeft(boolean left) { this.left = left; } public List<SqlExpr> getFilters() { return filters; } public void addFilter(SqlExpr filter) { this.filters.add(filter); filter.setParentNode(this); } public List<FromItem> getJoins() { return joins; } public ColumnVar getVarForChildren(String name) { for (FromItem join : joins) { ColumnVar var = join.getVar(name); if (var != null) return var; } return null; } public ColumnVar getVar(String name) { return getVarForChildren(name); } public void addJoin(FromItem join) { joins.add(join); joinAdded(join); } public void addJoinBefore(FromItem valueJoin, FromItem join) { for (int i = 0, n = joins.size(); i < n; i++) { if (joins.get(i) == join) { joins.add(i, valueJoin); joinAdded(valueJoin); return; } } addJoin(valueJoin); } protected void joinAdded(FromItem valueJoin) { valueJoin.setParentNode(this); } public FromItem getFromItem(String alias) { if (this.alias.equals(alias)) return this; for (FromItem join : joins) { FromItem result = join.getFromItem(alias); if (result != null) return result; } return null; } public void removeFilter(SqlExpr sqlExpr) { for (int i = filters.size() - 1; i >= 0; i--) { if (filters.get(i) == sqlExpr) { filters.remove(i); break; } } } public List<ColumnVar> appendVars(List<ColumnVar> vars) { for (FromItem join : joins) { join.appendVars(vars); } return vars; } @Override public String getSignature() { StringBuilder sb = new StringBuilder(); if (left) { sb.append("LEFT "); } sb.append(super.getSignature()); sb.append(" ").append(alias); return sb.toString(); } @Override public FromItem clone() { FromItem clone = (FromItem)super.clone(); clone.joins = new ArrayList<FromItem>(); for (FromItem join : joins) { clone.addJoin(join.clone()); } clone.filters = new ArrayList<SqlExpr>(); for (SqlExpr expr : filters) { clone.addFilter(expr.clone()); } return clone; } @Override public <X extends Exception> void visitChildren(QueryModelVisitor<X> visitor) throws X { super.visitChildren(visitor); for (FromItem join : new ArrayList<FromItem>(joins)) { join.visit(visitor); } for (SqlExpr expr : new ArrayList<SqlExpr>(filters)) { expr.visit(visitor); } } @Override public void replaceChildNode(QueryModelNode current, QueryModelNode replacement) { for (int i = 0, n = joins.size(); i < n; i++) { if (current == joins.get(i)) { joins.set(i, (FromItem)replacement); joinAdded((FromItem)replacement); return; } } for (int i = 0, n = filters.size(); i < n; i++) { if (current == filters.get(i)) { filters.set(i, (SqlExpr)replacement); replacement.setParentNode(this); return; } } super.replaceChildNode(current, replacement); } }