1 package uba.db.sql.language;
2
3 /***
4 * Clase base para simplificar la creación de objetos que representen
5 * expresiones boleanas binarias.
6 *
7 * @version $Revision: 1.3 $
8 */
9 public abstract class ComparisonBehavior implements BooleanValue {
10 private SingleValue left;
11 private SingleValue right;
12
13 /***
14 * Crea una operacion booleana de dos terminos.
15 *
16 * @param left
17 * termino izquierdo.
18 * @param right
19 * termino derecho.
20 */
21 public ComparisonBehavior(SingleValue left, SingleValue right) {
22 this.left = left;
23 this.right = right;
24 }
25
26 /***
27 * @see java.lang.Object#toString()
28 */
29 public String toString() {
30 return left + operatorAsString() + right;
31 }
32
33 /***
34 * Las subclases deben implementar este método retornando la representacion
35 * en String del operador que representan.
36 */
37 protected abstract String operatorAsString();
38
39 /***
40 * Evalua la condición usando el método
41 * {@link BooleanValue#isTrueWith(EvaluationContext)}, pero retorna una
42 * instancia de {@link Boolean} para ser compatible con la interfaz
43 * {@link SingleValue}.
44 *
45 * @param context
46 * contexto de evaluación.
47 *
48 * @return una instancia de {@link Boolean} con el valor de verdad de
49 * {@link BooleanValue#isTrueWith(EvaluationContext)}
50 */
51 public Object valueWith(EvaluationContext context) {
52 return new Boolean(isTrueWith(context));
53 }
54
55 /***
56 * Esta implementación obtiene los valores de ambos terminos usando
57 * {@link SingleValue#valueWith(EvaluationContext)} y luego delega la
58 * comparación a {@link #compareValues(Comparable, Comparable)}.
59 *
60 * @see BooleanValue#isTrueWith(EvaluationContext)
61 */
62 public boolean isTrueWith(EvaluationContext context) {
63 return compareValues((Comparable) left.valueWith(context), (Comparable) right
64 .valueWith(context));
65 }
66
67 /***
68 * Retorna el termino a la izquierda.
69 */
70 public SingleValue left() {
71 return left;
72 }
73
74 /***
75 * Retorna el termino a la derecha.
76 */
77 public SingleValue right() {
78 return right;
79 }
80
81 /***
82 * Las sub-clases deben implementar este método para comparar dos valores.
83 *
84 * @see #isTrueWith(EvaluationContext)
85 *
86 * @param leftValue
87 * valor a la izquierda.
88 * @param rightValue
89 * valor a la derecha
90 *
91 * @return el resultado de la comparación
92 */
93 protected abstract boolean compareValues(Comparable leftValue, Comparable rightValue);
94 }