You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2012/12/09 20:00:51 UTC

svn commit: r1419094 - in /cxf/trunk/rt/rs/extensions/search/src: main/java/org/apache/cxf/jaxrs/ext/search/client/ test/java/org/apache/cxf/jaxrs/ext/search/client/

Author: sergeyb
Date: Sun Dec  9 19:00:50 2012
New Revision: 1419094

URL: http://svn.apache.org/viewvc?rev=1419094&view=rev
Log:
Few updates to SearchConditionBuilder to make it simpler to build some comlpex expressions

Modified:
    cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/CompleteCondition.java
    cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/FiqlSearchConditionBuilder.java
    cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/Property.java
    cxf/trunk/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/client/FiqlSearchConditionBuilderTest.java

Modified: cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/CompleteCondition.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/CompleteCondition.java?rev=1419094&r1=1419093&r2=1419094&view=diff
==============================================================================
--- cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/CompleteCondition.java (original)
+++ cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/CompleteCondition.java Sun Dec  9 19:00:50 2012
@@ -34,6 +34,10 @@ public interface CompleteCondition {
     /** shortcut for or().is() */
     Property or(String name);
     
+    /** Wraps the current expression in ()*/
+    CompleteCondition wrap();
+    
+    
     /** Finalize condition construction and build search condition query. */
     String query();
 }

Modified: cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/FiqlSearchConditionBuilder.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/FiqlSearchConditionBuilder.java?rev=1419094&r1=1419093&r2=1419094&view=diff
==============================================================================
--- cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/FiqlSearchConditionBuilder.java (original)
+++ cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/FiqlSearchConditionBuilder.java Sun Dec  9 19:00:50 2012
@@ -86,6 +86,7 @@ public class FiqlSearchConditionBuilder 
         private Builder parent;
         private DateFormat df;
         private boolean timeZoneSupported;
+        private String currentCompositeOp;
 
         public Builder(Map<String, String> properties) {
             parent = null;
@@ -128,22 +129,31 @@ public class FiqlSearchConditionBuilder 
             return condition(FiqlParser.LT, toString(date));
         }
 
