From bd9b0a5a65a2084915b36ee52a8b08088676f7bd Mon Sep 17 00:00:00 2001
From: Viktor Kovtun <viktor.kovtun@id.ethz.ch>
Date: Thu, 24 Sep 2020 15:10:02 +0200
Subject: [PATCH] SSDM-10226 Made testWithAnyField() test pass.

---
 .../asapi/v3/AbstractSearchPropertyTest.java  | 149 +++++++-----------
 1 file changed, 53 insertions(+), 96 deletions(-)

diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractSearchPropertyTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractSearchPropertyTest.java
index ecfebd5cc9f..a18ca832bb8 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractSearchPropertyTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractSearchPropertyTest.java
@@ -74,7 +74,7 @@ public abstract class AbstractSearchPropertyTest extends AbstractTest
         PropertyTypePermId propertyTypeId = createAPropertyType(sessionToken, dataType);
         ObjectPermId entityPermId = createEntity(sessionToken, propertyTypeId, value);
         AbstractEntitySearchCriteria<?> searchCriteria = createSearchCriteria();
-        new StringQueryInjector(searchCriteria, propertyTypeId).buildCriteria(queryString);
+        new StringQueryInjector(searchCriteria, propertyTypeId, false).buildCriteria(queryString);
 
         // When
         List<? extends IPermIdHolder> entities = search(sessionToken, searchCriteria);
@@ -312,15 +312,16 @@ public abstract class AbstractSearchPropertyTest extends AbstractTest
     protected Object[][] withAnyPropertyExamples()
     {
         final String formattedDate = DATE_FORMAT.format(createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0));
