From 50356b72ebf06021f020eb57d266e849b228de06 Mon Sep 17 00:00:00 2001
From: Viktor Kovtun <viktor.kovtun@id.ethz.ch>
Date: Tue, 22 Sep 2020 17:55:15 +0200
Subject: [PATCH] SSDM-10151 Added tests for searching by any property.

---
 .../asapi/v3/AbstractSearchPropertyTest.java  | 170 +++++++++++++++++-
 1 file changed, 164 insertions(+), 6 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 b3ba709064a..ecfebd5cc9f 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
@@ -19,8 +19,7 @@ package ch.ethz.sis.openbis.systemtest.asapi.v3;
 import static ch.ethz.sis.openbis.generic.server.asapi.v3.search.translator.SearchCriteriaTranslator.DATE_FORMAT;
 import static ch.ethz.sis.openbis.generic.server.asapi.v3.search.translator.SearchCriteriaTranslator.DATE_HOURS_MINUTES_SECONDS_FORMAT;
 import static ch.ethz.sis.openbis.generic.server.asapi.v3.search.translator.condition.utils.TranslatorUtils.parseDate;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.fail;
+import static org.testng.Assert.*;
 
 import java.text.DateFormat;
 import java.util.Calendar;
@@ -28,15 +27,12 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.DatePropertySearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.*;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.ObjectPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPermIdHolder;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractEntitySearchCriteria;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.NumberPropertySearchCriteria;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.StringPropertySearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.DataType;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.id.PropertyTypePermId;
@@ -312,6 +308,125 @@ public abstract class AbstractSearchPropertyTest extends AbstractTest
         }
     }
 
+    @DataProvider
+    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));
+        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.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 },
+                { DataType.MULTILINE_VARCHAR, "abc4", "contains bc or endsWith 4", true },
+                { DataType.MULTILINE_VARCHAR, "12", "> 100 and <= 13", true },
+                { DataType.BOOLEAN, "true", "== true", true },
+                { DataType.BOOLEAN, "true", "== false", false },
+                { DataType.BOOLEAN, "false", "contains rue", false },
+                { DataType.BOOLEAN, "true", "contains rue", true },
+                { DataType.BOOLEAN, "false", "contains als", true },
+                { DataType.BOOLEAN, "true", "contains als", false },
+
+                { 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, "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 },
+                { DataType.INTEGER, "24", ">= 23.5 or <= 19.5", true },
+                { DataType.INTEGER, "19", ">= 24 or <= 19", true },
+                { DataType.INTEGER, "24", ">= 24 or <= 19", true },
+                { DataType.INTEGER, "12345", "startsWith 12 and endsWith 45", true },
+                { DataType.INTEGER, "12345", "startsWith 13 and endsWith 45", false },
+                { DataType.INTEGER, "12345", "startsWith 12 and endsWith 55", false },
+                { DataType.INTEGER, "12345", "startsWith 11 and endsWith 55", false },
+                { DataType.INTEGER, "12345", "startsWith 12 or endsWith 45", true },
+                { 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.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.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 },
+        };
+    }
+
+    @Test(dataProvider = "withAnyPropertyExamples")
+    public void testWithAnyProperty(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 AnyPropertyQueryInjector(searchCriteria).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);
+    }
+
     private Date createDate(final int year, final int month, final int date, final int hrs, final int min,
             final int sec)
     {
@@ -565,5 +680,48 @@ 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