Міндет және алғышарттар
Өтінім сомасын барлығына бір тұрақтымен емес, бөлімнің жеке лимитімен салыстыру.
Бұл мысал демонстрациялық деректер мен баптауларды қолданады. Өндірістік қабылдаушыларды қоспас бұрын күтілетін нәтижені өз ортаңызда тексеріңіз. Мына идентификаторлар: demo_* мысал ретінде берілген: редакторда өз оқу қосылымдарыңызды немесе дереккөздеріңізді таңдаңыз. Төмендегі JSON дайын тасымалдау архивін емес, блоктар мен байланыстар құрылымын көрсетеді.
Оқу кіріс деректері
requests.csv
Request;Dept;Amount
R1;IT;900
R2;HR;600
R3;IT;1200
limits.csv
Dept;Limit
IT;1000
HR;500
Блоктар, байланыстар және нақты баптаулар
11-мысал құрылымы: 7 блок, 6 байланыс. Бапталған графтың түйін идентификаторлары мен порттары сақталған.
Граф: өтінімдер мен лимиттер → Dept бойынша Join → лимит барын тексеру → Amount > Limit бағыттауы → екі нәтиже. Анықтамалық қайталанымдары өтінімдерді көбейтпес үшін many_to_one бар сол жақ біріктіруді қолданыңыз. Join өрістерінде r. және l. префикстері бар.
{
"version": 3,
"nodes": [
{
"id": "requests",
"type": "file",
"label": "Requests",
"config": {
"role": "source",
"source_id": "demo_requests",
"options": {
"sheet": "CSV",
"range": "A1:C4",
"header": true,
"delimiter": ";"
}
}
},
{
"id": "limits",
"type": "file",
"label": "Limits",
"config": {
"role": "source",
"source_id": "demo_limits",
"options": {
"sheet": "CSV",
"range": "A1:B3",
"header": true,
"delimiter": ";"
}
}
},
{
"id": "join",
"type": "join",
"label": "Department limit",
"config": {
"inputs": [
{
"id": "requests",
"alias": "r"
},
{
"id": "limits",
"alias": "l",
"how": "left",
"keys": [
{
"left": "r.Dept",
"right": "Dept"
}
],
"cardinality": "many_to_one"
}
]
}
},
{
"id": "quality",
"type": "quality",
"label": "Limit required",
"config": {
"rules": [
{
"fields": [
"l.Limit"
],
"condition": "empty",
"action": "error"
}
]
}
},
{
"id": "router",
"type": "router",
"label": "Limit check",
"config": {
"route_type": "conditions",
"mode": "first",
"default_route": true,
"routes": [
{
"id": "over",
"label": "Over limit",
"predicates": [
{
"column": "r.Amount",
"op": "gt",
"numeric": true,
"value_mode": "field",
"value_field": "l.Limit"
}
]
}
]
}
},
{
"id": "over_out",
"type": "export",
"label": "Over limit",
"config": {
"format": "csv",
"filename": "over_limit",
"destination": "download",
"delimiter": ";",
"timezone": "Europe/Kyiv"
}
},
{
"id": "within_out",
"type": "export",
"label": "Within limit",
"config": {
"format": "csv",
"filename": "within_limit",
"destination": "download",
"delimiter": ";",
"timezone": "Europe/Kyiv"
}
}
],
"edges": [
{
"source": "requests",
"target": "join",
"source_port": "out",
"target_port": "requests"
},
{
"source": "limits",
"target": "join",
"source_port": "out",
"target_port": "limits"
},
{
"source": "join",
"target": "quality",
"source_port": "out",
"target_port": "in"
},
{
"source": "quality",
"target": "router",
"source_port": "out",
"target_port": "in"
},
{
"source": "router",
"target": "over_out",
"source_port": "over",
"target_port": "in"
},
{
"source": "router",
"target": "within_out",
"source_port": "else",
"target_port": "in"
}
]
}Күтілетін нәтиже
over_limit.csv R2 (600 > 500) және R3 (1200 > 1000) қамтиды. within_limit.csv R1 (900 ≤ 1000) қамтиды. Нәтижеде қосылған лимит бар; өтінім өрістерінде r., анықтамалық өрістерінде l. префиксі бар.
Іске қосу және тексеру
- Екі CSV тіркеп, әр Dept үшін бір лимит барын тексеріңіз.
- JSON графын құрыңыз; requests негізгі Join кірісі, limits Dept бойынша сол жақ біріктіру болсын.
- l.Limit және лимит жоқ кездегі қате ережесін қараңыз.
- Үш өтінімді тексеріңіз: R1 лимит ішінде, R2 және R3 лимиттен жоғары.
- Лимитсіз Dept=FIN қосыңыз: сапа тексеруі экспортқа дейін тоқтауы керек.
Ақауларды жою
- Join кейінгі нақты r.Amount және l.Limit атауларын қолданыңыз.
- Қайталанатын Dept мәндері many_to_one талабын бұзады; анықтамалық кестені түзетіңіз.
- Бизнес-ережесіз жоқ лимитті нөлге алмастырмаңыз.
- Бағыттау ағымдағы жол өрістерін салыстырады; бұрынғы анықтамалық кіріс қажет емес.