fun parse()

in alerting/src/main/kotlin/org/opensearch/alerting/aggregation/bucketselectorext/BucketSelectorExtAggregationBuilder.kt [139:248]


        fun parse(reducerName: String, parser: XContentParser): BucketSelectorExtAggregationBuilder {
            var token: XContentParser.Token
            var script: Script? = null
            var currentFieldName: String? = null
            var bucketsPathsMap: MutableMap<String, String>? = null
            var gapPolicy: GapPolicy? = null
            var parentBucketPath: String? = null
            var filter: BucketSelectorExtFilter? = null
            while (parser.nextToken().also { token = it } !== XContentParser.Token.END_OBJECT) {
                if (token === XContentParser.Token.FIELD_NAME) {
                    currentFieldName = parser.currentName()
                } else if (token === XContentParser.Token.VALUE_STRING) {
                    when {
                        PipelineAggregator.Parser.BUCKETS_PATH.match(currentFieldName, parser.deprecationHandler) -> {
                            bucketsPathsMap = HashMap()
                            bucketsPathsMap["_value"] = parser.text()
                        }
                        PipelineAggregator.Parser.GAP_POLICY.match(currentFieldName, parser.deprecationHandler) -> {
                            gapPolicy = GapPolicy.parse(parser.text(), parser.tokenLocation)
                        }
                        Script.SCRIPT_PARSE_FIELD.match(currentFieldName, parser.deprecationHandler) -> {
                            script = Script.parse(parser)
                        }
                        PARENT_BUCKET_PATH.match(currentFieldName, parser.deprecationHandler) -> {
                            parentBucketPath = parser.text()
                        }
                        else -> {
                            throw ParsingException(
                                parser.tokenLocation,
                                "Unknown key for a $token in [$reducerName]: [$currentFieldName]."
                            )
                        }
                    }
                } else if (token === XContentParser.Token.START_ARRAY) {
                    if (PipelineAggregator.Parser.BUCKETS_PATH.match(currentFieldName, parser.deprecationHandler)) {
                        val paths: MutableList<String> = ArrayList()
                        while (parser.nextToken().also { token = it } !== XContentParser.Token.END_ARRAY) {
                            val path = parser.text()
                            paths.add(path)
                        }
                        bucketsPathsMap = HashMap()
                        for (i in paths.indices) {
                            bucketsPathsMap["_value$i"] = paths[i]
                        }
                    } else {
                        throw ParsingException(
                            parser.tokenLocation,
                            "Unknown key for a $token in [$reducerName]: [$currentFieldName]."
                        )
                    }
                } else if (token === XContentParser.Token.START_OBJECT) {
                    when {
                        Script.SCRIPT_PARSE_FIELD.match(currentFieldName, parser.deprecationHandler) -> {
                            script = Script.parse(parser)
                        }
                        PipelineAggregator.Parser.BUCKETS_PATH.match(currentFieldName, parser.deprecationHandler) -> {
                            val map = parser.map()
                            bucketsPathsMap = HashMap()
                            for ((key, value) in map) {
                                bucketsPathsMap[key] = value.toString()
                            }
                        }
                        BUCKET_SELECTOR_FILTER.match(currentFieldName, parser.deprecationHandler) -> {
                            filter = BucketSelectorExtFilter.parse(reducerName, false, parser)
                        }
                        BUCKET_SELECTOR_COMPOSITE_AGG_FILTER.match(
                            currentFieldName,
                            parser.deprecationHandler
                        ) -> {
                            filter = BucketSelectorExtFilter.parse(reducerName, true, parser)
                        }
                        else -> {
                            throw ParsingException(
                                parser.tokenLocation,
                                "Unknown key for a $token in [$reducerName]: [$currentFieldName]."
                            )
                        }
                    }
                } else {
                    throw ParsingException(parser.tokenLocation, "Unexpected token $token in [$reducerName].")
                }
            }
            if (bucketsPathsMap == null) {
                throw ParsingException(
                    parser.tokenLocation,
                    "Missing required field [" + PipelineAggregator.Parser.BUCKETS_PATH.preferredName +
                        "] for bucket_selector aggregation [" + reducerName + "]"
                )
            }
            if (script == null) {
                throw ParsingException(
                    parser.tokenLocation,
                    "Missing required field [" + Script.SCRIPT_PARSE_FIELD.preferredName +
                        "] for bucket_selector aggregation [" + reducerName + "]"
                )
            }

            if (parentBucketPath == null) {
                throw ParsingException(
                    parser.tokenLocation,
                    "Missing required field [" + PARENT_BUCKET_PATH +
                        "] for bucket_selector aggregation [" + reducerName + "]"
                )
            }
            val factory = BucketSelectorExtAggregationBuilder(reducerName, bucketsPathsMap, script, parentBucketPath, filter)
            if (gapPolicy != null) {
                factory.gapPolicy(gapPolicy)
            }
            return factory
        }