A newer version of this documentation is available.

View Latest

Function: cascadeKvDeleteWithDoc

      +

      Goal: Perform a cascade delete operation using just the Data Service (or KV).

      • This function cascadeKvDeleteWithDoc merely demonstrates two different Eventing solutions

        • A cascade delete using just KV or the Data Service.

        • A work around for the fact that the OnDelete() entry point does not supply the actual document being deleted.

      • Requires Eventing Storage (or metadata collection) and a "source" collection.

      • Needs a Binding of type Bucket Alias (as documented in the Scriptlet).

      • Will utilize a special doc.type === "proxy" with a prefix KEY of "proxy::" where the suffix after "proxy::" is the KEY to the actual document.

      • Will operate on any mutation where 1) doc.type exists and 2) doc.type !== "proxy".

      • When a "proxy" document is deleted the corresponding "real" document is read from KV. This allows actions such as cURL calls to be taken based on the data in the "real document.

      • After the real document is read it is then deleted.

      • This Scriptlet uses just KV unlike the similar example Cascade Delete which uses SQL++ (or N1QL).

      • cascadeKvDeleteWithDoc

      • Input Data/Mutation(s)

      • Output Data/Logged

      // To run configure the settings for this Function, cascadeKvDeleteWithDoc, as follows:
      //
      // Version 7.1+
      //   "Function Scope"
      //     *.* (or try bulk.data if non-privileged)
      // Version 7.0+
      //   "Listen to Location"
      //     bulk.data.source
      //   "Eventing Storage"
      //     rr100.eventing.metadata
      //   Binding(s)
      //    1. "binding type", "alias name...", "bucket.scope.collection", "Access"
      //       "bucket alias", "src_col",       "bulk.data.source",        "read and write"
      //
      // Version 6.X
      //   "Source Bucket"
      //     source
      //   "MetaData Bucket"
      //     metadata
      //   Binding(s)
      //    1. "binding type", "alias name...", "bucket",     "Access"
      //       "bucket alias", "src_col",       "source",     "read and write"
      
      function OnUpdate(doc, meta) {
          // filter out any proxy:: docs, ignore all others
          if ((meta.id).startsWith("proxy::") === true) return;
          log('OnUpdate notified of insert/update to key', meta.id);
      }
      
      function OnDelete(meta, options) {
          // only process proxy:: docs, ignore all others
          if ((meta.id).startsWith("proxy::") === false) return;
      
          // optional filter for just type == real or apply logic to all non 'proxy' types
          // if ((meta.id).startsWith("real::") !== true) return;
      
          log('A. OnDelete notified of '+options.expired ? 'delete' : 'expiry'+' of proxy', meta.id);
          var real_key = (meta.id).substr(7);
          var real_doc = src_col[real_key];
          if (real_doc) {
              delete src_col[real_key];
              log('B. OnDelete removed the real doc via key',real_key);
              log('C. OnDelete do what you want curl, etc. with the real doc',real_doc)
          } else {
              log('D. OnDelete unexpected no real doc present for key', real_key);
          }
      }

      We want a small "proxy" doc as a placeholder that we delete instead of the "real" document

      INPUT: KEY: proxy::real::1
      
      {
          "id": "real::1",
          "type": "proxy"
      }
      INPUT: KEY: real::1
      
      {
        "id": 1,
        "type": "real",
        "f1": "yes",
        "f2": 1100,
        "fn": "n"
      }

      Steps to run:

      • Deploy the function

      • Then add the two test documents via the UI’s doc editor.

      • Then delete the proxy:real::1 doc via the UI’s doc editor.

      • The OnDelete() function will:

        • Read and store the "real" doc for processing based on the "real" doc’s internal data.

        • Perform a cascade delete of the "real" doc.

      2021-07-18T20:08:04.459-07:00 [INFO] "C. OnDelete do what you want curl, etc. with the real doc" {"id":1,"type":"real","f1":"yes","f2":1100,"fn":"n"}
      
      2021-07-18T20:08:04.459-07:00 [INFO] "B. OnDelete removed the real doc via key" "real::1"
      
      2021-07-18T20:08:04.457-07:00 [INFO] "A. OnDelete notified of expiry of proxy" "proxy::real::1"
      
      2021-07-18T20:08:00.757-07:00 [INFO] "OnUpdate notified of insert/update to key" "real::1"