KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > db4o > nativequery > optimization > ComparisonQueryGeneratingVisitor


1 /* Copyright (C) 2004 - 2006 db4objects Inc. http://www.db4o.com
2
3 This file is part of the db4o open source object database.
4
5 db4o is free software; you can redistribute it and/or modify it under
6 the terms of version 2 of the GNU General Public License as published
7 by the Free Software Foundation and as clarified by db4objects' GPL
8 interpretation policy, available at
9 http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
10 Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
11 Suite 350, San Mateo, CA 94403, USA.
12
13 db4o is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */

21 package com.db4o.nativequery.optimization;
22
23 import java.lang.reflect.*;
24
25 import com.db4o.nativequery.expr.cmp.*;
26 import com.db4o.nativequery.expr.cmp.field.*;
27
28 final class ComparisonQueryGeneratingVisitor implements ComparisonOperandVisitor {
29     private Object JavaDoc _predicate;
30     
31     private Object JavaDoc _value=null;
32
33     public Object JavaDoc value() {
34         return _value;
35     }
36     
37     public void visit(ConstValue operand) {
38         _value = operand.value();
39     }
40
41     public void visit(FieldValue operand) {
42         operand.parent().accept(this);
43         Class JavaDoc clazz=((operand.parent() instanceof StaticFieldRoot) ? (Class JavaDoc)_value : _value.getClass());
44         try {
45             Field field=ReflectUtil.fieldFor(clazz,operand.fieldName());
46             _value=field.get(_value); // arg is ignored for static
47
} catch (Exception JavaDoc exc) {
48             exc.printStackTrace();
49         }
50     }
51
52     Object JavaDoc add(Object JavaDoc a,Object JavaDoc b) {
53         if(a instanceof Double JavaDoc||b instanceof Double JavaDoc) {
54             return new Double JavaDoc(((Double JavaDoc)a).doubleValue()+ ((Double JavaDoc)b).doubleValue());
55         }
56         if(a instanceof Float JavaDoc||b instanceof Float JavaDoc) {
57             return new Float JavaDoc(((Float JavaDoc)a).floatValue()+ ((Float JavaDoc)b).floatValue());
58         }
59         if(a instanceof Long JavaDoc||b instanceof Long JavaDoc) {
60             return new Long JavaDoc(((Long JavaDoc)a).longValue()+ ((Long JavaDoc)b).longValue());
61         }
62         return new Integer JavaDoc(((Integer JavaDoc)a).intValue()+ ((Integer JavaDoc)b).intValue());
63     }
64
65     Object JavaDoc subtract(Object JavaDoc a,Object JavaDoc b) {
66         if(a instanceof Double JavaDoc||b instanceof Double JavaDoc) {
67             return new Double JavaDoc(((Double JavaDoc)a).doubleValue()- ((Double JavaDoc)b).doubleValue());
68         }
69         if(a instanceof Float JavaDoc||b instanceof Float JavaDoc) {
70             return new Float JavaDoc(((Float JavaDoc)a).floatValue() - ((Float JavaDoc)b).floatValue());
71         }
72         if(a instanceof Long JavaDoc||b instanceof Long JavaDoc) {
73             return new Long JavaDoc(((Long JavaDoc)a).longValue() - ((Long JavaDoc)b).longValue());
74         }
75         return new Integer JavaDoc(((Integer JavaDoc)a).intValue() - ((Integer JavaDoc)b).intValue());
76     }
77
78     Object JavaDoc multiply(Object JavaDoc a,Object JavaDoc b) {
79         if(a instanceof Double JavaDoc||b instanceof Double JavaDoc) {
80             return new Double JavaDoc(((Double JavaDoc)a).doubleValue() * ((Double JavaDoc)b).doubleValue());
81         }
82         if(a instanceof Float JavaDoc||b instanceof Float JavaDoc) {
83             return new Float JavaDoc(((Float JavaDoc)a).floatValue() * ((Float JavaDoc)b).floatValue());
84         }
85         if(a instanceof Long JavaDoc||b instanceof Long JavaDoc) {
86             return new Long JavaDoc(((Long JavaDoc)a).longValue() * ((Long JavaDoc)b).longValue());
87         }
88         return new Integer JavaDoc(((Integer JavaDoc)a).intValue() * ((Integer JavaDoc)b).intValue());
89     }
90
91     Object JavaDoc divide(Object JavaDoc a,Object JavaDoc b) {
92         if(a instanceof Double JavaDoc||b instanceof Double JavaDoc) {
93             return new Double JavaDoc(((Double JavaDoc)a).doubleValue()/ ((Double JavaDoc)b).doubleValue());
94         }
95         if(a instanceof Float JavaDoc||b instanceof Float JavaDoc) {
96             return new Float JavaDoc(((Float JavaDoc)a).floatValue() / ((Float JavaDoc)b).floatValue());
97         }
98         if(a instanceof Long JavaDoc||b instanceof Long JavaDoc) {
99             return new Long JavaDoc(((Long JavaDoc)a).longValue() / ((Long JavaDoc)b).longValue());
100         }
101         return new Integer JavaDoc(((Integer JavaDoc)a).intValue() / ((Integer JavaDoc)b).intValue());
102     }
103
104     public void visit(ArithmeticExpression operand) {
105         operand.left().accept(this);
106         Object JavaDoc left=_value;
107         operand.right().accept(this);
108         Object JavaDoc right=_value;
109         switch(operand.op().id()) {
110             case ArithmeticOperator.ADD_ID:
111                 _value=add(left,right);
112                 break;
113             case ArithmeticOperator.SUBTRACT_ID:
114                 _value=subtract(left,right);
115                 break;
116             case ArithmeticOperator.MULTIPLY_ID:
117                 _value=multiply(left,right);
118                 break;
119             case ArithmeticOperator.DIVIDE_ID:
120                 _value=divide(left,right);
121                 break;
122         }
123     }
124
125     public void visit(CandidateFieldRoot root) {
126     }
127
128     public void visit(PredicateFieldRoot root) {
129         _value=_predicate;
130     }
131
132     public void visit(StaticFieldRoot root) {
133         try {
134             _value=Class.forName(root.className());
135         } catch (ClassNotFoundException JavaDoc e) {
136             e.printStackTrace();
137         }
138     }
139
140     public void visit(ArrayAccessValue operand) {
141         operand.parent().accept(this);
142         Object JavaDoc parent=_value;
143         operand.index().accept(this);
144         Integer JavaDoc index=(Integer JavaDoc)_value;
145         _value=Array.get(parent, index.intValue());
146     }
147
148     public void visit(MethodCallValue operand) {
149         operand.parent().accept(this);
150         Object JavaDoc receiver=_value;
151         Object JavaDoc[] params=new Object JavaDoc[operand.args().length];
152         for (int paramIdx = 0; paramIdx < operand.args().length; paramIdx++) {
153             operand.args()[paramIdx].accept(this);
154             params[paramIdx]=_value;
155         }
156         Class JavaDoc clazz=receiver.getClass();
157         if(operand.parent().root() instanceof StaticFieldRoot&&clazz.equals(Class JavaDoc.class)) {
158             clazz=(Class JavaDoc)receiver;
159         }
160         Method method=ReflectUtil.methodFor(clazz,operand.methodName(),operand.paramTypes());
161         try {
162             _value=method.invoke(receiver, params);
163         } catch (Exception JavaDoc exc) {
164             exc.printStackTrace();
165             _value=null;
166         }
167     }
168
169     public ComparisonQueryGeneratingVisitor(Object JavaDoc predicate) {
170         super();
171         this._predicate = predicate;
172     }
173     
174 }
Popular Tags