refactored Operation implementations to use OperationMixin

This commit is contained in:
Timo Westkämper 2009-11-30 08:27:28 +00:00
parent 2f60b9b419
commit c0e28df7bb
13 changed files with 217 additions and 252 deletions

View File

@ -27,7 +27,6 @@ import com.mysema.query.types.operation.ODateTime;
import com.mysema.query.types.operation.ONumber;
import com.mysema.query.types.operation.OSimple;
import com.mysema.query.types.operation.OString;
import com.mysema.query.types.operation.OStringArray;
import com.mysema.query.types.operation.OTime;
import com.mysema.query.types.operation.Operation;
import com.mysema.query.types.path.PArray;
@ -110,8 +109,6 @@ public interface Visitor {
void visit(OString expr);
void visit(OStringArray expr);
void visit(PArray<?> expr);
void visit(Path<?> expr);

View File

@ -28,7 +28,6 @@ import com.mysema.query.types.operation.ODateTime;
import com.mysema.query.types.operation.ONumber;
import com.mysema.query.types.operation.OSimple;
import com.mysema.query.types.operation.OString;
import com.mysema.query.types.operation.OStringArray;
import com.mysema.query.types.operation.OTime;
import com.mysema.query.types.operation.Operation;
import com.mysema.query.types.path.PArray;
@ -169,11 +168,6 @@ public abstract class VisitorBase<SubType extends VisitorBase<SubType>> implemen
visit((Operation<?, ?>) expr);
}
@Override
public void visit(OStringArray expr) {
visit((Operation<?, ?>) expr);
}
@Override
public void visit(OTime<?, ?> expr) {
visit((Operation<?, ?>) expr);

View File

@ -6,7 +6,6 @@
package com.mysema.query.types.operation;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.mysema.query.types.Visitor;
@ -26,17 +25,15 @@ public class OBoolean extends EBoolean implements Operation<Boolean, Boolean> {
return new OBoolean(op, args);
}
private final List<Expr<?>> args;
private final Operator<Boolean> op;
private final Operation<Boolean, Boolean> opMixin;
OBoolean(Operator<Boolean> op, Expr<?>... args) {
this(op, Arrays.asList(args));
}
OBoolean(Operator<Boolean> op, List<Expr<?>> args) {
this.op = op;
this.args = Collections.unmodifiableList(args);
opMixin = new OperationMixin<Boolean,Boolean>(this, op, args);
}
@Override
@ -44,32 +41,34 @@ public class OBoolean extends EBoolean implements Operation<Boolean, Boolean> {
v.visit(this);
}
@Override
public Expr<?> getArg(int i) {
return args.get(i);
}
@Override
public List<Expr<?>> getArgs() {
return args;
}
@Override
public Operator<Boolean> getOperator() {
return op;
}
@Override
public EBoolean not() {
if (op == Ops.NOT && args.get(0) instanceof EBoolean){
return (EBoolean) args.get(0);
}else{
return super.not();
}
}
@Override
public EBoolean asExpr() {
return this;
}
@Override
public Expr<?> getArg(int index) {
return opMixin.getArg(index);
}
@Override
public List<Expr<?>> getArgs() {
return opMixin.getArgs();
}
@Override
public Operator<Boolean> getOperator() {
return opMixin.getOperator();
}
@Override
public EBoolean not() {
if (opMixin.getOperator() == Ops.NOT && opMixin.getArg(0) instanceof EBoolean){
return (EBoolean) opMixin.getArg(0);
}else{
return super.not();
}
}
}

View File

