Учитывая комбинацию нескольких условий с операторами между ними, например,
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"
}
}
}
}
}
}]
}
}
}