/* * Copyright Aduna (http://www.aduna-software.com/) (c) 2007. * * Licensed under the Aduna BSD-style license. */ package org.openrdf.query.algebra; import java.util.ArrayList; import java.util.List; /** * An order operator that can be used to order bindings as specified by a set of * value expressions. * * @author Arjohn Kampman */ public class Order extends UnaryTupleOperator { /*-----------* * Variables * *-----------*/ private List<OrderElem> elements = new ArrayList<OrderElem>(); /*--------------* * Constructors * *--------------*/ public Order() { } public Order(TupleExpr arg) { super(arg); } public Order(TupleExpr arg, OrderElem... elements) { this(arg); addElements(elements); } public Order(TupleExpr arg, Iterable<OrderElem> elements) { this(arg); addElements(elements); } /*---------* * Methods * *---------*/ public List<OrderElem> getElements() { return elements; } public void setElements(List<OrderElem> elements) { this.elements = elements; } public void addElements(OrderElem... elements) { for (OrderElem pe : elements) { addElement(pe); } } public void addElements(Iterable<OrderElem> elements) { for (OrderElem pe : elements) { addElement(pe); } } public void addElement(OrderElem pe) { elements.add(pe); pe.setParentNode(this); } public <X extends Exception> void visit(QueryModelVisitor<X> visitor) throws X { visitor.meet(this); } @Override public <X extends Exception> void visitChildren(QueryModelVisitor<X> visitor) throws X { for (OrderElem elem : elements) { elem.visit(visitor); } super.visitChildren(visitor); } @Override public void replaceChildNode(QueryModelNode current, QueryModelNode replacement) { int index = elements.indexOf(current); if (index >= 0) { elements.set(index, (OrderElem)replacement); replacement.setParentNode(this); } else { super.replaceChildNode(current, replacement); } } @Override public Order clone() { Order clone = (Order)super.clone(); List<OrderElem> elementsClone = new ArrayList<OrderElem>(getElements().size()); for (OrderElem elem : getElements()) { elementsClone.add(elem.clone()); } clone.setElements(elementsClone); return clone; } }