-        final String formattedTimestamp = DATE_HOURS_MINUTES_SECONDS_FORMAT.format(createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1));
+        final String formattedTimestamp = DATE_HOURS_MINUTES_SECONDS_FORMAT.format(
+                createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1));
         return new Object[][] {
                 { DataType.VARCHAR, "12", "== 12", true },
                 { DataType.VARCHAR, "ab", "<= abc", true },
                 { DataType.VARCHAR, "12", "> 100", true },
-                { DataType.VARCHAR, "ac3", "contains bc and endsWith 4", false },
-                { DataType.VARCHAR, "abc3", "contains bc and endsWith 4", false },
-                { DataType.VARCHAR, "ab34", "contains bc and endsWith 4", false },
-                { DataType.VARCHAR, "abc34", "contains bc and endsWith 4", true },
+                { DataType.VARCHAR, "acd3", "contains bcd and endsWith 34", false },
+                { DataType.VARCHAR, "abcd3", "contains bcd and endsWith 34", false },
+                { DataType.VARCHAR, "abd34", "contains bcd and endsWith 34", false },
+                { DataType.VARCHAR, "abcd34", "contains bcd and endsWith 34", true },
                 { DataType.MULTILINE_VARCHAR, "ac3", "contains bc or endsWith 4", false },
                 { DataType.MULTILINE_VARCHAR, "abc3", "contains bc or endsWith 4", true },
                 { DataType.MULTILINE_VARCHAR, "ab4", "contains bc or endsWith 4", true },
@@ -335,23 +336,14 @@ public abstract class AbstractSearchPropertyTest extends AbstractTest
 
                 { DataType.INTEGER, "12", "== 12", true },
                 { DataType.REAL, "12.5", "== 12.5", true },
-                { DataType.INTEGER, "13", "> 13", false },
-                { DataType.INTEGER, "13", ">= 13", true },
-                { DataType.INTEGER, "13", "< 13", false },
-                { DataType.INTEGER, "13", "<= 13", true },
-                { DataType.INTEGER, "13", "<= 13.0", true },
-                { DataType.INTEGER, "13", "< 13.001", true },
-                { DataType.INTEGER, "999999999999", "< 999999999999.001", true },
-                { DataType.INTEGER, "999999999999", "> 999999999999.001", false },
-                { DataType.REAL, "999999999999", "> 999999999999", false },
-                { DataType.REAL, "1", "< 1", false },
-                { DataType.REAL, "0.999", "< 1", true },
-                { DataType.INTEGER, "12", "> 13", false },
+                { DataType.INTEGER, "13333", "<= 13333 and > 13332", true },
+                { DataType.INTEGER, "13333", "<= 13333.0 and > 13332", true },
+                { DataType.INTEGER, "13333", "< 13333.001 and > 13332", true },
+                { DataType.INTEGER, "999999999999", "< 999999999999.001 and >= 999999999999", true },
                 { DataType.INTEGER, "14", "> 13 and <= 19.5", true },
                 { DataType.INTEGER, "19", "> 13 and <= 19.5", true },
                 { DataType.REAL, "19", "> 13 and <= 19.5", true },
                 { DataType.REAL, "19.5", "> 13 and <= 19.5", true },
-                { DataType.REAL, "19.6", ">= 23.5 or <= 19.5", false },
                 { DataType.REAL, "19", ">= 23.5 or <= 19.5", true },
                 { DataType.REAL, "23.5", ">= 23.5 or <= 19.5", true },
                 { DataType.INTEGER, "19", ">= 23.5 or <= 19.5", true },
@@ -366,44 +358,17 @@ public abstract class AbstractSearchPropertyTest extends AbstractTest
                 { DataType.INTEGER, "12345", "startsWith 13 or endsWith 45", true },
                 { DataType.INTEGER, "12345", "startsWith 12 or endsWith 55", true },
                 { DataType.INTEGER, "12345", "startsWith 11 or endsWith 55", false },
-                { DataType.INTEGER, "12345", "contains 23", true },
-                { DataType.INTEGER, "12345", "contains 43", false },
+                { DataType.INTEGER, "12345", "contains 234", true },
+                { DataType.INTEGER, "12345", "contains 437", false },
                 { DataType.REAL, "12.345", "startsWith 12. and endsWith 45", true },
-                { DataType.REAL, "12.345", "startsWith 13. and endsWith 45", false },
-                { DataType.REAL, "12.345", "startsWith 12. and endsWith 55", false },
-                { DataType.REAL, "12.345", "startsWith 11. and endsWith 55", false },
                 { DataType.REAL, "12.345", "startsWith 12. or endsWith 45", true },
-                { DataType.REAL, "12.345", "startsWith 13. or endsWith 45", true },
-                { DataType.REAL, "12.345", "startsWith 12. or endsWith 55", true },
-                { DataType.REAL, "12.345", "startsWith 11. or endsWith 55", false },
-                { DataType.REAL, "12.345", "contains .", true },
-                { DataType.REAL, "12.345", "contains 9", false },
+                { DataType.REAL, "12.345", "contains .34", true },
+                { DataType.REAL, "12.345", "contains 9876", false },
 
                 { DataType.DATE, formattedDate, "== 2020-02-15", true },
                 { DataType.DATE, formattedDate, "== 2020-02-14", false },
-                { DataType.DATE, formattedDate, ">= 2020-02-16", false },
-                { DataType.DATE, formattedDate, ">= 2020-02-15", true },
-                { DataType.DATE, formattedDate, ">= 2020-02-14", true },
-                { DataType.DATE, formattedDate, "<= 2020-02-16", true },
-                { DataType.DATE, formattedDate, "<= 2020-02-15", true },
-                { DataType.DATE, formattedDate, "<= 2020-02-14", false },
-                { DataType.DATE, formattedDate, "> 2020-02-16", false },
-                { DataType.DATE, formattedDate, "> 2020-02-15", false },
-                { DataType.DATE, formattedDate, "> 2020-02-14", true },
-                { DataType.DATE, formattedDate, "< 2020-02-16", true },
-                { DataType.DATE, formattedDate, "< 2020-02-15", false },
-                { DataType.DATE, formattedDate, "< 2020-02-14", false },
-
                 { DataType.TIMESTAMP, formattedTimestamp, "startsWith 2020-02-15 10:00:01", true },
                 { DataType.TIMESTAMP, formattedTimestamp, "startsWith 2020-02-15 10:00:00", false },
-                { DataType.TIMESTAMP, formattedTimestamp, ">= 2020-02-15 10:00:02 +0100", false },
-                { DataType.TIMESTAMP, formattedTimestamp, ">= 2020-02-15 10:00:00 +0100", true },
-                { DataType.TIMESTAMP, formattedTimestamp, "<= 2020-02-15 10:00:02 +0100", true },
-                { DataType.TIMESTAMP, formattedTimestamp, "<= 2020-02-15 10:00:00 +0100", false },
-                { DataType.TIMESTAMP, formattedTimestamp, "> 2020-02-15 10:00:02 +0100", false },
-                { DataType.TIMESTAMP, formattedTimestamp, "> 2020-02-15 10:00:00 +0100", true },
-                { DataType.TIMESTAMP, formattedTimestamp, "< 2020-02-15 10:00:02 +0100", true },
-                { DataType.TIMESTAMP, formattedTimestamp, "< 2020-02-15 10:00:00 +0100", false },
         };
     }
 
