org.d2rq.algebra
Class NodeRelationOrderer

java.lang.Object
  extended by org.d2rq.db.op.util.OpMutator
      extended by org.d2rq.algebra.NodeRelationOrderer

public class NodeRelationOrderer
extends OpMutator

Orders a NodeRelation by one of its variables. This implies re-ordering of the underyling DatabaseOp, which may require wrapping into a sub-SELECT in some cases, for example if the DatabaseOp has a LIMIT.

Author:
Richard Cyganiak (richard@cyganiak.de)

Constructor Summary
NodeRelationOrderer(NodeRelation nodeRelation, List<OrderOp.OrderSpec> orderSpecs)
           
 
Method Summary
 NodeRelation getNodeRelation()
           
 DatabaseOp visit(SQLOp original)
           
 DatabaseOp visit(TableOp original)
           
 boolean visitEnter(AliasOp original)
           
 boolean visitEnter(EmptyOp original)
           
 boolean visitEnter(InnerJoinOp original)
           
 boolean visitEnter(LimitOp original)
           
 boolean visitEnter(OrderOp original)
           
 boolean visitEnter(SelectOp original)
           
 DatabaseOp visitLeave(AliasOp original, DatabaseOp child)
           
 DatabaseOp visitLeave(EmptyOp original, DatabaseOp child)
          Sorting an empty table is a no-op, so just return the original
 DatabaseOp visitLeave(InnerJoinOp original, Collection<NamedOp> newChildren)
           
 DatabaseOp visitLeave(LimitOp original, DatabaseOp child)
          We have a LIMIT clause; adding ORDER BY would change the result as ordering is done before LIMIT in SQL.
 DatabaseOp visitLeave(OrderOp original, DatabaseOp child)
          We can merge with an existing ORDER BY clause.
 DatabaseOp visitLeave(SelectOp original, DatabaseOp child)
           
 DatabaseOp visitOpTrue()
           
 
Methods inherited from class org.d2rq.db.op.util.OpMutator
getResult, visitEnter, visitEnter, visitEnter, visitLeave, visitLeave, visitLeave
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

NodeRelationOrderer

public NodeRelationOrderer(NodeRelation nodeRelation,
                           List<OrderOp.OrderSpec> orderSpecs)
Method Detail

getNodeRelation

public NodeRelation getNodeRelation()

visitEnter

public boolean visitEnter(InnerJoinOp original)
Overrides:
visitEnter in class OpMutator

visitLeave

public DatabaseOp visitLeave(InnerJoinOp original,
                             Collection<NamedOp> newChildren)
Overrides:
visitLeave in class OpMutator

visitEnter

public boolean visitEnter(SelectOp original)
Overrides:
visitEnter in class OpMutator

visitLeave

public DatabaseOp visitLeave(SelectOp original,
                             DatabaseOp child)
Overrides:
visitLeave in class OpMutator

visitEnter

public boolean visitEnter(AliasOp original)
Overrides:
visitEnter in class OpMutator

visitLeave

public DatabaseOp visitLeave(AliasOp original,
                             DatabaseOp child)
Overrides:
visitLeave in class OpMutator

visitEnter

public boolean visitEnter(OrderOp original)
Overrides:
visitEnter in class OpMutator

visitLeave

public DatabaseOp visitLeave(OrderOp original,
                             DatabaseOp child)
We can merge with an existing ORDER BY clause.

Overrides:
visitLeave in class OpMutator

visitEnter

public boolean visitEnter(LimitOp original)
Overrides:
visitEnter in class OpMutator

visitLeave

public DatabaseOp visitLeave(LimitOp original,
                             DatabaseOp child)
We have a LIMIT clause; adding ORDER BY would change the result as ordering is done before LIMIT in SQL. So we have to wrap the entire thing into a sub-SELECT, order the results of that sub-SELECT, and rename everything in the node makers to use the new table name.

Overrides:
visitLeave in class OpMutator

visitEnter

public boolean visitEnter(EmptyOp original)
Overrides:
visitEnter in class OpMutator

visitLeave

public DatabaseOp visitLeave(EmptyOp original,
                             DatabaseOp child)
Sorting an empty table is a no-op, so just return the original

Overrides:
visitLeave in class OpMutator

visit

public DatabaseOp visit(TableOp original)
Overrides:
visit in class OpMutator

visit

public DatabaseOp visit(SQLOp original)
Overrides:
visit in class OpMutator

visitOpTrue

public DatabaseOp visitOpTrue()
Overrides:
visitOpTrue in class OpMutator