/* * Copyright Aduna (http://www.aduna-software.com/) (c) 2008. * * Licensed under the Aduna BSD-style license. */ package org.openrdf.sail.rdbms.algebra; 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.base.RdbmsQueryModelNodeBase; import org.openrdf.sail.rdbms.algebra.base.RdbmsQueryModelVisitorBase; import org.openrdf.sail.rdbms.algebra.base.SqlExpr; /** * The SQL CASE WHEN THEN END expression. * * @author James Leigh * */ public class SqlCase extends RdbmsQueryModelNodeBase implements SqlExpr { private List<Entry> entries = new ArrayList<Entry>(); public class Entry { private SqlExpr condition; private SqlExpr result; public Entry(SqlExpr condition, SqlExpr result) { super(); this.condition = condition; this.result = result; } public SqlExpr getCondition() { return condition; } public void setCondition(SqlExpr condition) { this.condition = condition; condition.setParentNode(SqlCase.this); } public SqlExpr getResult() { return result; } public void setResult(SqlExpr result) { this.result = result; result.setParentNode(SqlCase.this); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((condition == null) ? 0 : condition.hashCode()); result = prime * result + ((this.result == null) ? 0 : this.result.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final Entry other = (Entry)obj; if (condition == null) { if (other.condition != null) return false; } else if (!condition.equals(other.condition)) return false; if (result == null) { if (other.result != null) return false; } else if (!result.equals(other.result)) return false; return true; } } public void when(SqlExpr condition, SqlExpr expr) { entries.add(new Entry(condition, expr)); condition.setParentNode(this); expr.setParentNode(this); } public List<Entry> getEntries() { return new ArrayList<Entry>(entries); } @Override public <X extends Exception> void visitChildren(QueryModelVisitor<X> visitor) throws X { for (Entry e : entries) { e.getCondition().visit(visitor); e.getResult().visit(visitor); } } @Override public void replaceChildNode(QueryModelNode current, QueryModelNode replacement) { for (Entry e : entries) { if (e.getCondition() == current) { e.setCondition((SqlExpr)replacement); } else if (e.getResult() == current) { e.setResult((SqlExpr)replacement); } } } @Override public SqlCase clone() { SqlCase clone = (SqlCase)super.clone(); clone.entries = new ArrayList<Entry>(); for (Entry e : entries) { clone.when(e.getCondition().clone(), e.getResult().clone()); } return clone; } @Override public <X extends Exception> void visit(RdbmsQueryModelVisitorBase<X> visitor) throws X { visitor.meet(this); } public void removeEntry(Entry e) { entries.remove(e); } public void truncateEntries(Entry e) { int idx = entries.indexOf(e) + 1; if (idx < entries.size()) { entries = entries.subList(0, idx); } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((entries == null) ? 0 : entries.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final SqlCase other = (SqlCase)obj; if (entries == null) { if (other.entries != null) return false; } else if (!entries.equals(other.entries)) return false; return true; } }