@ -6,7 +6,6 @@
package com.mysema.query.types.operation;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.mysema.query.types.Visitor;
@ -39,18 +38,15 @@ public class OComparable<OpType, D extends Comparable<?>> extends
return new OComparable<O,D>(type, op, args);
}
private final List<Expr<?>> args;
private final Operator<OpType> op;
private final Operation<OpType, D> opMixin;
OComparable(Class<D> type, Operator<OpType> op, Expr<?>... args) {
this(type, op, Arrays.asList(args));
}
OComparable(Class<D> type, Operator<OpType> op, List<Expr<?>> args) {
super(type);
this.op = op;
this.args = Collections.unmodifiableList(args);
this.opMixin = new OperationMixin<OpType, D>(this, op, args);
}
@Override
@ -58,23 +54,24 @@ public class OComparable<OpType, D extends Comparable<?>> extends
v.visit(this);
}
@Override
public Expr<?> getArg(int i) {
return args.get(i);
}
@Override
public List<Expr<?>> getArgs() {
return args;
}
@Override
public Operator<OpType> getOperator() {
return op;
}
@Override
public EComparable<D> asExpr() {
return this;
}
@Override
public Expr<?> getArg(int index) {
return opMixin.getArg(index);
}
@Override
public List<Expr<?>> getArgs() {
return opMixin.getArgs();
}
@Override
public Operator<OpType> getOperator() {
return opMixin.getOperator();
}
}

View File

@ -39,43 +39,40 @@ public class ODate <OpType extends Comparable<?>, D extends Comparable<?>> exten
return new ODate<O,D>(type, op, args);
}
private final List<Expr<?>> args;
private final Operator<OpType> op;
private final Operation<OpType, D> opMixin;
ODate(Class<D> type, Operator<OpType> op, Expr<?>... args) {
this(type, op, Arrays.asList(args));
}
ODate(Class<D> type, Operator<OpType> op, List<Expr<?>> args) {
super(type);
this.op = op;
this.args = Collections.unmodifiableList(args);
this.opMixin = new OperationMixin<OpType, D>(this, op, args);
}
@Override
public void accept(Visitor v) {
v.visit(this);
}
@Override
public Expr<?> getArg(int i) {
return args.get(i);
}
@Override
public List<Expr<?>> getArgs() {
return args;
}
@Override
public Operator<OpType> getOperator() {
return op;
}
@Override
public EDate<D> asExpr() {
return this;
}
@Override
public Expr<?> getArg(int index) {
return opMixin.getArg(index);
}
@Override
public List<Expr<?>> getArgs() {
return opMixin.getArgs();
}
@Override
public Operator<OpType> getOperator() {
return opMixin.getOperator();
}
}

View File

@ -38,19 +38,16 @@ EDateTime<D> implements Operation<OpType, D> {
public static <O extends Comparable<?>,D extends Comparable<?>> EDateTime<D> create(Class<D> type, Operator<O> op, Expr<?>... args){
return new ODateTime<O,D>(type, op, args);
}
private final Operation<OpType, D> opMixin;
private final List<Expr<?>> args;
private final Operator<OpType> op;
ODateTime(Class<D> type, Operator<OpType> op, Expr<?>... args) {
this(type, op, Arrays.asList(args));
}
ODateTime(Class<D> type, Operator<OpType> op, List<Expr<?>> args) {
super(type);
this.op = op;
this.args = Collections.unmodifiableList(args);
this.opMixin = new OperationMixin<OpType, D>(this, op, args);
}
@Override
@ -58,23 +55,23 @@ EDateTime<D> implements Operation<OpType, D> {
v.visit(this);
}
@Override
public Expr<?> getArg(int i) {
return args.get(i);
}
@Override
public List<Expr<?>> getArgs() {
return args;
}
@Override
public Operator<OpType> getOperator() {
return op;
}
@Override
public EDateTime<D> asExpr() {
return this;
}
@Override
public Expr<?> getArg(int index) {
return opMixin.getArg(index);
}
@Override
public List<Expr<?>> getArgs() {
return opMixin.getArgs();
}
@Override
public Operator<OpType> getOperator() {
return opMixin.getOperator();
}
}

View File

