From aae9aaf03daf023045d8ddcab45c83719a7d6c85 Mon Sep 17 00:00:00 2001 From: mrjk Date: Wed, 2 Feb 2022 17:40:19 -0500 Subject: [PATCH] Add: merge_schema strategy backend --- kheops/plugin/strategy/merge_schema.py | 96 ++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 kheops/plugin/strategy/merge_schema.py diff --git a/kheops/plugin/strategy/merge_schema.py b/kheops/plugin/strategy/merge_schema.py new file mode 100644 index 0000000..347f9a3 --- /dev/null +++ b/kheops/plugin/strategy/merge_schema.py @@ -0,0 +1,96 @@ +"""Merge Deep strategy Plugin""" + +import logging +from jsonmerge import Merger + +from kheops.plugin.common import StrategyPlugin + +from pprint import pprint + + +log = logging.getLogger(__name__) + + +class Plugin(StrategyPlugin): + """Last strategy plugin""" + + + _plugin_name = "merge_schema" + _schema_props_new = None + + selector = "matched" + + default_merge_schema = { + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "array", + "mergeStrategy": "append", + # "mergeStrategy": "arrayMergeById", + }, + { + "type": "object", + "mergeStrategy": "objectMerge", + }, + { + "type": "boolean", + "mergeStrategy": "overwrite", + }, + { + "type": "string", + "mergeStrategy": "overwrite", + }, + { + "type": "integer", + "mergeStrategy": "overwrite", + }, + { + "type": "number", + "mergeStrategy": "overwrite", + }, + { + "type": "null", + "mergeStrategy": "overwrite", + }, + ], + } + + + #def _init(self): + + # Fetch module config + # See documentation: https://github.com/clarketm/mergedeep + #algo = self.ns.config["config"].get("merge_schema_algo", "replace").upper() + #strategy = getattr(Strategy, algo, None) + #if strategy is None: + # strategies = [i.lower() for i in dir(Strategy) if i.isupper()] + # raise Exception( + # f"Unknown algorithm: {algo}, please choose one of: {strategies}" + # ) + #self.strategy = strategy + + def merge_results(self, candidates: list, rule: dict, query) -> (list, dict): + """Return results""" + + key = query.key + results = [] + + + schema = rule.get("schema", None) or self.default_merge_schema + merger = Merger(schema) + + + result = None + for index, item in enumerate(candidates): + new_value = item.data + try: + new_value = new_value[key] + except : + #print (f"Missing key: {key}") + continue + + result = merger.merge(result, new_value) + + + + return result