From 2ef47f9cdcc947f35127a74ee58e4e875ffdd4d4 Mon Sep 17 00:00:00 2001 From: Surya Sashank Nistala Date: Sat, 7 Oct 2023 01:34:13 -0700 Subject: [PATCH] add 'fields' parameter in doc level query object. (#546) Signed-off-by: Surya Sashank Nistala --- .../commons/alerting/model/DocLevelQuery.kt | 18 ++++++++++++++++++ .../opensearch/commons/alerting/TestHelpers.kt | 2 +- .../action/GetFindingsResponseTests.kt | 4 ++-- .../commons/alerting/model/WriteableTests.kt | 11 +++++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/org/opensearch/commons/alerting/model/DocLevelQuery.kt b/src/main/kotlin/org/opensearch/commons/alerting/model/DocLevelQuery.kt index 83dab26a..723438fe 100644 --- a/src/main/kotlin/org/opensearch/commons/alerting/model/DocLevelQuery.kt +++ b/src/main/kotlin/org/opensearch/commons/alerting/model/DocLevelQuery.kt @@ -14,6 +14,7 @@ import java.util.UUID data class DocLevelQuery( val id: String = UUID.randomUUID().toString(), val name: String, + val fields: List, val query: String, val tags: List = mutableListOf() ) : BaseModel { @@ -30,6 +31,7 @@ data class DocLevelQuery( constructor(sin: StreamInput) : this( sin.readString(), // id sin.readString(), // name + sin.readStringList(), // fields sin.readString(), // query sin.readStringList() // tags ) @@ -38,6 +40,7 @@ data class DocLevelQuery( return mapOf( QUERY_ID_FIELD to id, NAME_FIELD to name, + FIELDS_FIELD to fields, QUERY_FIELD to query, TAGS_FIELD to tags ) @@ -47,6 +50,7 @@ data class DocLevelQuery( override fun writeTo(out: StreamOutput) { out.writeString(id) out.writeString(name) + out.writeStringCollection(fields) out.writeString(query) out.writeStringCollection(tags) } @@ -64,6 +68,7 @@ data class DocLevelQuery( companion object { const val QUERY_ID_FIELD = "id" const val NAME_FIELD = "name" + const val FIELDS_FIELD = "fields" const val QUERY_FIELD = "query" const val TAGS_FIELD = "tags" const val NO_ID = "" @@ -75,6 +80,7 @@ data class DocLevelQuery( lateinit var query: String lateinit var name: String val tags: MutableList = mutableListOf() + val fields: MutableList = mutableListOf() XContentParserUtils.ensureExpectedToken(XContentParser.Token.START_OBJECT, xcp.currentToken(), xcp) while (xcp.nextToken() != XContentParser.Token.END_OBJECT) { @@ -100,12 +106,24 @@ data class DocLevelQuery( tags.add(tag) } } + FIELDS_FIELD -> { + XContentParserUtils.ensureExpectedToken( + XContentParser.Token.START_ARRAY, + xcp.currentToken(), + xcp + ) + while (xcp.nextToken() != XContentParser.Token.END_ARRAY) { + val field = xcp.text() + fields.add(field) + } + } } } return DocLevelQuery( id = id, name = name, + fields = fields, query = query, tags = tags ) diff --git a/src/test/kotlin/org/opensearch/commons/alerting/TestHelpers.kt b/src/test/kotlin/org/opensearch/commons/alerting/TestHelpers.kt index f3183e51..43196200 100644 --- a/src/test/kotlin/org/opensearch/commons/alerting/TestHelpers.kt +++ b/src/test/kotlin/org/opensearch/commons/alerting/TestHelpers.kt @@ -383,7 +383,7 @@ fun randomDocLevelQuery( name: String = "${RandomNumbers.randomIntBetween(Random(), 0, 5)}", tags: List = mutableListOf(0..RandomNumbers.randomIntBetween(Random(), 0, 10)).map { RandomStrings.randomAsciiLettersOfLength(Random(), 10) } ): DocLevelQuery { - return DocLevelQuery(id = id, query = query, name = name, tags = tags) + return DocLevelQuery(id = id, query = query, name = name, tags = tags, fields = listOf("*")) } fun randomDocLevelMonitorInput( diff --git a/src/test/kotlin/org/opensearch/commons/alerting/action/GetFindingsResponseTests.kt b/src/test/kotlin/org/opensearch/commons/alerting/action/GetFindingsResponseTests.kt index 8d40492a..1a8b2bdb 100644 --- a/src/test/kotlin/org/opensearch/commons/alerting/action/GetFindingsResponseTests.kt +++ b/src/test/kotlin/org/opensearch/commons/alerting/action/GetFindingsResponseTests.kt @@ -24,7 +24,7 @@ internal class GetFindingsResponseTests { "monitor_id1", "monitor_name1", "test_index1", - listOf(DocLevelQuery("1", "myQuery", "fieldA:valABC", listOf())), + listOf(DocLevelQuery("1", "myQuery", listOf(), "fieldA:valABC", listOf())), Instant.now() ) val findingDocument1 = FindingDocument("test_index1", "doc1", true, "document 1 payload") @@ -43,7 +43,7 @@ internal class GetFindingsResponseTests { "monitor_id2", "monitor_name2", "test_index2", - listOf(DocLevelQuery("1", "myQuery", "fieldA:valABC", listOf())), + listOf(DocLevelQuery("1", "myQuery", listOf(), "fieldA:valABC", listOf())), Instant.now() ) val findingDocument21 = FindingDocument("test_index2", "doc21", true, "document 21 payload") diff --git a/src/test/kotlin/org/opensearch/commons/alerting/model/WriteableTests.kt b/src/test/kotlin/org/opensearch/commons/alerting/model/WriteableTests.kt index 9454aa48..85dd27ef 100644 --- a/src/test/kotlin/org/opensearch/commons/alerting/model/WriteableTests.kt +++ b/src/test/kotlin/org/opensearch/commons/alerting/model/WriteableTests.kt @@ -10,6 +10,7 @@ import org.opensearch.commons.alerting.randomAction import org.opensearch.commons.alerting.randomActionExecutionPolicy import org.opensearch.commons.alerting.randomBucketLevelTrigger import org.opensearch.commons.alerting.randomChainedAlertTrigger +import org.opensearch.commons.alerting.randomDocLevelQuery import org.opensearch.commons.alerting.randomDocumentLevelTrigger import org.opensearch.commons.alerting.randomQueryLevelMonitor import org.opensearch.commons.alerting.randomQueryLevelTrigger @@ -123,6 +124,16 @@ class WriteableTests { Assertions.assertEquals(trigger, newTrigger, "Round tripping DocumentLevelTrigger doesn't work") } + @Test + fun `test doc-level query as stream`() { + val dlq = randomDocLevelQuery() + val out = BytesStreamOutput() + dlq.writeTo(out) + val sin = StreamInput.wrap(out.bytes().toBytesRef().bytes) + val newDlq = DocLevelQuery.readFrom(sin) + Assertions.assertEquals(dlq, newDlq, "Round tripping DocLevelQuery doesn't work") + } + @Test fun `test chained alert trigger as stream`() { val trigger = randomChainedAlertTrigger()