@ -39,18 +39,15 @@ public class ONumber<OpType extends Number, D extends Number & Comparable<?>>
return new ONumber<O,D>(type, op, args);
}
private final List<Expr<?>> args;
private final Operator<OpType> op;
private final Operation<OpType, D> opMixin;
ONumber(Class<? extends D> type, Operator<OpType> op, Expr<?>... args) {
this(type, op, Arrays.asList(args));
}
ONumber(Class<? extends D> type, Operator<OpType> op, List<Expr<?>> args) {
super(type);
this.op = op;
this.args = Collections.unmodifiableList(args);
this.opMixin = new OperationMixin<OpType, D>(this, op, args);
}
@Override
@ -58,23 +55,23 @@ public class ONumber<OpType extends Number, D extends Number & Comparable<?>>
v.visit(this);
}
@Override
public Expr<?> getArg(int i) {
return args.get(i);
}
@Override
public List<Expr<?>> getArgs() {
return args;
}
@Override
public Operator<OpType> getOperator() {
return op;
}
@Override
public ENumber<D> asExpr() {
return this;
}
@Override
public Expr<?> getArg(int index) {
return opMixin.getArg(index);
}
@Override
public List<Expr<?>> getArgs() {
return opMixin.getArgs();
}
@Override
public Operator<OpType> getOperator() {
return opMixin.getOperator();
}
}

View File

@ -37,9 +37,7 @@ public class OSimple<OpType, D> extends Expr<D> implements Operation<OpType, D>
return new OSimple<OpType,D>(type, op, args);
}
private final List<Expr<?>> args;
private final Operator<OpType> op;
private final Operation<OpType, D> opMixin;
OSimple(Class<? extends D> type, Operator<OpType> op, Expr<?>... args) {
this(type, op, Arrays.asList(args));
@ -47,8 +45,7 @@ public class OSimple<OpType, D> extends Expr<D> implements Operation<OpType, D>
OSimple(Class<? extends D> type, Operator<OpType> op, List<Expr<?>> args) {
super(type);
this.op = op;
this.args = Collections.unmodifiableList(args);
this.opMixin = new OperationMixin<OpType, D>(this, op, args);
}
@Override
@ -56,23 +53,23 @@ public class OSimple<OpType, D> extends Expr<D> implements Operation<OpType, D>
v.visit(this);
}
@Override
public Expr<?> getArg(int i) {
return args.get(i);
}
@Override
public List<Expr<?>> getArgs() {
return args;
}
@Override
public Operator<OpType> getOperator() {
return op;
}
@Override
public Expr<D> asExpr() {
return this;
}
@Override
public Expr<?> getArg(int index) {
return opMixin.getArg(index);
}
@Override
public List<Expr<?>> getArgs() {
return opMixin.getArgs();
}
@Override
public Operator<OpType> getOperator() {
return opMixin.getOperator();
}
}

View File

@ -26,17 +26,14 @@ public class OString extends EString implements Operation<String, String> {
return new OString(op, args);
}
private final List<Expr<?>> args;
private final Operator<String> op;
private final Operation<String, String> opMixin;
OString(Operator<String> op, Expr<?>... args) {
this(op, Arrays.asList(args));
}
OString(Operator<String> op, List<Expr<?>> args) {
this.op = op;
this.args = Collections.unmodifiableList(args);
this.opMixin = new OperationMixin<String, String>(this, op, args);
}
@Override
@ -44,23 +41,24 @@ public class OString extends EString implements Operation<String, String> {
v.visit(this);
}
@Override
public Expr<?> getArg(int i) {
return args.get(i);
}
@Override
public List<Expr<?>> getArgs() {
return args;
}
@Override
public Operator<String> getOperator() {
return op;
}
@Override
public EString asExpr() {
return this;
}
@Override
public Expr<?> getArg(int index) {
return opMixin.getArg(index);
}
@Override
public List<Expr<?>> getArgs() {
return opMixin.getArgs();
}
@Override
public Operator<String> getOperator() {
return opMixin.getOperator();
}
}

View File

@ -1,63 +0,0 @@
/*
* Copyright (c) 2009 Mysema Ltd.
* All rights reserved.
*
*/
package com.mysema.query.types.operation;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.mysema.query.types.Visitor;
import com.mysema.query.types.expr.Expr;
/**
* OStringArray represents a String[] typed operation
*
* @author tiwe
*
*/
@SuppressWarnings("serial")
public class OStringArray extends Expr<String[]> implements
Operation<String, String[]> {
private final List<Expr<?>> args;
private final Operator<String> op;
OStringArray(Operator<String> op, Expr<?>... args) {
this(op, Arrays.asList(args));
}
OStringArray(Operator<String> op, List<Expr<?>> args) {
super(String[].class);
this.op = op;
this.args = Collections.unmodifiableList(args);
}
@Override
public void accept(Visitor v) {
v.visit(this);
}
@Override
public Expr<?> getArg(int i) {
return args.get(i);
}
@Override
public List<Expr<?>> getArgs() {
return args;
}
@Override
public Operator<String> getOperator() {
return op;
}
@Override
public Expr<String[]> asExpr() {
return this;
}
}

View File

@ -38,18 +38,15 @@ public class OTime<OpType, D extends Comparable<?>> extends ETime<D> implements
return new OTime<O,D>(type, op, args);
}
private final List<Expr<?>> args;
private final Operator<OpType> op;
private final Operation<OpType, D> opMixin;
OTime(Class<D> type, Operator<OpType> op, Expr<?>... args) {
this(type, op, Arrays.asList(args));
}
OTime(Class<D> type, Operator<OpType> op, List<Expr<?>> args) {
super(type);
this.op = op;
this.args = Collections.unmodifiableList(args);
this.opMixin = new OperationMixin<OpType, D>(this, op, args);
}
@Override
@ -57,23 +54,23 @@ public class OTime<OpType, D extends Comparable<?>> extends ETime<D> implements
v.visit(this);
}
@Override
public Expr<?> getArg(int i) {
return args.get(i);
}
@Override
public List<Expr<?>> getArgs() {
return args;
}
@Override
public Operator<OpType> getOperator() {
return op;
}
@Override
public ETime<D> asExpr() {
return this;
}
@Override
public Expr<?> getArg(int index) {
return opMixin.getArg(index);
}
@Override
public List<Expr<?>> getArgs() {
return opMixin.getArgs();
}
@Override
public Operator<OpType> getOperator() {
return opMixin.getOperator();
}
}

View File

@ -16,6 +16,11 @@ import com.mysema.query.types.expr.Expr;
* @version $Id$
*/
public interface Operation<OP, RT> {
/**
* @return
*/
Expr<RT> asExpr();
/**
* Get the argument with the given index
*
@ -37,17 +42,12 @@ public interface Operation<OP, RT> {
* @return
*/
Operator<OP> getOperator();
/**
* Get the type of this operation
*
* @return
*/
Class<? extends RT> getType();
/**
* @return
*/
Expr<RT> asExpr();
}

View File

@ -0,0 +1,58 @@
/*
* Copyright (c) 2009 Mysema Ltd.
* All rights reserved.
*
*/
package com.mysema.query.types.operation;
import java.util.Collections;
import java.util.List;
import com.mysema.query.types.expr.Expr;
/**
* @author tiwe
*
* @param <OP>
* @param <RT>
*/
public class OperationMixin<OP, RT> implements Operation<OP, RT> {
private final List<Expr<?>> args;
private final Operator<OP> operator;
private final Expr<RT> self;
public OperationMixin(Expr<RT> self, Operator<OP> operator, List<Expr<?>> args){
this.self = self;
this.operator = operator;
this.args = Collections.unmodifiableList(args);
}
@Override
public Expr<RT> asExpr() {
return self;
}
@Override
public Expr<?> getArg(int i) {
return args.get(i);
}
@Override
public List<Expr<?>> getArgs() {
return args;
}
@Override
public Operator<OP> getOperator() {
return operator;
}
@Override
public Class<? extends RT> getType() {
return self.getType();
}
}