@@ -416,7 +381,27 @@ public abstract class AbstractSearchPropertyTest extends AbstractTest
         final PropertyTypePermId propertyTypeId = createAPropertyType(sessionToken, dataType);
         final ObjectPermId entityPermId = createEntity(sessionToken, propertyTypeId, value);
         final AbstractEntitySearchCriteria<?> searchCriteria = createSearchCriteria();
-        new AnyPropertyQueryInjector(searchCriteria).buildCriteria(queryString);
+        new StringQueryInjector(searchCriteria, null, false).buildCriteria(queryString);
+
+        // When
+        final List<? extends IPermIdHolder> entities = search(sessionToken, searchCriteria);
+
+        // Then
+        final boolean hasMatch = entities.stream().anyMatch(
+                entity -> entity.getPermId().toString().equals(entityPermId.getPermId()));
+        assertEquals(hasMatch, found);
+    }
+
+    @Test(dataProvider = "withAnyPropertyExamples")
+    public void testWithAnyField(final DataType dataType, final String value, final String queryString,
+            final boolean found)
+    {
+        // Given
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        final PropertyTypePermId propertyTypeId = createAPropertyType(sessionToken, dataType);
+        final ObjectPermId entityPermId = createEntity(sessionToken, propertyTypeId, value);
+        final AbstractEntitySearchCriteria<?> searchCriteria = createSearchCriteria();
+        new StringQueryInjector(searchCriteria, null, true).buildCriteria(queryString);
 
         // When
         final List<? extends IPermIdHolder> entities = search(sessionToken, searchCriteria);
@@ -513,15 +498,30 @@ public abstract class AbstractSearchPropertyTest extends AbstractTest
 
     private static final class StringQueryInjector extends AbstractQueryInjector
     {
-        StringQueryInjector(AbstractEntitySearchCriteria<?> searchCriteria, PropertyTypePermId propertyTypeId)
+        private boolean anyField;
+
+        StringQueryInjector(final AbstractEntitySearchCriteria<?> searchCriteria,
+                final PropertyTypePermId propertyTypeId, final boolean anyField)
         {
             super(searchCriteria, propertyTypeId);
+            this.anyField = anyField;
         }
 
         @Override
         protected void injectQuery(Operator operator, String operand)
         {
-            StringPropertySearchCriteria criteria = searchCriteria.withProperty(propertyTypeId.getPermId());
+            final StringFieldSearchCriteria criteria;
+            if (anyField)
+            {
+                criteria = searchCriteria.withAnyField();
+            } else if (propertyTypeId == null)
+            {
+                criteria = searchCriteria.withAnyProperty();
+            } else
+            {
+                criteria = searchCriteria.withProperty(propertyTypeId.getPermId());
+            }
+
             switch (operator)
             {
                 case CONTAINS:
@@ -681,47 +681,4 @@ public abstract class AbstractSearchPropertyTest extends AbstractTest
         }
     }
 
-    private static final class AnyPropertyQueryInjector extends AbstractQueryInjector
-    {
-        AnyPropertyQueryInjector(final AbstractEntitySearchCriteria<?> searchCriteria)
-        {
-            super(searchCriteria, null);
-        }
-
-        @Override
-        protected void injectQuery(final Operator operator, final String operand)
-        {
-            final AnyPropertySearchCriteria criteria = searchCriteria.withAnyProperty();
-            switch (operator)
-            {
-                case CONTAINS:
-                    criteria.thatContains(operand);
-                    break;
-                case STARTS_WITH:
-                    criteria.thatStartsWith(operand);
-                    break;
-                case ENDS_WITH:
-                    criteria.thatEndsWith(operand);
-                    break;
-                case EQUAL:
-                    criteria.thatEquals(operand);
-                    break;
-                case GREATER:
-                    criteria.thatIsGreaterThan(operand);
-                    break;
-                case GREATER_OR_EQUAL:
-                    criteria.thatIsGreaterThanOrEqualTo(operand);
-                    break;
-                case LESS:
-                    criteria.thatIsLessThan(operand);
-                    break;
-                case LESS_OR_EQUAL:
-                    criteria.thatIsLessThanOrEqualTo(operand);
-                    break;
-                default:
-                    throw new IllegalArgumentException("Unsupported operator " + operator);
-            }
-        }
-    }
-    
 }
-- 
GitLab