-        public CompleteCondition equalTo(String literalOrPattern) {
-            return condition(FiqlParser.EQ, literalOrPattern);
+        public CompleteCondition equalTo(String value, String...moreValues) {
+            return condition(FiqlParser.EQ, value, (Object[])moreValues);
         }
 
-        public CompleteCondition equalTo(double number) {
-            return condition(FiqlParser.EQ, number);
+        public CompleteCondition equalTo(Double number, Double... moreValues) {
+            return condition(FiqlParser.EQ, number, (Object[])moreValues);
         }
         
-        public CompleteCondition equalTo(long number) {
-            return condition(FiqlParser.EQ, number);
+        public CompleteCondition equalTo(Long number, Long... moreValues) {
+            return condition(FiqlParser.EQ, number, (Object[])moreValues);
+        }
+        
+        public CompleteCondition equalTo(Integer number, Integer... moreValues) {
+            return condition(FiqlParser.EQ, number, (Object[])moreValues);
+        }
+
+        public CompleteCondition equalTo(Date date, Date... moreValues) {
+            return condition(FiqlParser.EQ, date, (Object[])moreValues);
         }
 
-        public CompleteCondition equalTo(Date date) {
-            return condition(FiqlParser.EQ, toString(date));
+        public CompleteCondition equalTo(Duration distanceFromNow, Duration... moreValues) {
+            return condition(FiqlParser.EQ, distanceFromNow, (Object[])moreValues);
         }
 
+        
         public CompleteCondition greaterOrEqualTo(double number) {
             return condition(FiqlParser.GE, number);
         }
@@ -224,10 +234,6 @@ public class FiqlSearchConditionBuilder 
             return condition(FiqlParser.LT, distanceFromNow);
         }
 
-        public CompleteCondition equalTo(Duration distanceFromNow) {
-            return condition(FiqlParser.EQ, distanceFromNow);
-        }
-
         public CompleteCondition notAfter(Duration distanceFromNow) {
             return condition(FiqlParser.LE, distanceFromNow);
         }
@@ -240,12 +246,29 @@ public class FiqlSearchConditionBuilder 
             return condition(FiqlParser.NEQ, distanceFromNow);
         }
 
-        protected CompleteCondition condition(String operator, Object value) {
-            result += operator + value;
+        protected CompleteCondition condition(String operator, Object value, Object...moreValues) {
+            String name = result;
+            result += operator + toString(value);
+            if (moreValues != null && moreValues.length > 0) {
+                for (Object next : moreValues) {
+                    result += "," + name + operator + toString(next);
+                }
+                currentCompositeOp = FiqlParser.OR;
+            }
             return this;
         }
         
         public PartialCondition and() {
+            if (currentCompositeOp == FiqlParser.OR 
+                || parent != null && parent.currentCompositeOp == FiqlParser.OR) {
+                if (parent != null) {
+                    parent.result = "(" + parent.result;
+                    result += ")";
+                } else {
+                    wrap();
+                }
+                currentCompositeOp = FiqlParser.AND;
+            }
             result += FiqlParser.AND;
             return this;
         }
@@ -255,6 +278,16 @@ public class FiqlSearchConditionBuilder 
         }
 
         public PartialCondition or() {
+            if (currentCompositeOp == FiqlParser.AND
+                || parent != null && parent.currentCompositeOp == FiqlParser.AND) {
+                if (parent != null) {
+                    parent.result = "(" + parent.result;
+                    result += ")";
+                } else {
+                    wrap();
+                }
+                currentCompositeOp = FiqlParser.OR;
+            }
             result += FiqlParser.OR;
             return this;
         }
@@ -263,6 +296,12 @@ public class FiqlSearchConditionBuilder 
             return or().is(name);
         }
 
+        public CompleteCondition wrap() {
+            result = "(" + result + ")";
+            this.currentCompositeOp = null;
+            return this;
+        }
+        
         public CompleteCondition and(CompleteCondition c1, CompleteCondition c2, CompleteCondition... cn) {
             result += "(" + ((Builder)c1).buildPartial(this) + FiqlParser.AND
                       + ((Builder)c2).buildPartial(this);
@@ -289,14 +328,21 @@ public class FiqlSearchConditionBuilder 
             return b;
         }
 
-        private String toString(Date date) {
-            String s = df.format(date);
-            if (timeZoneSupported) {
-                // zone in XML is "+01:00" in Java is "+0100"; adding semicolon
-                int len = s.length();
-                return s.substring(0, len - 2) + ":" + s.substring(len - 2, len);
+        private String toString(Object value) {
+            if (value == null) {
+                return null;
+            }
+            if (value.getClass() == Date.class) {
+                String s = df.format((Date)value);
+                if (timeZoneSupported) {
+                    // zone in XML is "+01:00" in Java is "+0100"; adding semicolon
+                    int len = s.length();
+                    return s.substring(0, len - 2) + ":" + s.substring(len - 2, len);
+                } else {
+                    return s;
+                }
             } else {
-                return s;
+                return value.toString();
             }
         }
     }

Modified: cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/Property.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/Property.java?rev=1419094&r1=1419093&r2=1419094&view=diff
==============================================================================
--- cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/Property.java (original)
+++ cxf/trunk/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/client/Property.java Sun Dec  9 19:00:50 2012
@@ -27,19 +27,22 @@ import javax.xml.datatype.Duration;
  */
 public interface Property {
     /** Is textual property equal to given literal or matching given pattern? */
-    CompleteCondition equalTo(String literalOrPattern);
+    CompleteCondition equalTo(String value, String ...moreValues);
 
     /** Is numeric property equal to given double number? */
-    CompleteCondition equalTo(double number);
+    CompleteCondition equalTo(Double number, Double... moreValues);
 
     /** Is numeric property equal to given long number? */
-    CompleteCondition equalTo(long number);
+    CompleteCondition equalTo(Long number, Long... moreValues);
+    
+    /** Is numeric property equal to given long number? */
+    CompleteCondition equalTo(Integer number, Integer... moreValues);
     
     /** Is date property same as given date? */
-    CompleteCondition equalTo(Date date);
+    CompleteCondition equalTo(Date date, Date... moreValues);
 
     /** Is date property same as date distant from now by given period of time? */
-    CompleteCondition equalTo(Duration distanceFromNow);
+    CompleteCondition equalTo(Duration distanceFromNow, Duration... moreValues);
 
     /** Is textual property different than given literal or not matching given pattern? */
     CompleteCondition notEqualTo(String literalOrPattern);

Modified: cxf/trunk/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/client/FiqlSearchConditionBuilderTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/client/FiqlSearchConditionBuilderTest.java?rev=1419094&r1=1419093&r2=1419094&view=diff
==============================================================================
--- cxf/trunk/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/client/FiqlSearchConditionBuilderTest.java (original)
+++ cxf/trunk/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/client/FiqlSearchConditionBuilderTest.java Sun Dec  9 19:00:50 2012
@@ -297,12 +297,46 @@ public class FiqlSearchConditionBuilderT
 
     @Test
     public void testComplex2() {
-        String ret = b.is("foo").equalTo(123.4).or().is("foo").equalTo("null").and().or(
+        String ret = b.is("foo").equalTo(123L).or().is("foo").equalTo("null").and().or(
             b.is("bar").equalTo("asadf*"), 
             b.is("baz").lessThan(20).and().or(
-                b.is("sub1").equalTo(0),
-                b.is("sub2").equalTo(0))).query();
+                b.is("sub1").equalTo(0L),
+                b.is("sub2").equalTo(0L))).query();
         
-        assertEquals("foo==123.4,foo==null;(bar==asadf*,baz=lt=20;(sub1==0,sub2==0))", ret);
+        assertEquals("foo==123,foo==null;(bar==asadf*,baz=lt=20;(sub1==0,sub2==0))", ret);
+    }
+    
+    @Test
+    public void testOrAndImplicitWrap() {
+        String ret = b.is("foo").equalTo(1, 2).and("bar").equalTo("baz").query();
+        
+        assertEquals("(foo==1,foo==2);bar==baz", ret);
+    }
+    
+    @Test
+    public void testMultipleOrShortcut() {
+        // alternative to
+        // b.is("foo").equalTo(123.4).or().is("foo").equalTo("137.8")
+        String ret = b.is("foo").equalTo(123.4, 137.8).query();
+        
+        assertEquals("foo==123.4,foo==137.8", ret);
+    }
+    
+    @Test
+    public void testMultipleOrShortcutWithAnd() {
+        // alternative to
+        // b.is("foo").equalTo(123.4).or().is("foo").equalTo("137.8")
+        String ret = b.is("foo").equalTo(123.4, 137.8).and("bar").equalTo("baz").query();
+        
+        assertEquals("(foo==123.4,foo==137.8);bar==baz", ret);
+    }
+    
+    @Test
+    public void testMultipleOrShortcutWithAnd2() {
+        // alternative to
+        // b.is("foo").equalTo(123.4).or().is("foo").equalTo("137.8")
+        String ret = b.is("foo").equalTo(123.4, 137.8).or("n").equalTo("n1").and("bar").equalTo("baz").query();
+        
+        assertEquals("(foo==123.4,foo==137.8,n==n1);bar==baz", ret);
     }
 }