You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by cl...@apache.org on 2008/11/17 21:38:18 UTC

svn commit: r718371 - in /jackrabbit/trunk/jackrabbit-ocm/src: main/java/org/apache/jackrabbit/ocm/query/impl/QueryImpl.java test/java/org/apache/jackrabbit/ocm/manager/query/DigesterSimpleQueryTest.java

Author: clombart
Date: Mon Nov 17 12:38:18 2008
New Revision: 718371

URL: http://svn.apache.org/viewvc?rev=718371&view=rev
Log:
patch for JCR-1853 provided by Shrirang

Modified:
    jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/query/impl/QueryImpl.java
    jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/query/DigesterSimpleQueryTest.java

Modified: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/query/impl/QueryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/query/impl/QueryImpl.java?rev=718371&r1=718370&r2=718371&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/query/impl/QueryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/query/impl/QueryImpl.java Mon Nov 17 12:38:18 2008
@@ -38,7 +38,9 @@
 	
     ClassDescriptor classDescriptor;
 
-    private ArrayList orderByExpressions = new ArrayList();
+    private final static String ORDER_BY_STRING =  "order by ";
+    
+    private String jcrExpression = "";
 
 	/**
 	 * Constructor
@@ -70,7 +72,9 @@
 
 	public void addOrderByDescending(String fieldNameAttribute)
 	{
-		orderByExpressions.add("@" + this.getJcrFieldName(fieldNameAttribute) + " descending");
+		//Changes made to maintain the query state updated with every addition
+		//@author Shrirang Edgaonkar
+		addExpression("@" + this.getJcrFieldName(fieldNameAttribute) + " descending");
 	}
 
 	/**
@@ -79,31 +83,39 @@
 	 */
 	public void addOrderByAscending(String fieldNameAttribute)
 	{
-		orderByExpressions.add("@" + this.getJcrFieldName(fieldNameAttribute) + " ascending");
+		addExpression("@" + this.getJcrFieldName(fieldNameAttribute) + " ascending");
 	}
 	
