inexpression.java
来自「JoSQL 1.5的源代码。JoSQL(SQL for Java Objects」· Java 代码 · 共 657 行
JAVA
657 行
/* * Copyright 2004-2005 Gary Bentley * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.josql.expressions;import java.util.List;import java.util.ArrayList;import java.util.Collection;import java.util.Map;import java.util.HashMap;import java.util.Iterator;import org.josql.Query;import org.josql.QueryExecutionException;import org.josql.QueryParseException;import org.josql.internal.Utilities;/** * This class represents in [ NOT ] IN [ LIKE ] [ ALL ] expression. * If any of the values listed are Maps or Collections then they are iterated over to see if a match * is found. For Maps only the key values are checked. If you pass a list then it is iterated over * using a <code>for</code> construct rather than an Iterator since it's much faster. * <p> * Note: due to the way that the expression is designed it is POSSIBLE to have a binary expression * in the in list, however at this time that is not supported since it can lead to an ambiguous result, * for example: <code>true IN (true, false)</code> has no sensible meaning. * <p> * Last Modified By: $Author: barrygently $<br /> * Last Modified On: $Date: 2005/04/28 05:48:59 $<br /> * Current Revision: $Revision: 1.3 $<br /> */public class InExpression extends BinaryExpression{ private List items = new ArrayList (); private boolean not = false; private boolean doLike = false; private boolean all = false; private Map lPats = null; private boolean ignoreCase = false; /** * Initialise the IN expression. Init the LHS and then all of the values in the brackets. * * @param q The Query object. * @throws QueryParseException If something goes wrong with the init. */ public void init (Query q) throws QueryParseException { this.left.init (q); int s = this.items.size (); for (int i = 0; i < s; i++) { Expression exp = (Expression) this.items.get (i); exp.init (q); } } public void setIgnoreCase (boolean v) { this.ignoreCase = v; } public boolean isIgnoreCase () { return this.ignoreCase; } public boolean isAll () { return this.all; } public void setAll (boolean v) { this.all = v; } public boolean isDoLike () { return this.doLike; } public void setDoLike (boolean d) { this.doLike = d; } public void setItems (List items) { this.items = items; } public List getItems () { return this.items; } public void addItem (Expression e) { this.items.add (e); } public boolean isNot () { return this.not; } public void setNot (boolean v) { this.not = v; } /** * Return whether this expression evaulates to <code>true</code>. If any of the values on RHS are Maps (keys * only) or Collections then they are iterated over and checked against the LHS. * * @param o The current object to perform the expression on. * @param q The Query object. * @return <code>true</code> if the LHS is "equal" (as determined by: {@link Utilities#isEquals(Object,Object)}) * to any of the values in the brackets. If this is a NOT expression then the result is negated. * @throws QueryExecutionException If the expression cannot be evaluated. */ public boolean isTrue (Object o, Query q) throws QueryExecutionException { // Get the LHS. Object l = this.left.getValue (o, q); String v = null; String wc = String.valueOf (q.getWildcardCharacter ()); if (this.doLike) { if (l != null) { v = l.toString (); if (this.ignoreCase) { v = v.toLowerCase (); } } } int count = 0; // Cycle over our items. int s = this.items.size (); for (int i = 0; i < s; i++) { Expression exp = (Expression) this.items.get (i); // Evaluate it. Object eo = exp.getValue (o, q); boolean eq = false; boolean proc = false; if (eo instanceof Collection) { Collection col = (Collection) eo; eq = this.compareCollection (l, col, v, wc); proc = true; } if (eo instanceof Map) { eq = this.compareMap (l, (Map) eo, v, wc); proc = true; } if (!proc) { // See if the objects are equivalent. eq = this.compareItem (l, eo, v, wc); } if (eq) { count++; if (this.not) { return false; } if (!this.all) { return true; } } } if ((this.all) && (!this.not) && (count == s) ) { return true; } if ((this.all) && (this.not) && (count == 0) ) { return true; } if (this.not) { return true; } return false; } private boolean compareCollection (Object o, Collection c, String v, String wc) { if (c instanceof List) { return this.compareList (o, (List) c, v, wc); } Iterator i = c.iterator (); int count = 0; while (i.hasNext ()) { Object n = i.next (); if (this.compareItem (o, n, v, wc)) { count++; if (!this.all) { return true; } } } if ((this.all) && (!this.not) && (count == c.size ()) ) { return true; } if ((this.all) && (this.not) && (count == 0) ) { return true; } return false; } private boolean compareList (Object o, List l, String v, String wc) { int s = l.size (); int count = 0; for (int i = 0; i < s; i++) { Object n = l.get (i); if (this.compareItem (o, n, v, wc)) { count++; if (!this.all) { return true; } } } if ((this.all) && (!this.not) && (count == s) ) { return true; } if ((this.all) && (this.not) && (count == 0) ) { return true; } return false; } private boolean compareItem (Object o, Object n, String v, String wc) { boolean eq = true; if (this.doLike) { if ((v == null) && (n == null) ) { return true; } if (n == null) { return false; } String vn = n.toString (); if (this.ignoreCase) { vn = vn.toLowerCase (); } List pat = Utilities.getLikePattern (vn, wc); eq = Utilities.matchLikePattern (pat, v); } else { if (this.ignoreCase) { if ((o == null) && (n == null) ) { return true; } if (n == null) { return false; } return o.toString ().equalsIgnoreCase (n.toString ()); } eq = Utilities.isEquals (o, n); } return eq; } private boolean compareMap (Object o, Map m, String v, String wc) { Iterator i = m.keySet ().iterator (); int count = 0; while (i.hasNext ()) { Object n = i.next (); if (this.compareItem (o, n, v, wc)) { count++; if (!this.all) { return true; } } } if ((this.all) && (!this.not) && (count == m.size ()) ) { return true; } if ((this.all) && (this.not) && (count == 0) ) { return true; } return false; } /** * Return a string representation of this expression. * In the form: {@link Expression#toString() Expression} [ NOT ] [$]IN [ LIKE ] [ ALL ] * ( {@link Expression#toString() Expression} [ , {@link Expression#toString() Expression}* ] ) * * @return A string representation of this expression. */ public String toString () { StringBuffer buf = new StringBuffer (this.left.toString ()); buf.append (" "); if (this.isNot ()) { buf.append ("NOT "); } if (this.ignoreCase) { buf.append ("$"); } buf.append ("IN "); if (this.doLike) { buf.append ("LIKE "); } if (this.all) { buf.append ("ALL "); } buf.append ("("); for (int i = 0; i < this.items.size (); i++) { buf.append (this.items.get (i)); if (i < (this.items.size () - 1)) { buf.append (","); } } buf.append (")"); if (this.isBracketed ()) { buf.insert (0, "("); buf.append (")"); } return buf.toString (); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?