1 package com.quadcap.sql; 2 3 40 41 import java.io.Externalizable ; 42 import java.io.IOException ; 43 import java.io.ObjectInput ; 44 import java.io.ObjectOutput ; 45 46 import java.util.Vector ; 47 48 import java.sql.SQLException ; 49 50 import com.quadcap.sql.types.Op; 51 import com.quadcap.sql.types.Type; 52 import com.quadcap.sql.types.TypeBoolean; 53 import com.quadcap.sql.types.Value; 54 import com.quadcap.sql.types.ValueBoolean; 55 56 import com.quadcap.util.Debug; 57 58 63 public class QuantifiedCompare extends Expression implements Externalizable { 64 Expression e = null; 65 int op = 0; 66 int quant = 0; 67 Expression q = null; 68 boolean not = false; 69 ValueBoolean value = null; 70 71 public QuantifiedCompare() {} 72 73 public QuantifiedCompare(Expression e, int op, int quant, Expression q) { 74 this.e = e; 75 this.op = op; 76 this.quant = quant; 77 this.q = q; 78 } 79 80 public int rank() { return 1; } 81 82 public void invert() { not = !not; } 83 84 static boolean compare(int op, Row a, Row b) throws SQLException { 85 boolean eq = true; 86 for (int i = 1; eq && i <= a.size(); i++) { 87 Value va = a.item(i); 88 Value vb = b.item(i); 89 eq = Value.boolOp(op, va, vb); 90 } 91 return eq; 92 } 93 94 public Type getType(Session session, Cursor cursor) { 95 return TypeBoolean.typeBoolean; 96 } 97 98 public Value getValue(Session session, Cursor cursor) 99 throws SQLException 100 { 101 Cursor qcursor = q.getCursor(session, cursor); 102 try { 103 Row row = e.getValues(session, cursor); 104 boolean res = false; 105 106 if (quant == Op.ALL) { 107 res = true; 108 while (res && qcursor.next()) { 109 Row crow = qcursor.getRow(); 110 res = compare(op, row, crow); 111 } 112 } else if (quant == Op.ANY) { 113 while (!res && qcursor.next()) { 114 Row crow = qcursor.getRow(); 115 res = compare(op, row, crow); 116 } 117 } else { 118 throw new SQLException ("bad quantifier: " + quant, "42000"); 119 } 120 return new ValueBoolean(not ^ res); 121 } finally { 122 qcursor.close(); 123 } 124 } 125 126 public void visitSubExpressions(ExpressionVisitor ev) { 127 ev.visit(e); 128 ev.visit(q); 129 } 130 131 public void readExternal(ObjectInput in) 132 throws IOException , ClassNotFoundException 133 { 134 e = (Expression)in.readObject(); 135 op = in.read(); 136 quant = in.read(); 137 q = (Expression)in.readObject(); 138 not = in.read() == 1; 139 } 140 141 public void writeExternal(ObjectOutput out) throws IOException { 142 out.writeObject(e); 143 out.write(op); 144 out.write(quant); 145 out.writeObject(q); 146 out.write(not ? 1 : 0); 147 } 148 149 public String toString() { 150 StringBuffer sb = new StringBuffer (e.toString()); 151 sb.append(' '); 152 sb.append(Op.toString(op)); 153 sb.append(' '); 154 sb.append(Op.toString(quant)); 155 sb.append(' '); 156 sb.append(q.toString()); 157 return sb.toString(); 158 } 159 } 160 | Popular Tags |