Skip to content
Snippets Groups Projects
Commit 1e919f03 authored by Chad Leong's avatar Chad Leong :speech_balloon:
Browse files

Merge branch 'cherry-pick-for-693' into 'release/0.25'

Cherry-pick 'Fix parsing string arrays' into release/0.25

See merge request !703
parents ee156ee4 30a54c2e
No related branches found
No related tags found
1 merge request!703Cherry-pick 'Fix parsing string arrays' into release/0.25
Pipeline #238828 failed
Showing
with 285 additions and 21 deletions
......@@ -489,7 +489,6 @@ The following software have components provided under the terms of this license:
- Jackson-module-parameter-names (from https://repo1.maven.org/maven2/com/fasterxml/jackson/module/jackson-module-parameter-names)
- Jakarta RESTful WS API (from https://github.com/eclipse-ee4j/jaxrs-api)
- Jakarta Validation API (from https://beanvalidation.org)
- Jakarta XML Binding API (from https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api, https://repo1.maven.org/maven2/org/jboss/spec/javax/xml/bind/jboss-jaxb-api_2.3_spec)
- Java Architecture for XML Binding (from http://jaxb.java.net/, https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api)
- Java Libraries for Amazon Simple WorkFlow (from https://github.com/aws/aws-swf-flow-library)
- Java Native Access (from https://github.com/java-native-access/jna, https://github.com/twall/jna)
......@@ -629,7 +628,7 @@ The following software have components provided under the terms of this license:
- Spring Expression Language (SpEL) (from https://github.com/SpringSource/spring-framework, https://github.com/spring-projects/spring-framework, https://repo1.maven.org/maven2/org/springframework/spring-expression)
- Spring JMS (from http://www.springframework.org, https://github.com/SpringSource/spring-framework, https://github.com/spring-projects/spring-framework, https://repo1.maven.org/maven2/org/springframework/spring-jms)
- Spring Messaging (from https://github.com/spring-projects/spring-framework)
- Spring Plugin - Metadata Extension (from https://repo1.maven.org/maven2/org/springframework/plugin/spring-plugin-metadata)
- Spring Plugin - Metadata Extension (from https://github.com/spring-projects/spring-plugin/spring-plugin-metadata, https://repo1.maven.org/maven2/org/springframework/plugin/spring-plugin-metadata)
- Spring Plugin Core (from https://github.com/spring-projects/spring-plugin/spring-plugin-core, https://repo1.maven.org/maven2/org/springframework/plugin/spring-plugin-core)
- Spring Security - Core (from http://spring.io/spring-security, https://repo1.maven.org/maven2/org/springframework/security/spring-security-core, https://spring.io/projects/spring-security, https://spring.io/spring-security)
- Spring Security - Namespace Configuration Module (from http://spring.io/spring-security, https://repo1.maven.org/maven2/org/springframework/security/spring-security-config, https://spring.io/projects/spring-security, https://spring.io/spring-security)
......@@ -819,7 +818,7 @@ The following software have components provided under the terms of this license:
- jersey-core-server (from https://repo1.maven.org/maven2/org/glassfish/jersey/core/jersey-server)
- jersey-ext-bean-validation (from https://repo1.maven.org/maven2/org/glassfish/jersey/ext/jersey-bean-validation)
- jersey-media-json-jackson (from https://repo1.maven.org/maven2/org/glassfish/jersey/media/jersey-media-json-jackson)
- org.locationtech.jts:jts-core (from https://repo1.maven.org/maven2/org/locationtech/jts/jts-core)
- jts-core (from https://repo1.maven.org/maven2/org/locationtech/jts/jts-core)
========================================================================
BSL-1.0
......@@ -942,11 +941,9 @@ The following software have components provided under the terms of this license:
- JUnit Jupiter API (from http://junit.org/junit5/, https://junit.org/junit5/)
- JUnit Jupiter Engine (from http://junit.org/junit5/, https://junit.org/junit5/)
- JUnit Jupiter Params (from http://junit.org/junit5/, https://junit.org/junit5/)
- JUnit Platform Commons (from http://junit.org/junit5/, https://junit.org/junit5/)
- JUnit Platform Engine API (from http://junit.org/junit5/, https://junit.org/junit5/)
- Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca)
- Jakarta Validation API (from https://beanvalidation.org)
- Jakarta XML Binding API (from https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api, https://repo1.maven.org/maven2/org/jboss/spec/javax/xml/bind/jboss-jaxb-api_2.3_spec)
- Jetty :: Utilities (from http://jetty.mortbay.org, http://www.eclipse.org/jetty, https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-util, https://repo1.maven.org/maven2/org/mortbay/jetty/jetty-util)
- Logback Contrib :: JSON :: Classic (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-json-classic)
- Logback Contrib :: JSON :: Core (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-json-core)
......@@ -959,7 +956,7 @@ The following software have components provided under the terms of this license:
- aopalliance-repackaged (from https://repo1.maven.org/maven2/org/glassfish/hk2/external/aopalliance-repackaged)
- jersey-core-server (from https://repo1.maven.org/maven2/org/glassfish/jersey/core/jersey-server)
- jersey-media-json-jackson (from https://repo1.maven.org/maven2/org/glassfish/jersey/media/jersey-media-json-jackson)
- org.locationtech.jts:jts-core (from https://repo1.maven.org/maven2/org/locationtech/jts/jts-core)
- jts-core (from https://repo1.maven.org/maven2/org/locationtech/jts/jts-core)
========================================================================
EPL-2.0
......@@ -1170,7 +1167,6 @@ The following software have components provided under the terms of this license:
- JTidy (from http://jtidy.sourceforge.net)
- JUL to SLF4J bridge (from http://www.slf4j.org)
- Jackson-core (from http://wiki.fasterxml.com/JacksonHome, https://github.com/FasterXML/jackson-core)
- Jakarta XML Binding API (from https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api, https://repo1.maven.org/maven2/org/jboss/spec/javax/xml/bind/jboss-jaxb-api_2.3_spec)
- Java Client Runtime for AutoRest (from https://github.com/Azure/autorest-clientruntime-for-java)
- Java JWT (from http://www.jwt.io, https://github.com/auth0/java-jwt)
- Lucene Common Analyzers (from <https://repo1.maven.org/maven2/org/apache/lucene/lucene-analyzers-common>, https://repo1.maven.org/maven2/org/apache/lucene/lucene-analyzers-common)
......
......@@ -64,8 +64,12 @@ public class AttributeParsingServiceImpl implements IAttributeParsingService {
@Override
public void tryParseValueArray(Class<?> attributeClass, String recordId, String attributeName, Object attributeVal, Map<String, Object> dataMap) {
BiFunction<String, Object, ?> parser;
ElasticType elasticType = ElasticType.forValue(attributeClass.getSimpleName());
ElasticType elasticType = attributeClass != String.class ? ElasticType.forValue(attributeClass.getSimpleName()) : ElasticType.TEXT;
switch (elasticType) {
case TEXT:
case KEYWORD:
parser = this.stringParser::parseString;
break;
case DOUBLE:
parser = this.numberParser::parseDouble;
break;
......@@ -91,7 +95,7 @@ public class AttributeParsingServiceImpl implements IAttributeParsingService {
}
try {
List<String> parsedStringList = isArrayType(attributeVal);
List<String> parsedStringList = isArrayType(attributeVal, attributeClass);
List out = new ArrayList<>();
for (Object o : parsedStringList) {
out.add(parser.apply(attributeName, o));
......@@ -232,8 +236,17 @@ public class AttributeParsingServiceImpl implements IAttributeParsingService {
}
private List<String> isArrayType(Object attributeVal) {
try {
private List<String> isArrayType(Object attributeVal, Class<?> attributeClass) {
// Handling string arrays as they're not valid JSON for code below
if (attributeVal != null && attributeClass == String.class && attributeVal instanceof List<?>) {
List<String> result = new ArrayList<>();
for (Object item: (List<Object>)(List<?>) attributeVal) {
result.add(item == null ? null : String.valueOf(item));
}
return result;
}
try {
String value = attributeVal == null ? null : String.valueOf(attributeVal);
if (attributeVal == null || Strings.isNullOrEmpty(value)) {
return Collections.EMPTY_LIST;
......
......@@ -114,11 +114,13 @@ public class StorageIndexerPayloadMapper {
switch (elasticType) {
case KEYWORD:
case KEYWORD_ARRAY:
case TEXT:
case TEXT_ARRAY:
this.attributeParsingService.tryParseString(recordId, schemaPropertyName, storageRecordValue, dataCollectorMap);
break;
case KEYWORD_ARRAY:
case TEXT_ARRAY:
this.attributeParsingService.tryParseValueArray(String.class, recordId, schemaPropertyName, storageRecordValue, dataCollectorMap);
break;
case INTEGER_ARRAY:
this.attributeParsingService.tryParseValueArray(Integer.class, recordId, schemaPropertyName, storageRecordValue, dataCollectorMap);
break;
......
......@@ -227,6 +227,21 @@ public class AttributeParsingServiceImplTest {
assertEquals(dataMap.get("side"), "true");
}
@Test
public void should_parseValidStringArray() {
Map<String, Object> dataMap = new HashMap<>();
final Map<Object, Object> inputs = new HashMap<Object, Object>() {
{
put("[]", new String[]{});
put("[test]", new String[]{"test"});
put("[aaa, bbb]", new String[]{"aaa", "bbb"});
put("[\"139.987\", \"20\"]", new String[]{"139.987", "20"});
}
};
this.validateInput(this.sut::tryParseValueArray, String.class, String.class, inputs, dataMap);
}
@Test
public void should_parseDate_tryParseDate() {
Map<String, Object> dataMap = new HashMap<>();
......
......@@ -174,4 +174,10 @@ public class Steps extends SchemaServiceRecordSteps {
throws Throwable {
super.i_should_get_object_in_search_response(innerField, index);
}
@Then("^I should be able to search for record from \"([^\"]*)\" by \"([^\"]*)\" for value \"([^\"]*)\" and find String arrays in \"([^\"]*)\" with \"([^\"]*)\"$")
public void i_should_get_string_array_in_search_response(String index, String field, String fieldValue, String arrayField, String arrayValue)
throws Throwable {
super.i_should_get_string_array_in_search_response(index, field, fieldValue, arrayField, arrayValue);
}
}
......@@ -129,4 +129,10 @@ public class Steps extends SchemaServiceRecordSteps {
throws Throwable {
super.i_should_get_object_in_search_response_without_hints_in_schema(objectInnerField ,index, recordFile, acl, kind);
}
@Then("^I should be able to search for record from \"([^\"]*)\" by \"([^\"]*)\" for value \"([^\"]*)\" and find String arrays in \"([^\"]*)\" with \"([^\"]*)\"$")
public void i_should_get_string_array_in_search_response(String index, String field, String fieldValue, String arrayField, String arrayValue)
throws Throwable {
super.i_should_get_string_array_in_search_response(index, field, fieldValue, arrayField, arrayValue);
}
}
......@@ -143,4 +143,10 @@ public class Steps extends SchemaServiceRecordSteps {
String actualName = generateActualName(index, null);
super.i_should_get_object_in_search_response_without_hints_in_schema(objectInnerField, actualName, recordFile, acl, kind);
}
@Then("^I should be able to search for record from \"([^\"]*)\" by \"([^\"]*)\" for value \"([^\"]*)\" and find String arrays in \"([^\"]*)\" with \"([^\"]*)\"$")
public void i_should_get_string_array_in_search_response(String index, String field, String fieldValue, String arrayField, String arrayValue)
throws Throwable {
super.i_should_get_string_array_in_search_response(index, field, fieldValue, arrayField, arrayValue);
}
}
......@@ -21,10 +21,7 @@ import org.springframework.util.CollectionUtils;
import javax.ws.rs.HttpMethod;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
......@@ -32,6 +29,7 @@ import static org.junit.Assert.*;
import static org.opengroup.osdu.util.Config.getEntitlementsDomain;
import static org.opengroup.osdu.util.Config.getStorageBaseURL;
import static org.opengroup.osdu.util.HTTPClient.indentatedResponseBody;
import static org.opengroup.osdu.util.JsonPathMatcher.FindArrayInJson;
@Log
public class RecordSteps extends TestsBase {
......@@ -270,6 +268,16 @@ public class RecordSteps extends TestsBase {
assertTrue(actualRecordData.getData().containsKey(innerField));
}
public void i_should_get_string_array_in_search_response(String index, String field, String fieldValue, String arrayField, String desiredArrayValue)
throws Throwable {
TimeUnit.SECONDS.sleep(40);
final List<Map<String, Object>> elasticRecordData = elasticUtils.fetchRecordsByAttribute(index, field, fieldValue);
assertEquals(1, elasticRecordData.size());
final List<String> stringList = Arrays.asList(arrayField.split("\\."));
final Map<String, Object> jsonRecord = elasticRecordData.get(0);
assertEquals(String.join(",", (ArrayList<String>) FindArrayInJson(jsonRecord, stringList)), desiredArrayValue);
}
public void i_create_index_with_mapping_file_for_a_given_kind(String mappingFile, String index, String kind) throws Throwable {
String actualKind = generateActualName(kind, timeStamp);
TestIndex testIndex = getInputIndexMap().get(actualKind);
......
package org.opengroup.osdu.util;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
public class JsonPathMatcher {
// Since there's no unit tests for tests, there's this:
public static void main(String[] args) {
String jsonGoodString = """
{ "id": "tenant1:reference-data--IndexPropertyPathConfiguration:index-property--Wellbore:1.",
"data": {
"Name": "Wellbore-IndexPropertyPathConfiguration",
"Description": "The index property list for index-property--Wellbore:1., valid for all index-property--Wellbore kinds for major version 1.",
"Code": "test:indexer:index-property--Wellbore:1.",
"AttributionAuthority": "OSDU",
"Configurations": [{
"Name": "WellUWI",
"Policy": "ExtractFirstMatch",
"Paths": [{
"ValueExtraction.RelatedConditionMatches": [
"UniqueIdentifier:$",
"RegulatoryName:$",
"PreferredName:$",
"CommonName:$",
"ShortName:$"
],
"ValueExtraction.RelatedConditionProperty": "data.NameAliases[].AliasNameTypeID",
"ValueExtraction.ValuePath": "data.NameAliases[].AliasName"
}
],
"UseCase": "As a user I want to discover and match Wells by their UWI. I am aware that this is not globally reliable, however, I am able to specify a prioritized AliasNameType list to look up value in the NameAliases array."
}
]
}
}
""";
String jsonBadString = """
{ "id": "tenant1:reference-data--IndexPropertyPathConfiguration:index-property--Wellbore:1.",
"data": {
"Name": "Wellbore-IndexPropertyPathConfiguration",
"Description": "The index property list for index-property--Wellbore:1., valid for all index-property--Wellbore kinds for major version 1.",
"Code": "test:indexer:index-property--Wellbore:1.",
"AttributionAuthority": "OSDU",
"Configurations": [{
"Name": "WellUWI",
"Policy": "ExtractFirstMatch",
"Paths": [{
"ValueExtraction": {
"RelatedConditionMatches": "[UniqueIdentifier:$,RegulatoryName:$,PreferredName:$]",
"RelatedConditionProperty": "data.NameAliases[].AliasNameTypeID",
"ValuePath": "data.NameAliases[].AliasName"
}
}
],
"UseCase": "As a user I want to discover and match Wells by their UWI. I am aware that this is not globally reliable, however, I am able to specify a prioritized AliasNameType list to look up value in the NameAliases array."
}
]
}
}
""";
try {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> dataMap = objectMapper.readValue(jsonGoodString, Map.class);
List<String> stringList = java.util.Arrays.asList("data.Configurations.Paths.ValueExtraction.RelatedConditionMatches".split("\\."));
Object found = FindArrayInJson(dataMap, stringList);
System.out.println("in Good String Found? "+ objectMapper.writeValueAsString(found));
dataMap = objectMapper.readValue(jsonBadString, Map.class);
found = FindArrayInJson(dataMap, stringList);
System.out.println("in Bad String Found? "+ objectMapper.writeValueAsString(found));
stringList = java.util.Arrays.asList("data.Configurations.Paths.ValueExtraction.SomeDifferentKey".split("\\."));
found = FindArrayInJson(dataMap, stringList);
System.out.println("in Bad String Found? "+ objectMapper.writeValueAsString(found));
} catch (Exception e) {
e.printStackTrace();
}
}
// Assure that field in the Json path (supporting flattened fields) is an array of strings
public static Object FindArrayInJson(Object data, List<String> stringList) {
if (data instanceof Map) {
// Handle Map
return handleMap((Map<String, Object>) data, stringList);
} else if (data instanceof ArrayList) {
// Handle ArrayList
return handleArrayList((ArrayList<?>) data, stringList);
} else {
// Handle other types
return null;
}
}
private static boolean isPrefix(List<String> potentialPrefix, List<String> target) {
boolean result = true;
for (Integer i = 0; i < potentialPrefix.size(); i++) {
if (!potentialPrefix.get(i).equals(target.get(i))) {
return false;
}
}
return true;
}
private static Object handleMap(Map<String, Object> map, List<String> stringList) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
Object value = entry.getValue();
List<String> keyParts = java.util.Arrays.asList(entry.getKey().split("\\."));
if (keyParts.size() > stringList.size()) {
if (!isPrefix(keyParts.subList(0, stringList.size()), stringList)) {
continue;
}
Object result = FindArrayInJson(value, stringList.subList(0, 0));
if (result != null) { return result; }
} else {
if (!isPrefix(keyParts, stringList)) {
continue;
}
Object result = FindArrayInJson(value, stringList.subList(keyParts.size(), stringList.size()));
if (result != null) { return result; }
}
}
return null;
}
private static Object handleArrayList(ArrayList<?> arrayList, List<String> stringList) {
if (stringList.isEmpty()) return arrayList;
if (arrayList.isEmpty()) {
return null;
}
for (Object arrayElementValue : arrayList) {
Object result = FindArrayInJson(arrayElementValue, stringList);
if (result != null) { return result; }
}
return null;
}
}
......@@ -102,8 +102,16 @@ Feature: Indexing of the documents
| kind | recordFile | number | index | acl | field | value |
| "test:indexer:index-property--Wellbore:1.0.0" | "index-property-wellbore_v1" | 1 | "test-indexer-index-property--wellbore-1.0.0" | "data.default.viewers@tenant1" | "data.FacilityName.keywordLower" | "facility_123" |
@default
Scenario Outline: Ingest record and check for properly parsed array of Strings
When I ingest records with the <recordFile> with <acl> for a given <kind>
Then I should be able to search for record from <index> by <field> for value <value> and find String arrays in <arrayField> with <arrayValue>
Examples:
| kind | recordFile | index | field | value | acl | arrayField | arrayValue |
| "osdu:wks:reference-data--IndexPropertyPathConfiguration:1.0.0" | "well_augmenter_configuration" |"osdu-wks-reference-data--indexpropertypathconfiguration-1.0.0" | "data.AttributionAuthority.keyword" | "CustomAttributionAuthority" | "data.default.viewers@tenant1" | "data.Configurations.Paths.RelatedObjectsSpec.RelatedConditionMatches" | "opendes:reference-data--GeoPoliticalEntityType:Country:" |
@bag-of-words
Scenario Outline: Ingest record and Index bag of words as an attribute
Scenario Outline: Ingest record and Index bag of words as an attribute
When I ingest records with the <recordFile> with <acl> for a given <kind>
Then I should be able to search <number> record with index <index> by extended data field <field> and value <value>
......@@ -119,7 +127,7 @@ Feature: Indexing of the documents
Examples:
| kind | recordFile | number | index | acl | field | top_left_latitude | top_left_longitude | bottom_right_latitude | bottom_right_longitude |
| "tenant1:indexer:virtual-properties-Integration:1.0.0" | "index_record_virtual_properties" | 3 | "tenant1-indexer-virtual-properties-integration-1.0.0" | "data.default.viewers@tenant1" | "data.VirtualProperties.DefaultLocation.Wgs84Coordinates" | 90 | -180 | -90 | 180 |
| "tenant1:indexer:decimation-Integration:1.0.0" | "index_record_seismic_survey" | 1 | "tenant1-indexer-decimation-integration-1.0.0" | "data.default.viewers@tenant1" | "data.VirtualProperties.DefaultLocation.Wgs84Coordinates" | 90 | -180 | -90 | 180 |
| "tenant1:indexer:decimation-Integration:1.0.0" | "index_record_seismic_survey" | 1 | "tenant1-indexer-decimation-integration-1.0.0" | "data.default.viewers@tenant1" | "data.VirtualProperties.DefaultLocation.Wgs84Coordinates" | 90 | -180 | -90 | 180 |
@default
Scenario Outline: Ingest the r3-record with arrays of objects and hints in schema and Index in the Elastic Search
......
[{
"id": "tenant1:reference-data--IndexPropertyPathConfiguration:index-property--WellLog:1.",
"id": "tenant1:reference-data--IndexPropertyPathConfiguration:index-property--WellLog:1",
"data": {
"Name": "WellLogIndex-PropertyPathConfiguration",
"Description": "The index property list for WellLog:1., valid for all WellLog kinds for major version 1.",
......@@ -39,7 +39,7 @@
]
}
}, {
"id": "tenant1:reference-data--IndexPropertyPathConfiguration:index-property--Wellbore:1.",
"id": "tenant1:reference-data--IndexPropertyPathConfiguration:index-property--Wellbore:1",
"data": {
"Name": "Wellbore-IndexPropertyPathConfiguration",
"Description": "The index property list for index-property--Wellbore:1., valid for all index-property--Wellbore kinds for major version 1.",
......
[{
"id": "tenant1:reference-data--IndexPropertyPathConfiguration:index-property--Well:1",
"data": {
"Name": "Well-IndexPropertyPathConfiguration",
"Description": "The index property list for master-data--Well:1., valid for all master-data--Well kinds for major version 1.",
"Code": "osdu:wks:master-data--Well:1.",
"AttributionAuthority": "CustomAttributionAuthority",
"Configurations": [
{
"Name": "CountryNames",
"Policy": "ExtractAllMatches",
"Paths": [
{
"RelatedObjectsSpec": {
"RelationshipDirection": "ChildToParent",
"RelatedObjectID": "data.GeoContexts[].GeoPoliticalEntityID",
"RelatedObjectKind": "osdu:wks:master-data--GeoPoliticalEntity:1.",
"RelatedConditionMatches": [
"opendes:reference-data--GeoPoliticalEntityType:Country:"
],
"RelatedConditionProperty": "data.GeoContexts[].GeoTypeID"
},
"ValueExtraction": {
"ValuePath": "data.GeoPoliticalEntityName"
}
}
],
"UseCase": "As a user I want to find objects by a country name, with the understanding that an object may extend over country boundaries."
},
{
"Name": "WellUWI",
"Policy": "ExtractFirstMatch",
"Paths": [
{
"ValueExtraction": {
"RelatedConditionMatches": [
"opendes:reference-data--AliasNameType:UniqueIdentifier:",
"opendes:reference-data--AliasNameType:RegulatoryName:",
"opendes:reference-data--AliasNameType:PreferredName:",
"opendes:reference-data--AliasNameType:CommonName:",
"opendes:reference-data--AliasNameType:ShortName:"
],
"RelatedConditionProperty": "data.NameAliases[].AliasNameTypeID",
"ValuePath": "data.NameAliases[].AliasName"
}
}
],
"UseCase": "As a user I want to discover and match Wells by their UWI. I am aware that this is not globally reliable, however, I am able to specify a prioritized AliasNameType list to look up value in the NameAliases array."
}
]
}
}]
......@@ -124,4 +124,10 @@ public class Steps extends SchemaServiceRecordSteps {
String actualName = generateActualName(index, null);
super.i_should_get_object_in_search_response_without_hints_in_schema(objectInnerField ,actualName, recordFile, acl, kind);
}
@Then("^I should be able to search for record from \"([^\"]*)\" by \"([^\"]*)\" for value \"([^\"]*)\" and find String arrays in \"([^\"]*)\" with \"([^\"]*)\"$")
public void i_should_get_string_array_in_search_response(String index, String field, String fieldValue, String arrayField, String arrayValue)
throws Throwable {
super.i_should_get_string_array_in_search_response(index, field, fieldValue, arrayField, arrayValue);
}
}
......@@ -176,4 +176,10 @@ public class Steps extends SchemaServiceRecordSteps {
}
}
@Then("^I should be able to search for record from \"([^\"]*)\" by \"([^\"]*)\" for value \"([^\"]*)\" and find String arrays in \"([^\"]*)\" with \"([^\"]*)\"$")
public void i_should_get_string_array_in_search_response(String index, String field, String fieldValue, String arrayField, String arrayValue)
throws Throwable {
super.i_should_get_string_array_in_search_response(index, field, fieldValue, arrayField, arrayValue);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment