Function: simpleFlatten

      +

      Goal: Flatten a document for integration with a non-NOSQL RDBMS.

      • This function simpleFlatten shows how a document can be flattened into a RDBMS importable record.

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

      • Will operate on all documents where doc.type === "tosync".

      • Will write transformed or flattened documents to the destination bucket with the same type and id.

      • Will also remove the flattened document in the destination bucket when the original source document is removed.

      • The "destination" collection can be shared (or replicated via XCDR to a business partner) too the cloud (AWS, Azure or GCP).

      • Note since the document is not available during an OnDelete we will filter by KEY prefix starting with "tosync:".*. This is a hard coded implementation. Refer to genericFlatten for a generic implementation.

      • simpleFlatten

      • Input Data/Mutation

      • Output Data/Mutation

      // To run configure the settings for this Function, simpleFlatten, 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", "dst_col",       "bulk.data.destination",   "read and write"
      //
      // Version 6.X
      //   "Source Bucket"
      //     source
      //   "MetaData Bucket"
      //     metadata
      //   Binding(s)
      //    1. "binding type", "alias name...", "bucket",     "Access"
      //       "bucket alias", "dst_col",      "destination", "read and write"
      
      function OnUpdate(doc, meta) {
          // filter
          if (!doc.type || doc.type !== "tosync") return;
      
          log("OnUpdate IN  id: "+meta.id+", doc:      ",doc);
          try {
              // convert
              var oracleDoc = {
                  // flatten items simple 1:1 map
                  "id": doc.id, "type":doc.type,
                  // flatten subdoc
                  "a_sub_aa": doc.a.aa, "a_sub_ab": doc.a.ab,  "a_sub_ac": doc.a.ac,
                  // flatten array
                  "b_ary_0": doc.b[0], "b_ary_1": doc.b[1], "b_ary_2": doc.b[2]
              }
              // log
              log("OnUpdate OUT id: "+meta.id+", oracleDoc:",oracleDoc);
          } catch (e) {
              log ("Error on convert: "+e+", id:",meta.id);
          }
          // save
          try {
              dst_col[meta.id] = oracleDoc;
          } catch (e) {
              log("Error on save: "+e+", id:", meta.id);
          }
      }
      
      function OnDelete(meta, options) {
          // filter
          if (!(meta.id.startsWith("tosync:"))) return;
      
          log("OnDelete expired=" + options.expired +" REM id: "+meta.id);
          try {
              delete dst_col[meta.id];
          } catch (e) {
              log("Error on delete: "+e+", id:",meta.id);
          }
      }
      INPUT: KEY tosync::1
      
      {
        "id": 1,
        "type": "tosync",
        "a": {
          "aa": 1,
          "ab": 2,
          "ac": 3
        },
        "b": [
          1,
          3,
          7
        ]
      }
      UPDATED/OUTPUT: KEY tosync::1
      
      {
        "id": 1,
        "type": "tosync",
        "a_sub_aa": 1,
        "a_sub_ab": 2,
        "a_sub_ac": 3,
        "b_ary_0": 1,
        "b_ary_1": 3,
        "b_ary_2": 7
      }