KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > db4o > nativequery > expr > build > ExpressionBuilder


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.expr.build;
22
23 import com.db4o.nativequery.expr.*;
24 import com.db4o.nativequery.expr.cmp.*;
25
26 public class ExpressionBuilder {
27     /**
28      * Optimizations: !(Bool)->(!Bool), !!X->X, !(X==Bool)->(X==!Bool)
29      */

30     public Expression not(Expression expr) {
31         if(expr.equals(BoolConstExpression.TRUE)) {
32             return BoolConstExpression.FALSE;
33         }
34         if(expr.equals(BoolConstExpression.FALSE)) {
35             return BoolConstExpression.TRUE;
36         }
37         if(expr instanceof NotExpression) {
38             return ((NotExpression)expr).expr();
39         }
40         if(expr instanceof ComparisonExpression) {
41             ComparisonExpression cmpExpr=(ComparisonExpression)expr;
42             if(cmpExpr.right() instanceof ConstValue) {
43                 ConstValue rightConst=(ConstValue)cmpExpr.right();
44                 if(rightConst.value() instanceof Boolean JavaDoc) {
45                     Boolean JavaDoc boolVal=(Boolean JavaDoc)rightConst.value();
46                     // new Boolean() instead of Boolean.valueOf() for .NET conversion
47
return new ComparisonExpression(cmpExpr.left(),new ConstValue(new Boolean JavaDoc(!boolVal.booleanValue())),cmpExpr.op());
48                 }
49             }
50         }
51         return new NotExpression(expr);
52     }
53
54     /**
55      * Optimizations: f&&X->f, t&&X->X, X&&X->X, X&&!X->f
56      */

57     public Expression and(Expression left, Expression right) {
58         if(left.equals(BoolConstExpression.FALSE)||right.equals(BoolConstExpression.FALSE)) {
59             return BoolConstExpression.FALSE;
60         }
61         if(left.equals(BoolConstExpression.TRUE)) {
62             return right;
63         }
64         if(right.equals(BoolConstExpression.TRUE)) {
65             return left;
66         }
67         if(left.equals(right)) {
68             return left;
69         }
70         if(negatives(left,right)) {
71             return BoolConstExpression.FALSE;
72         }
73         return new AndExpression(left,right);
74     }
75
76     /**
77      * Optimizations: X||t->t, f||X->X, X||X->X, X||!X->t
78      */

79     public Expression or(Expression left, Expression right) {
80         if(left.equals(BoolConstExpression.TRUE)||right.equals(BoolConstExpression.TRUE)) {
81             return BoolConstExpression.TRUE;
82         }
83         if(left.equals(BoolConstExpression.FALSE)) {
84             return right;
85         }
86         if(right.equals(BoolConstExpression.FALSE)) {
87             return left;
88         }
89         if(left.equals(right)) {
90             return left;
91         }
92         if(negatives(left,right)) {
93             return BoolConstExpression.TRUE;
94         }
95         return new OrExpression(left,right);
96     }
97
98     /**
99      * Optimizations: static bool roots
100      */

101     public BoolConstExpression constant(Boolean JavaDoc value) {
102         return BoolConstExpression.expr(value.booleanValue());
103     }
104
105     public Expression ifThenElse(Expression cond, Expression truePath, Expression falsePath) {
106         Expression expr=checkBoolean(cond,truePath,falsePath);
107         if(expr!=null) {
108             return expr;
109         }
110         return or(and(cond,truePath),and(not(cond),falsePath));
111     }
112
113     private Expression checkBoolean(Expression cmp,Expression trueExpr,Expression falseExpr) {
114         if(cmp instanceof BoolConstExpression) {
115             return null;
116         }
117         if(trueExpr instanceof BoolConstExpression) {
118             boolean leftNegative=trueExpr.equals(BoolConstExpression.FALSE);
119             if(!leftNegative) {
120                 return or(cmp,falseExpr);
121             }
122             else {
123                 return and(not(cmp),falseExpr);
124             }
125         }
126         if(falseExpr instanceof BoolConstExpression) {
127             boolean rightNegative=falseExpr.equals(BoolConstExpression.FALSE);
128             if(!rightNegative) {
129                 return and(cmp,trueExpr);
130             }
131             else {
132                 return or(not(cmp),falseExpr);
133             }
134         }
135         if(cmp instanceof NotExpression) {
136             cmp=((NotExpression)cmp).expr();
137             Expression swap=trueExpr;
138             trueExpr=falseExpr;
139             falseExpr=swap;
140         }
141         if(trueExpr instanceof OrExpression) {
142             OrExpression orExpr=(OrExpression)trueExpr;
143             Expression orLeft=orExpr.left();
144             Expression orRight=orExpr.right();
145             if(falseExpr.equals(orRight)) {
146                 Expression swap=orRight;
147                 orRight=orLeft;
148                 orLeft=swap;
149             }
150             if(falseExpr.equals(orLeft)) {
151                 return or(orLeft,and(cmp,orRight));
152             }
153         }
154         if(falseExpr instanceof AndExpression) {
155             AndExpression andExpr=(AndExpression)falseExpr;
156             Expression andLeft=andExpr.left();
157             Expression andRight=andExpr.right();
158             if(trueExpr.equals(andRight)) {
159                 Expression swap=andRight;
160                 andRight=andLeft;
161                 andLeft=swap;
162             }
163             if(trueExpr.equals(andLeft)) {
164                 return and(andLeft,or(cmp,andRight));
165             }
166         }
167         return null;
168     }
169
170     private boolean negatives(Expression left,Expression right) {
171         return negativeOf(left,right)||negativeOf(right,left);
172     }
173     
174     private boolean negativeOf(Expression right, Expression left) {
175         return (right instanceof NotExpression)&&((NotExpression)right).expr().equals(left);
176     }
177 }
178
Popular Tags