+    public void addJCRExpression(String jcrExpression) {
+        addExpression(jcrExpression);
+     }
+	
+	
+    private void addExpression(String jcrExpression) {
+		 //@author Shrirang Edgaonkar
+    	 // First time comma is not required
+    	 if(this.jcrExpression.equals(""))
+    	 {	
+    		 this.jcrExpression += jcrExpression ;
+    	 }else
+    		 this.jcrExpression += (" , " + jcrExpression) ;
+    }
+
+	
+    
 	public String getOrderByExpression()
 	{
-		
-		if (orderByExpressions.size() == 0)
-		{
-		   return "";	
-		}
-		
-		String orderByExpression = "order by ";
-		Iterator iterator   = orderByExpressions.iterator();
-		int count=1;
-		while (iterator.hasNext())
-		{
-			   if (count > 1)
-			   {
-				   orderByExpression += " , ";
-			   }
-			   orderByExpression+= (String) iterator.next();
-			   count++;
+		if(jcrExpression.equals(""))
+			return "";
+		else
+		{	
+			//@author Shrirang Edgaonkar
+			//Ensure that the OrderBy string is added only once
+			if(this.jcrExpression.contains(ORDER_BY_STRING))
+				return this.jcrExpression;
+			else
+				return (ORDER_BY_STRING + this.jcrExpression);
 		}
-		
-		return orderByExpression;
 	}
 	
 	

Modified: jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/query/DigesterSimpleQueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/query/DigesterSimpleQueryTest.java?rev=718371&r1=718370&r2=718371&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/query/DigesterSimpleQueryTest.java (original)
+++ jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/query/DigesterSimpleQueryTest.java Mon Nov 17 12:38:18 2008
@@ -18,23 +18,24 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Iterator;
 
 import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.query.QueryResult;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.jackrabbit.ocm.RepositoryLifecycleTestSetup;
 import org.apache.jackrabbit.ocm.DigesterTestBase;
+import org.apache.jackrabbit.ocm.RepositoryLifecycleTestSetup;
 import org.apache.jackrabbit.ocm.exception.JcrMappingException;
 import org.apache.jackrabbit.ocm.manager.ObjectContentManager;
 import org.apache.jackrabbit.ocm.query.Filter;
 import org.apache.jackrabbit.ocm.query.Query;
 import org.apache.jackrabbit.ocm.query.QueryManager;
+import org.apache.jackrabbit.ocm.query.impl.QueryImpl;
 import org.apache.jackrabbit.ocm.testmodel.Page;
 import org.apache.jackrabbit.ocm.testmodel.Paragraph;
 
@@ -86,6 +87,7 @@
             filter.addEqualTo("text", "Para 1");
 
             Query query = queryManager.createQuery(filter);
+            
 
             ObjectContentManager ocm = this.getObjectContentManager();
             Paragraph paragraph = (Paragraph) ocm.getObject(query);
@@ -280,11 +282,80 @@
             assertTrue("Invalid paragraph found", this.containsText(paragraphs,"Para 2"));
             assertTrue("Invalid paragraph found", this.containsText(paragraphs,"Para 3"));
 
-        } catch (Exception e) {
-            e.printStackTrace();
-            fail("Exception occurs during the unit test : " + e);
-        }
-
+	        } catch (Exception e) {
+	            e.printStackTrace();
+	            fail("Exception occurs during the unit test : " + e);
+	        }
+
+    	}
+
+        
+        
+        public void testGetObjectOrderByWithUpdatableJCRExpression() {
+
+            try {
+
+                // Build the Query Object
+                QueryManager queryManager = this.getQueryManager();
+                Filter filter = queryManager.createFilter(Paragraph.class);
+                filter.addLike("text", "Para%");
+                filter.setScope("/test/");
+
+                Query query = queryManager.createQuery(filter);
+                query.addOrderByDescending("text");
+
+                String strQueryBuilderStringWithDescending = ((QueryImpl)query).getOrderByExpression();
+                
+                ObjectContentManager ocm = this.getObjectContentManager();
+                Collection result = ocm.getObjects(query);
+                assertEquals("Invalid number of objects - should be = 3", 3, result.size());
+
+                //Text is Descending
+                Paragraph[] paragraphs = (Paragraph[]) result.toArray(new Paragraph[result.size()]);
+                Iterator iterator = result.iterator();
+                Paragraph para = (Paragraph)iterator.next();
+                assertEquals("Para 3",para.getText());
+                para = (Paragraph)iterator.next();
+                assertEquals("Para 2",para.getText());
+                para = (Paragraph)iterator.next();
+                assertEquals("Para 1",para.getText());
+
+                //Text is Ascending
+                query = queryManager.createQuery(filter);
+                query.addOrderByAscending("text");
+
+                ocm = this.getObjectContentManager();
+                result = ocm.getObjects(query);
+                assertEquals("Invalid number of objects - should be = 3", 3, result.size());
+                iterator = result.iterator();
+                para = (Paragraph)iterator.next();
+                assertEquals("Para 1",para.getText());
+                para = (Paragraph)iterator.next();
+                assertEquals("Para 2",para.getText());
+                para = (Paragraph)iterator.next();
+                assertEquals("Para 3",para.getText());
+
+                //Text is Descending
+                query = queryManager.createQuery(filter);
+                ((QueryImpl)query).addJCRExpression(strQueryBuilderStringWithDescending);
+                ocm = this.getObjectContentManager();
+                result = ocm.getObjects(query);
+                assertEquals("Invalid number of objects - should be = 3", 3, result.size());
+                iterator = result.iterator();
+                para = (Paragraph)iterator.next();
+                assertEquals("Para 3",para.getText());
+                para = (Paragraph)iterator.next();
+                assertEquals("Para 2",para.getText());
+                para = (Paragraph)iterator.next();
+                assertEquals("Para 1",para.getText());
+                
+            
+            } catch (Exception e) {
+                e.printStackTrace();
+                fail("Exception occurs during the unit test : " + e);
+            }
+        
+        
     }
 
     public void testGetObjectsByClassNameAndPath() {