CodamAIDocs
Themafertig

Aufbau einer Suche

Wie ein Such-Request aussieht: response, parameter mit query, order, page, limit, meta, und welche Standardwerte gelten.

Ausprägungen
minimale Suchemit Filtermit Sortierungmit Seitenohne parameterohne Leserolle → 403

Worum es geht

Mit POST {basis}/query holst du eine Liste von Objekten eines Modells, zum Beispiel alle Kunden aus Köln, sortiert nach Namen, 25 pro Seite. Der Körper hat zwei Teile:

  • response sagt, welche Felder jedes Objekt in der Liste hat. Das ist dieselbe Feldauswahl wie beim Lesen, siehe Feldauswahl.
  • parameter sagt, welche Objekte in welcher Reihenfolge kommen.

Ein vollständiger Request

{
  "response": ["id", "name", "city"],
  "parameter": {
    "query": {
      "type": "AND",
      "filter": [
        { "key": "city", "value": "Köln", "param": "EQ" }
      ],
      "group": []
    },
    "order": [ { "field": "name", "order": "ASC" } ],
    "page": 0,
    "limit": 25,
    "meta": true
  }
}
flowchart TB
    B["Körper von POST /query"] --> R["response<br/>welche Felder"]
    B --> P["parameter"]
    P --> Q["query<br/>welche Objekte (Filterbaum)"]
    P --> O["order<br/>in welcher Reihenfolge"]
    P --> S["page + limit<br/>welcher Ausschnitt"]
    P --> M["meta<br/>Angaben zur Liste"]
    Q --> T["type: AND oder OR"]
    Q --> F["filter: einzelne Bedingungen<br/>key, value, param"]
    Q --> G["group: Untergruppen<br/>wieder mit type, filter, group"]
TeilBedeutungMehr dazu
query.typewie die Einträge dieser Gruppe verknüpft werden: AND oder ORUND/ODER-Gruppen
query.filtereinzelne Bedingungen: Feld (key), Wert (value), Operator (param)Alle Filteroperatoren
query.groupUntergruppen mit eigenem typeUND/ODER-Gruppen
orderSortierkriterien in Reihenfolge ihrer WichtigkeitSortierung
page, limitwelche Seite und wie viele Objekte pro SeiteBlättern und Trefferzahl
metaob Angaben zur Liste mitkommenBlättern und Trefferzahl

Standardwerte

Alles in parameter darf fehlen. Dann gilt:

AngabeStandardWirkung
parameterleeralle sichtbaren Objekte, keine Sortierung
querykeinerkein Filter vom Client
query.typeOREinträge der Gruppe werden mit ODER verknüpft
filter[].paramLIKEVergleich mit Suchmuster
orderkeineReihenfolge nicht festgelegt
page0erste Seite, gezählt ab 0
limit-1alle Treffer auf einmal
metatrueAngaben zur Liste kommen mit

Die Antwort

Antwort auf eine Suche
Anfrage
POST /api/rest/crm/customer/query
{ "response": ["id", "name"],
  "parameter": { "limit": 2, "order": [{ "field": "name", "order": "ASC" }] } }
Antwort
{
  "data": [
    { "id": "5a2b…", "name": "Alt-Muster AG" },
    { "id": "7c1d…", "name": "Muster GmbH" }
  ],
  "meta": {
    "error": false,
    "totalCount": 42,
    "currentPage": 0,
    "currentLimit": 2
  }
}

data ist die Liste der Objekte dieser Seite. In meta steht unter anderem totalCount, die Zahl aller Treffer über alle Seiten. Die Antwort ist gekürzt, siehe Blättern und Trefferzahl für alle Angaben in meta.

Was auf dem Weg passiert

POST /crm/customer/query
  1. 1
    Client→CDMS
    schickt response und parameter
  2. 2
    CDMS
    löst die response in Felder auf. Fehlt sie → 400
  3. 3
    CDMS
    prüft die Leserolle von customer. Fehlt sie → 403 missing-permission|customer-read
  4. 4
    CDMS
    hängt deinen Filterbaum mit UND an die Filter, die immer mitlaufen: eigene Daten, Attributfilter, Pflichtfilter
  5. 5
    CDMS→Datenbank
    zählt die Treffer, bestimmt die Seite und liest die angeforderten Spalten
  6. 6
    CDMS→Client
    liefert data und meta

Die Suche braucht dieselbe Leserolle wie das Lesen eines einzelnen Objekts. Den Endpunkt gibt es nur, wenn das Modell ihn freigibt, siehe Endpunkte.

Alle Ausprägungen

Vom einfachen zum vollständigen Request

Wann: Du willst alles sehen, etwa zum Ausprobieren.

{ "response": ["id", "name"] } liefert alle sichtbaren Objekte, unsortiert, ohne Seiten.

Ergebnis: Alle Treffer auf einmal. Für große Tabellen ungeeignet.

Wann: Du suchst bestimmte Objekte.

"parameter": { "query": { "type": "AND", "filter": [{ "key": "city", "value": "Köln", "param": "EQ" }] } }

Ergebnis: Nur die Kunden aus Köln.

Wann: Die Reihenfolge zählt, etwa in einer Tabelle.

"order": [{ "field": "name", "order": "ASC" }]

Ergebnis: Alphabetisch nach Namen.

Wann: Eine Tabelle zeigt 25 Zeilen pro Seite.

"page": 0, "limit": 25 für die erste Seite, "page": 1 für die zweite.

Ergebnis: Höchstens 25 Objekte, dazu totalCount für die Seitenleiste.

Wann: Produktion.

Filter mit ausdrücklichem type, Sortierung, page und limit, und in response nur die Felder, die die Oberfläche zeigt.

Ergebnis: Stabil, schnell und vorhersehbar.

Fallen

Quellen im Code und in der Wissensdatenbank
  • CDMS/cdms-rest-api – RestListPayload, AbstractRestApi.queryObjects
  • CDMS/cdms-commons – ListSearchParameter, ListSearchLogic, ListSearchFilter, ListOrderLogic
  • CDMS/cdms-system-layer – AbstractLayer.recursiveQuery, buildSearchRoot
  • documentation/05-api-guide/05-suchen.md
Suchen