package com.turtleplayer.persistance.framework.sort; import com.turtleplayer.persistance.framework.filter.FieldFilter; import com.turtleplayer.persistance.framework.filter.Filter; import com.turtleplayer.persistance.framework.filter.Operator; import com.turtleplayer.persistance.source.relational.FieldPersistable; import java.util.ArrayList; import java.util.List; /** * TURTLE PLAYER * <p/> * Licensed under MIT & GPL * <p/> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE * OR OTHER DEALINGS IN THE SOFTWARE. * <p/> * More Information @ www.turtle-player.co.uk * * @author Simon Honegger (Hoene84) */ public class FieldOrder<PROJECTION, RESULT, TYPE> implements Order<PROJECTION> { private final FieldPersistable<? super RESULT, TYPE> field; private final SortOrder order; public FieldOrder(FieldPersistable<? super RESULT, TYPE> field, SortOrder order) { this.field = field; this.order = order; } public FieldPersistable<? super RESULT, TYPE> getField() { return field; } public SortOrder getOrder() { return order; } public <R> R accept(OrderVisitor<? extends PROJECTION, R> visitor) { return visitor.visit(this); } @Override public String toString() { return getField().getName() + " " + order; } public Filter<PROJECTION> asFilter(TYPE value, Operator op){ return new FieldFilter<PROJECTION, RESULT, TYPE>(field, op, value); } public static <PROJECTION, RESULT, TYPE> Order<PROJECTION> getMultiFieldOrder(SortOrder order, FieldPersistable<? super RESULT, TYPE>... fields) { List<FieldOrder<PROJECTION, RESULT, TYPE>> orders = new ArrayList<FieldOrder<PROJECTION, RESULT, TYPE>>(); for(FieldPersistable<? super RESULT, TYPE> field : fields) { orders.add(new FieldOrder<PROJECTION, RESULT, TYPE>(field, order)); } return new OrderSet<PROJECTION>(orders); } }