You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2016/04/20 13:50:13 UTC

svn commit: r1740122 - in /qpid/java/trunk: broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java common/src/main/java/org/apache/qpid/filter/UnaryExpression.java

Author: kwall
Date: Wed Apr 20 11:50:13 2016
New Revision: 1740122

URL: http://svn.apache.org/viewvc?rev=1740122&view=rev
Log:
QPID-7206: [Java Broker] Query API - allow enums to appear in the set of an IN expression too

Modified:
    qpid/java/trunk/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java
    qpid/java/trunk/common/src/main/java/org/apache/qpid/filter/UnaryExpression.java

Modified: qpid/java/trunk/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java?rev=1740122&r1=1740121&r2=1740122&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java Wed Apr 20 11:50:13 2016
@@ -393,30 +393,54 @@ public class ConfiguredObjectQueryTest e
 
         _query = new ConfiguredObjectQuery(_objects,
                                            String.format("%s", ConfiguredObject.ID),
+                                           String.format("%s <> '%s'", ENUM_ATTR, "toad"));
+
+        results = _query.getResults();
+        assertEquals("Unexpected number of results - enumAttr not equal enum constant", 1, results.size());
+
+        _query = new ConfiguredObjectQuery(_objects,
+                                           String.format("%s", ConfiguredObject.ID),
+                                           String.format("%s = %s", ENUM_ATTR, ENUM2_ATTR));
+
+        results = _query.getResults();
+        assertEquals("Unexpected number of results - two attributes of type enum", 1, results.size());
+
+    }
+    public void testQuery_EnumEquality_InExpresssions() throws Exception
+    {
+        final UUID objectUuid = UUID.randomUUID();
+
+        ConfiguredObject obj = createCO(new HashMap<String, Object>()
+        {{
+            put(ConfiguredObject.ID, objectUuid);
+            put(ENUM_ATTR, Snakes.PYTHON);
+            put(ENUM2_ATTR, Snakes.PYTHON);
+        }});
+
+        _objects.add(obj);
+
+        _query = new ConfiguredObjectQuery(_objects,
+                                           String.format("%s", ConfiguredObject.ID),
                                            String.format("%s in ('%s', '%s', '%s')",
                                                          ENUM_ATTR,
                                                          "toad", Snakes.VIPER, Snakes.PYTHON));
 
-        results = _query.getResults();
-        assertEquals("Unexpected number of results - emumAttr with set", 1, results.size());
-
-        row = _query.getResults().iterator().next();
-        assertEquals("Unexpected row", objectUuid, row.get(0));
+        List<List<Object>> results = _query.getResults();
+        assertEquals("Unexpected number of results - emumAttr with set including the enum's constants", 1, results.size());
 
         _query = new ConfiguredObjectQuery(_objects,
                                            String.format("%s", ConfiguredObject.ID),
-                                           String.format("%s <> '%s'", ENUM_ATTR, "toad"));
+                                           String.format("%s in (%s)", ENUM_ATTR, ENUM2_ATTR));
 
         results = _query.getResults();
-        assertEquals("Unexpected number of results - enumAttr not equal enum constant", 1, results.size());
+        assertEquals("Unexpected number of results - enumAttr with set including enum2Attr", 1, results.size());
 
         _query = new ConfiguredObjectQuery(_objects,
                                            String.format("%s", ConfiguredObject.ID),
-                                           String.format("%s = %s", ENUM_ATTR, ENUM2_ATTR));
+                                           String.format("'%s' in (%s)", Snakes.PYTHON, ENUM_ATTR));
 
         results = _query.getResults();
-        assertEquals("Unexpected number of results - two attributes of type enum", 1, results.size());
-
+        assertEquals("Unexpected number of results - attribute within the set", 1, results.size());
     }
 
     public void testFunctionActualParameterMismatch() throws Exception

Modified: qpid/java/trunk/common/src/main/java/org/apache/qpid/filter/UnaryExpression.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/common/src/main/java/org/apache/qpid/filter/UnaryExpression.java?rev=1740122&r1=1740121&r2=1740122&view=diff
==============================================================================
--- qpid/java/trunk/common/src/main/java/org/apache/qpid/filter/UnaryExpression.java (original)
+++ qpid/java/trunk/common/src/main/java/org/apache/qpid/filter/UnaryExpression.java Wed Apr 20 11:50:13 2016
@@ -226,16 +226,16 @@ public abstract class UnaryExpression<T>
             _allowNonJms = allowNonJms;
         }
 
-        public Object evaluate(E message)
+        public Object evaluate(E expression)
         {
 
-            Object rvalue = getRight().evaluate(message);
+            Object rvalue = getRight().evaluate(expression);
             if (rvalue == null || !(_allowNonJms || rvalue instanceof String))
             {
                 return null;
             }
 
-            if (((_inList != null) && isInList(rvalue, message)) ^ _not)
+            if (((_inList != null) && isInList(rvalue, expression)) ^ _not)
             {
                 return Boolean.TRUE;
             }
@@ -246,36 +246,49 @@ public abstract class UnaryExpression<T>
 
         }
 
-        private boolean isInList(final Object rvalue, final E message)
+        private boolean isInList(final Object rvalue, final E expression)
         {
             for(Object entry : _inList)
             {
-                Object value = entry instanceof Expression ? ((Expression<E>)entry).evaluate(message) : entry;
-                if (rvalue instanceof Enum && value instanceof String)
+                Object currentRvalue = rvalue;
+                Object listItemValue = entry instanceof Expression ? ((Expression<E>)entry).evaluate(expression) : entry;
+                if (currentRvalue instanceof Enum && listItemValue instanceof String)
                 {
-                    try
-                    {
-                        Class rclazz = rvalue.getClass();
-                        value = Enum.valueOf(rclazz, (String)value);
-                    }
-                    catch (IllegalArgumentException iae)
-                    {
-                    }
+                    listItemValue = convertStringToEnumValue(currentRvalue.getClass(), (String) listItemValue);
                 }
-                if((rvalue == null && value == null) || (rvalue != null && rvalue.equals(value)))
+                if (listItemValue instanceof Enum && currentRvalue instanceof String)
+                {
+                    currentRvalue = convertStringToEnumValue(listItemValue.getClass(), (String) currentRvalue);
+                }
+
+                if((currentRvalue == null && listItemValue == null) || (currentRvalue != null && currentRvalue.equals(listItemValue)))
                 {
                     return true;
                 }
-                if(rvalue instanceof Number && value instanceof Number)
+                if(currentRvalue instanceof Number && listItemValue instanceof Number)
                 {
-                    Number num1 = (Number) rvalue;
-                    Number num2 = (Number) value;
+                    Number num1 = (Number) currentRvalue;
+                    Number num2 = (Number) listItemValue;
                     return num1.doubleValue() == num2.doubleValue() && num1.longValue() == num2.longValue();
                 }
             }
             return false;
         }
 
+        private Object convertStringToEnumValue(final Class<?> enumType, String candidateValue)
+        {
+            try
+            {
+                Class rclazz = enumType;
+                return Enum.valueOf(rclazz, candidateValue);
+            }
+            catch (IllegalArgumentException iae)
+            {
+                return candidateValue;
+            }
+        }
+
+        @Override
         public String toString()
         {
             StringBuilder answer = new StringBuilder(String.valueOf(getRight()));



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org