Author: brj
Date: Sun Jan 15 02:04:50 2006
New Revision: 369195

URL: http://svn.apache.org/viewcvs?rev=369195&view=rev
Log:
improved OQL-support for InCriteria

Modified:
    
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/BetweenCriteria.java
    
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/BindableCriterion.java
    
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/InCriteria.java
    
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/SelectionCriteria.java
    
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLLexer.java
    
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLParser.java
    
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLQueryImpl.java
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/oql-ojb.g
    db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/odmg/OQLTest.java

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/BetweenCriteria.java
URL: 
http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/BetweenCriteria.java?rev=369195&r1=369194&r2=369195&view=diff
==============================================================================
--- 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/BetweenCriteria.java
 (original)
+++ 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/BetweenCriteria.java
 Sun Jan 15 02:04:50 2006
@@ -53,6 +53,13 @@
        }
     }
 
+    /**
+     * @see org.apache.ojb.broker.query.BindableCriterion#isMultiBindable()
+     */
+    public boolean isMultiBindable()
+    {
+        return true;
+    }
 
        /**
         * Gets the value2.

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/BindableCriterion.java
URL: 
http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/BindableCriterion.java?rev=369195&r1=369194&r2=369195&view=diff
==============================================================================
--- 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/BindableCriterion.java
 (original)
+++ 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/BindableCriterion.java
 Sun Jan 15 02:04:50 2006
@@ -35,5 +35,11 @@
      */
     public void bind(Object newValue);
 
+    /**
+     * Indicates whether the Criteria can be bound more than once. 
+     * (ie. BetweenCriteria with 2 Parameters)
+     * @return true if multi bindable
+     */
+    public boolean isMultiBindable();
 }
 

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/InCriteria.java
URL: 
http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/InCriteria.java?rev=369195&r1=369194&r2=369195&view=diff
==============================================================================
--- 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/InCriteria.java
 (original)
+++ 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/InCriteria.java
 Sun Jan 15 02:04:50 2006
@@ -68,7 +68,7 @@
        }
        
        private Object m_attribute;
-       private Collection m_values;
+       private List m_values;
        private boolean m_translateAttribute;
        private boolean m_preprocessed = false;
 
@@ -83,7 +83,7 @@
     InCriteria(Object anAttribute, Collection values, boolean negative, 
boolean translate)
     {
         m_attribute = anAttribute;
-        m_values = values;
+        setValues(values);
         m_translateAttribute = translate;
         setNegative(negative);
     }
@@ -108,15 +108,16 @@
         List result = new ArrayList();
         Collection inCollection = new ArrayList();
         int inLimit = getSqlInLimit(aPb);
+        List values = getValues();
        
