Как обнаружить конфликтующие строки из списка JSON с учетом комплекса JSON? - PullRequest
0 голосов
/ 06 августа 2020

Учитывая комбинацию нескольких условий с операторами между ними, например,

section = "ABC" AND type = "A" AND status = "RESPONDED" AND scores NOT_NULL AND scores.productA NOT_NULL AND scores.productA > 10 AND scores.productA < 30

Это приводит к нескольким действиям , например

priority = 3 AND hours = 24 AND isQualified = true

Цель состоит в том, чтобы найти JSON строк, которые будут конфликтовать с этой строкой. Конфликт возникает, когда одни и те же условия (тот же или другой порядок) приводят к различным действиям или приводят к действиям с разными значениями. Имеется таблица mysql, в которой хранятся эти json строк в столбце и требуется запрос к этому столбцу

Пробовали MySQL JSON функции, такие как JSON_CONTAINS, но они не работают, если порядок вложенных json объектов отличается. Также попробовал сравнение строк с использованием LIKE для отдельных условий, которые сработали, но для того, чтобы совпадение произошло, нам нужно рассмотреть группировку условий и операторов, присоединяющихся к ним.

Любые предложения были бы замечательными. В идеале возможность сделать это на уровне SQL было бы здорово, но комбинация SQL для сужения, а затем второго прохода для суженных значений также может работать.

JSON строка для представления условия и действия могут быть указаны как

{
    "actions": [{
        "actionItem": {
            "SetValueAction": {
                "value": {
                    "long": 24
                },
                "dataField": {
                    "field": "hours",
                    "object": {
                        "className": "Message",
                        "objectName": "message"
                    }
                }
            }
        }
    }, {
        "actionItem": {
            "SetValueAction": {
                "value": {
                    "boolean": true
                },
                "dataField": {
                    "field": "isQualified",
                    "object": {
                        "className": "Message",
                        "objectName": "message"
                    }
                }
            }
        }
    }, {
        "actionItem": {
            "SetValueAction": {
                "value": {
                    "long": 3
                },
                "dataField": {
                    "field": "priority",
                    "object": {
                        "className": "Message",
                        "objectName": "message"
                    }
                }
            }
        }
    }],
    "condition": {
        "ConditionGroup": {
            "logicalOperator": "AND",
            "conditionGroupItems": [{
                "Condition": {
                    "conditionItem": {
                        "FieldConstraint": {
                            "value": {
                                "string": "ABC"
                            },
                            "operator": "EQ",
                            "dataField": {
                                "field": "section",
                                "object": {
                                    "className": "Message",
                                    "objectName": "message"
                                }
                            }
                        }
                    }
                }
            }, {
                "Condition": {
                    "conditionItem": {
                        "FieldConstraint": {
                            "value": {
                                "string": "A"
                            },
                            "operator": "EQ",
                            "dataField": {
                                "field": "type",
                                "object": {
                                    "className": "Message",
                                    "objectName": "message"
                                }
                            }
                        }
                    }
                }
            }, {
                "Condition": {
                    "conditionItem": {
                        "FieldConstraint": {
                            "value": {
                                "string": "RESPONDED"
                            },
                            "operator": "EQ",
                            "dataField": {
                                "field": "status",
                                "object": {
                                    "className": "Message",
                                    "objectName": "message"
                                }
                            }
                        }
                    }
                }
            }, {
                "Condition": {
                    "conditionItem": {
                        "FieldConstraint": {
                            "operator": "NOT_NULL",
                            "dataField": {
                                "field": "scores",
                                "object": {
                                    "className": "Message",
                                    "objectName": "message"
                                }
                            }
                        }
                    }
                }
            }, {
                "Condition": {
                    "conditionItem": {
                        "FieldConstraint": {
                            "operator": "NOT_NULL",
                            "dataField": {
                                "field": "scores.productA",
                                "object": {
                                    "className": "Message",
                                    "objectName": "message"
                                }
                            }
                        }
                    }
                }
            }, {
                "Condition": {
                    "conditionItem": {
                        "FieldConstraint": {
                            "value": {
                                "double": 10
                            },
                            "operator": "GT",
                            "dataField": {
                                "field": "scores.productA",
                                "object": {
                                    "className": "Message",
                                    "objectName": "message"
                                }
                            }
                        }
                    }
                }
            }, {
                "Condition": {
                    "conditionItem": {
                        "FieldConstraint": {
                            "value": {
                                "double": 30
                            },
                            "operator": "LE",
                            "dataField": {
                                "field": "scores.productA",
                                "object": {
                                    "className": "Message",
                                    "objectName": "message"
                                }
                            }
                        }
                    }
                }
            }]
        }
    }
}  

1 Ответ

0 голосов
/ 06 августа 2020

В SQL нет сложных фреймворков для удовлетворения ваших требований. С Java - это просто.

Однако - вы можете построить logi c в mysql с указанными ниже входами

1.) Используйте JSON_SEARCH с текстовым условием 1.) "condition "2.)" actionnItem "и дать поиск 'all', чтобы вернуть все совпадающие строковые path https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#function_json -search

2.) У вас будет два набора выходных данных для condition и actionItem

3.) Теперь создайте два отдельных цикла while для каждого и выполните синтаксический анализ путей, указанных на шаге 1/2, и снова выполните json_search для оператора, поля данных и других текстов на основе вашего формата JSON.

Подробные JSON функции доступны здесь - https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html

...