Міндет және алғышарттар

Өтінім сомасын барлығына бір тұрақтымен емес, бөлімнің жеке лимитімен салыстыру.

Бұл мысал демонстрациялық деректер мен баптауларды қолданады. Өндірістік қабылдаушыларды қоспас бұрын күтілетін нәтижені өз ортаңызда тексеріңіз. Мына идентификаторлар: 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 байланыс. Түйін идентификаторлары мен порттары сақталған.
11-ағын схемасы

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. префиксі бар.

Іске қосу және тексеру

  1. Екі CSV тіркеп, әр Dept үшін бір лимит барын тексеріңіз.
  2. JSON графын құрыңыз; requests негізгі Join кірісі, limits Dept бойынша сол жақ біріктіру болсын.
  3. l.Limit және лимит жоқ кездегі қате ережесін қараңыз.
  4. Үш өтінімді тексеріңіз: R1 лимит ішінде, R2 және R3 лимиттен жоғары.
  5. Лимитсіз Dept=FIN қосыңыз: сапа тексеруі экспортқа дейін тоқтауы керек.

Ақауларды жою

  • Join кейінгі нақты r.Amount және l.Limit атауларын қолданыңыз.
  • Қайталанатын Dept мәндері many_to_one талабын бұзады; анықтамалық кестені түзетіңіз.
  • Бизнес-ережесіз жоқ лимитті нөлге алмастырмаңыз.
  • Бағыттау ағымдағы жол өрістерін салыстырады; бұрынғы анықтамалық кіріс қажет емес.