-        if (m_values == null || m_values.isEmpty())
+        if (values == null || values.isEmpty())
         {
             // OQL creates empty Criteria for late binding
-            result.add(buildInCriterion(m_values));
+            result.add(buildInCriterion(values));
         }
         else
         {
-            Iterator iter = m_values.iterator();
+            Iterator iter = values.iterator();
 
             while (iter.hasNext())
             {
@@ -150,6 +151,30 @@
     }
 
     /**
+     * @return the values
+     */
+    private List getValues()
+    {
+        return m_values;
+    }
+
+    /**
+     * @param values the values to set
+     */
+    private void setValues(Collection values)
+    {
+        List newValues = null;
+        
+        if (values != null)
+        {
+            newValues = new ArrayList(values.size());
+            newValues.addAll(values);
+        }
+        
+        m_values = newValues;
+    }
+
+    /**
      * Preprocess the Criteria using a PersistenceBroker.
      * Build list of InCriterion based on SQL-IN-LIMIT.
      * 
@@ -174,16 +199,46 @@
     }
 
     /**
-     * sets the value of the criteria to newValue. Used by the ODMG 
OQLQuery.bind() operation
+     * @see 
org.apache.ojb.broker.query.BindableCriterion#bind(java.lang.Object)
      */
     public void bind(Object newValue)
     {
-        m_values = (Collection) newValue;
+        if (newValue instanceof Collection)
+        {
+            setValues((Collection) newValue);
+        }
+        else
+        {
+            bindSingleObject(newValue);
+        }    
     }
 
+    /**
+     * Bind a single Object to the next null position.
+     * @param obj
+     */
+    private void bindSingleObject(Object obj)
+    {
+        int idx = getValues().indexOf(null);
+        
+        getValues().set(idx, obj);
+    }
+    
+    /**
+     * @see org.apache.ojb.broker.query.BindableCriterion#isBound()
+     * @return true if the collection does not contain nulls
+     */
     public boolean isBound()
     {
-        return (m_values != null);
+       return !getValues().contains(null);
+    }
+
+    /**
+     * @see org.apache.ojb.broker.query.BindableCriterion#isMultiBindable()
+     */
+    public boolean isMultiBindable()
+    {
+        return true;
     }
     
     /**

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/SelectionCriteria.java
URL: 
http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/SelectionCriteria.java?rev=369195&r1=369194&r2=369195&view=diff
==============================================================================
--- 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/SelectionCriteria.java
 (original)
+++ 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/query/SelectionCriteria.java
 Sun Jan 15 02:04:50 2006
@@ -97,6 +97,14 @@
                setBound(true);
        }
 
+    /**
+     * @see org.apache.ojb.broker.query.BindableCriterion#isMultiBindable()
+     */
+    public boolean isMultiBindable()
+    {
+        return false;
+    }
+
        /**
         * Answer the value
         */

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLLexer.java
URL: 
http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLLexer.java?rev=369195&r1=369194&r2=369195&view=diff
==============================================================================
--- 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLLexer.java 
(original)
+++ 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLLexer.java 
Sun Jan 15 02:04:50 2006
@@ -19,24 +19,28 @@
 
 
 import java.io.InputStream;
+import antlr.TokenStreamException;
+import antlr.TokenStreamIOException;
+import antlr.TokenStreamRecognitionException;
+import antlr.CharStreamException;
+import antlr.CharStreamIOException;
+import antlr.ANTLRException;
 import java.io.Reader;
 import java.util.Hashtable;
-
-import antlr.ANTLRHashString;
+import antlr.CharScanner;
+import antlr.InputBuffer;
 import antlr.ByteBuffer;
 import antlr.CharBuffer;
-import antlr.CharStreamException;
-import antlr.CharStreamIOException;
-import antlr.InputBuffer;
-import antlr.LexerSharedInputState;
-import antlr.NoViableAltForCharException;
-import antlr.RecognitionException;
 import antlr.Token;
+import antlr.CommonToken;
+import antlr.RecognitionException;
+import antlr.NoViableAltForCharException;
+import antlr.MismatchedCharException;
 import antlr.TokenStream;
-import antlr.TokenStreamException;
-import antlr.TokenStreamIOException;
-import antlr.TokenStreamRecognitionException;
+import antlr.ANTLRHashString;
+import antlr.LexerSharedInputState;
 import antlr.collections.impl.BitSet;
+import antlr.SemanticException;
 
 /**
  * This OQL grammar has been derived from a OQL sample grammar from the ODMG
@@ -266,7 +270,7 @@
                                        }
                                else {
                                        if (LA(1)==EOF_CHAR) {uponEOF(); 
_returnToken = makeToken(Token.EOF_TYPE);}
-                               else {throw new 
NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+                               else {throw new 
NoViableAltForCharException((char)LA(1), getFilename(), getLine(), 
getColumn());}
                                }
                                }
                                if ( _returnToken==null ) continue tryAgain; // 
found SKIP token
@@ -633,7 +637,7 @@
                }
                default:
                {
-                       throw new NoViableAltForCharException(LA(1), 
getFilename(), getLine(), getColumn());
+                       throw new NoViableAltForCharException((char)LA(1), 
getFilename(), getLine(), getColumn());
                }
                }
                }
@@ -678,7 +682,7 @@
                }
                default:
                {
-                       throw new NoViableAltForCharException(LA(1), 
getFilename(), getLine(), getColumn());
+                       throw new NoViableAltForCharException((char)LA(1), 
getFilename(), getLine(), getColumn());
                }
                }
                }
@@ -754,7 +758,7 @@
                }
                default:
                {
-                       throw new NoViableAltForCharException(LA(1), 
getFilename(), getLine(), getColumn());
+                       throw new NoViableAltForCharException((char)LA(1), 
getFilename(), getLine(), getColumn());
                }
                }
                }
@@ -766,7 +770,7 @@
                                matchRange('0','9');
                        }
                        else {
-                               if ( _cnt34>=1 ) { break _loop34; } else {throw 
new NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
+                               if ( _cnt34>=1 ) { break _loop34; } else {throw 
new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), 
getColumn());}
                        }
                        
                        _cnt34++;
@@ -796,7 +800,7 @@
                                        mTOK_UNSIGNED_INTEGER(false);
                                }
                                else {
-                                       if ( _cnt37>=1 ) { break _loop37; } 
else {throw new NoViableAltForCharException(LA(1), getFilename(), getLine(), 
getColumn());}
+                                       if ( _cnt37>=1 ) { break _loop37; } 
else {throw new NoViableAltForCharException((char)LA(1), getFilename(), 
getLine(), getColumn());}
                                }
                                
                                _cnt37++;
@@ -826,7 +830,7 @@
                                        mTOK_UNSIGNED_INTEGER(false);
                                }
                                else {
-                                       if ( _cnt40>=1 ) { break _loop40; } 
else {throw new NoViableAltForCharException(LA(1), getFilename(), getLine(), 
getColumn());}
+                                       if ( _cnt40>=1 ) { break _loop40; } 
else {throw new NoViableAltForCharException((char)LA(1), getFilename(), 
getLine(), getColumn());}
                                }
                                
                                _cnt40++;
@@ -877,7 +881,7 @@
                }
                default:
                {
-                       throw new NoViableAltForCharException(LA(1), 
getFilename(), getLine(), getColumn());
+                       throw new NoViableAltForCharException((char)LA(1), 
getFilename(), getLine(), getColumn());
                }
                }
                if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
@@ -993,7 +997,7 @@
                }
                default:
                {
-                       throw new NoViableAltForCharException(LA(1), 
getFilename(), getLine(), getColumn());
+                       throw new NoViableAltForCharException((char)LA(1), 
getFilename(), getLine(), getColumn());
                }
                }
                }

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLParser.java
URL: 
http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLParser.java?rev=369195&r1=369194&r2=369195&view=diff
==============================================================================
--- 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLParser.java 
(original)
+++ 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLParser.java 
Sun Jan 15 02:04:50 2006
@@ -18,6 +18,20 @@
 package org.apache.ojb.odmg.oql;
 
 
+import antlr.TokenBuffer;
+import antlr.TokenStreamException;
+import antlr.TokenStreamIOException;
+import antlr.ANTLRException;
+import antlr.LLkParser;
+import antlr.Token;
+import antlr.TokenStream;
+import antlr.RecognitionException;
+import antlr.NoViableAltException;
+import antlr.MismatchedTokenException;
+import antlr.SemanticException;
+import antlr.ParserSharedInputState;
+import antlr.collections.impl.BitSet;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Vector;
@@ -25,20 +39,11 @@
 import org.apache.ojb.broker.metadata.ClassDescriptor;
 import org.apache.ojb.broker.metadata.MetadataManager;
 import org.apache.ojb.broker.metadata.ObjectReferenceDescriptor;
+import org.apache.ojb.broker.util.ClassHelper;
 import org.apache.ojb.broker.query.Criteria;
 import org.apache.ojb.broker.query.Query;
 import org.apache.ojb.broker.query.QueryByCriteria;
 import org.apache.ojb.broker.query.QueryFactory;
-import org.apache.ojb.broker.util.ClassHelper;
-
-import antlr.NoViableAltException;
-import antlr.ParserSharedInputState;
-import antlr.RecognitionException;
-import antlr.Token;
-import antlr.TokenBuffer;
-import antlr.TokenStream;
-import antlr.TokenStreamException;
-import antlr.collections.impl.BitSet;
 
 public class OQLParser extends antlr.LLkParser       implements 
OQLLexerTokenTypes
  {
@@ -1089,26 +1094,23 @@
        }
        
        public final Collection  argList() throws RecognitionException, 
TokenStreamException {
-               Collection coll = null;
+               Collection coll = new ArrayList();
                
                
                try {      // for error handling
-                       
-                                       Collection temp = new Vector();
-                                   Object val;
-                               
+                       Object val;
                        match(TOK_LPAREN);
                        {
                        if ((_tokenSet_16.member(LA(1)))) {
                                val=literal();
-                               if (val != null) {temp.add(val);}
+                               coll.add(val);
                                {
                                _loop124:
                                do {
                                        if ((LA(1)==TOK_COMMA)) {
                                                match(TOK_COMMA);
                                                val=literal();
-                                               if (val != null) 
{temp.add(val);}
+                                               coll.add(val);
                                        }
                                        else {
                                                break _loop124;
@@ -1125,9 +1127,6 @@
                        
                        }
                        match(TOK_RPAREN);
-                       
-                                       if (!temp.isEmpty()) {coll = temp;}
-                                       
                }
                catch (RecognitionException ex) {
                        reportError(ex);

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLQueryImpl.java
URL: 
http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLQueryImpl.java?rev=369195&r1=369194&r2=369195&view=diff
==============================================================================
--- 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLQueryImpl.java
 (original)
+++ 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/OQLQueryImpl.java
 Sun Jan 15 02:04:50 2006
@@ -21,14 +21,11 @@
 import java.util.ListIterator;
 import java.util.Vector;
 
-import org.apache.commons.lang.SystemUtils;
-import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.ojb.broker.ManageableCollection;
 import org.apache.ojb.broker.PBKey;
 import org.apache.ojb.broker.PersistenceBroker;
 import org.apache.ojb.broker.PersistenceBrokerFactory;
 import org.apache.ojb.broker.accesslayer.OJBIterator;
-import org.apache.ojb.broker.query.BetweenCriteria;
 import org.apache.ojb.broker.query.BindableCriterion;
 import org.apache.ojb.broker.query.Criteria;
 import org.apache.ojb.broker.query.Query;
@@ -127,17 +124,16 @@
             BindableCriterion crit = (BindableCriterion) 
getBindIterator().next();
             crit.bind(parameter);
 
-            // BRJ: bind is called twice for between
-            if (crit instanceof BetweenCriteria && !crit.isBound())
+            // BRJ: some criteria can be bound more than once, ie. 
BetweenCiriteria, InCriteria
+            if (crit.isMultiBindable() && !crit.isBound())
             {
                 getBindIterator().previous();
             }
         }
         catch (Exception e)
         {
-            Throwable t = ExceptionUtils.getRootCause(e);
-            if(t == null) t = e;
-            throw new QueryParameterCountInvalidException("Root exception is:" 
+ SystemUtils.LINE_SEPARATOR + ExceptionUtils.getFullStackTrace(t));
+            log.error("Can't bind parameter: " + parameter, e);
+            throw new QueryParameterCountInvalidException(e.getMessage());
         }
     }
 

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/oql-ojb.g
URL: 
http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/oql-ojb.g?rev=369195&r1=369194&r2=369195&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/oql-ojb.g 
(original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/oql/oql-ojb.g 
Sun Jan 15 02:04:50 2006
@@ -828,28 +828,21 @@
             { value = java.sql.Timestamp.valueOf(tokTs.getText()); }
     ;
 
-argList returns [Collection coll = null] :
-// return a collection of parameters or null if we only have $1,$2...
-           {
-               Collection temp = new Vector();
-           Object val;
-           }
+argList returns [Collection coll = new ArrayList()] :
+// BRJ: return a collection of parameters, or a collection of nulls if we only 
have $1,$2...
+
+           { Object val; }
 
         TOK_LPAREN
         (
             val = literal
 
-            // BRJ: do not add null objects
-            {if (val != null) {temp.add(val);} }
+            { coll.add(val); }
             (
                 TOK_COMMA
                    val = literal
-                   {if (val != null) {temp.add(val);} }
+                   { coll.add(val); }
             )*
         )?
         TOK_RPAREN
-
-               {
-               if (!temp.isEmpty()) {coll = temp;}
-               }
     ;

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/odmg/OQLTest.java
URL: 
http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/odmg/OQLTest.java?rev=369195&r1=369194&r2=369195&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/odmg/OQLTest.java 
(original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/odmg/OQLTest.java 
Sun Jan 15 02:04:50 2006
@@ -203,6 +203,28 @@
                tx.commit();
        }
 
+    public void testQueryIn_2() throws Exception
+    {
+        // deleteData(database, odmg, Article.class);
+
+        Transaction tx = odmg.newTransaction();
+        tx.begin();
+
+        OQLQuery query1 = odmg.newOQLQuery();
+        query1.create("select anArticle from " + Article.class.getName() + " 
where articleId in(30, 31, 32) order by articleId");
+        List result1 = (List) query1.execute();
+
+
+        OQLQuery query2 = odmg.newOQLQuery();
+        query2.create("select anArticle from " + Article.class.getName() + " 
where articleId in($1, $2, $3) order by articleId");
+        query2.bind(new Integer(30));
+        query2.bind(new Integer(31));
+        query2.bind(new Integer(32));
+        List result2 = (List) query2.execute();
+
+        assertEquals(result1.size(), result2.size());
+        tx.commit();
+    }
        public void testQueryNull() throws Exception
        {
                Transaction tx = odmg.newTransaction();



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to