fairDataSociety / fdp-contracts

Fair Data Protocol smart contracts and its utilities
4 stars 1 forks source link

Proposal: Swarm DB - Beeson Query Language #83

Open molekilla opened 2 years ago

molekilla commented 2 years ago

Swarm DB - Beeson Query Language

Swarm DB Beeson Query Language

Summary

With Beeson being the prefer schema model for Swarm, it is also possible to have a query language that allows for path and traversal in beeson / super beeson structure. In this proposal we use existing javascript language called JEXL.

Guide-level explanation

Javascript Expression Language or JEXL has most of the features for a lightweight query language for Beeson, with additional built-ins.

Sample data for queries

data

{
  "_typeManager": {
    "_version": "0.1.0",
    "_type": 8192,
    "_typeDefinitions": [
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 113,
            "_typeDefinitions": null,
            "nullable": false,
            "superBeeSon": false
          },
          "_json": 0
        },
        "segmentLength": 1
      },
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 8,
            "_typeDefinitions": null,
            "nullable": false,
            "superBeeSon": false
          },
          "_json": "1"
        },
        "segmentLength": 1
      },
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 2,
            "_typeDefinitions": null,
            "nullable": false,
            "superBeeSon": false
          },
          "_json": false
        },
        "segmentLength": 1
      },
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 16384,
            "_typeDefinitions": [
              {
                "beeSon": {
                  "_typeManager": {
                    "_version": "0.1.0",
                    "_type": 8,
                    "_typeDefinitions": null,
                    "nullable": false,
                    "superBeeSon": false
                  },
                  "_json": "john coke"
                },
                "segmentLength": 1,
                "marker": "name"
              }
            ],
            "nullable": false,
            "superBeeSon": false
          },
          "_json": { "name": "john coke" }
        },
        "segmentLength": 2
      },
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 113,
            "_typeDefinitions": null,
            "nullable": false,
            "superBeeSon": false
          },
          "_json": 5
        },
        "segmentLength": 1
      }
    ],
    "nullable": false,
    "superBeeSon": false
  },
  "_json": [0, "1", false, { "name": "john coke" }, 5]
}

Query type manager

query

 beeson.query(`_typeManager._typeDefinitions[0]`)

output

{
  "beeSon": {
    "_typeManager": {
      "_version": "0.1.0",
      "_type": 113,
      "_typeDefinitions": null,
      "nullable": false,
      "superBeeSon": false
    },
    "_json": 0
  },
  "segmentLength": 1
}

Query data

query

beeson.query(`_json[.name]`)

output

[
  {
    "name": "john coke"
  }
]

Mutate schema and data

query

// This is a built-in transform, one of many representing a Beeson type
beeson.typeManager.addTransform('appendString', async (val) => {
   return {
 "beeSon": {
                  "_typeManager": {
                    "_version": "0.1.0",
                    "_type": 8,
                    "_typeDefinitions": null,
                    "nullable": false,
                    "superBeeSon": false
                  },
                  "_json": val,
                },
     }
})
try {
  const typeDna1 = await beeson.typeManager.transform('_typeDefinitions|appendString("Hello")', context)
  // or
  const typeDna2 = await beeson.typeManager.appendString("world")
} catch (e) {
  // log error
}

output

{
  "_typeManager": {
    "_version": "0.1.0",
    "_type": 8192,
    "_typeDefinitions": [
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 113,
            "_typeDefinitions": null,
            "nullable": false,
            "superBeeSon": false
          },
          "_json": 0
        },
        "segmentLength": 1
      },
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 8,
            "_typeDefinitions": null,
            "nullable": false,
            "superBeeSon": false
          },
          "_json": "1"
        },
        "segmentLength": 1
      },
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 2,
            "_typeDefinitions": null,
            "nullable": false,
            "superBeeSon": false
          },
          "_json": false
        },
        "segmentLength": 1
      },
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 16384,
            "_typeDefinitions": [
              {
                "beeSon": {
                  "_typeManager": {
                    "_version": "0.1.0",
                    "_type": 8,
                    "_typeDefinitions": null,
                    "nullable": false,
                    "superBeeSon": false
                  },
                  "_json": "john coke"
                },
                "segmentLength": 1,
                "marker": "name"
              }
            ],
            "nullable": false,
            "superBeeSon": false
          },
          "_json": { "name": "john coke" }
        },
        "segmentLength": 2
      },
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 113,
            "_typeDefinitions": null,
            "nullable": false,
            "superBeeSon": false
          },
          "_json": 5
        },
        "segmentLength": 1
      },{
 "beeSon": {
                  "_typeManager": {
                    "_version": "0.1.0",
                    "_type": 8,
                    "_typeDefinitions": null,
                    "nullable": false,
                    "superBeeSon": false
                  },
                  "_json": "Hello",
                },
},{
 "beeSon": {
                  "_typeManager": {
                    "_version": "0.1.0",
                    "_type": 8,
                    "_typeDefinitions": null,
                    "nullable": false,
                    "superBeeSon": false
                  },
                  "_json": "World",
                }
}
    ],
    "nullable": false,
    "superBeeSon": false
  },
  "_json": [0, "1", false, { "name": "john coke" }, 5, "Hello", "World"]
}

Lookup SwarmSoC, SwarmFeed or SwarmBeeson reference

query

// This is a built-in transform for pathing, this is the simple case
beeson.typeManager.addTransform('lookupSwarmBeesonRef', async (ref, timeout = 60_000) => {
  // must return a Beeson object   
  return fdpStorage.download(ref).toBeeson()
})
try {
  const typeDna1 = await beeson.query('ref|lookupSwarmBeesonRef', context)
  // or
  const typeDna2 = await beeson.query.lookupSwarmBeesonRef(ref)
} catch (e) {
  // log error
}

output

{
  "_typeManager": {
    "_version": "0.1.0",
    "_type": 8192,
    "_typeDefinitions": [
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 113,
            "_typeDefinitions": null,
            "nullable": false,
            "superBeeSon": false
          },
          "_json": 0
        },
        "segmentLength": 1
      },
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 8,
            "_typeDefinitions": null,
            "nullable": false,
            "superBeeSon": false
          },
          "_json": "1"
        },
        "segmentLength": 1
      },
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 2,
            "_typeDefinitions": null,
            "nullable": false,
            "superBeeSon": false
          },
          "_json": false
        },
        "segmentLength": 1
      },
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 16384,
            "_typeDefinitions": [
              {
                "beeSon": {
                  "_typeManager": {
                    "_version": "0.1.0",
                    "_type": 8,
                    "_typeDefinitions": null,
                    "nullable": false,
                    "superBeeSon": false
                  },
                  "_json": "john coke"
                },
                "segmentLength": 1,
                "marker": "name"
              }
            ],
            "nullable": false,
            "superBeeSon": false
          },
          "_json": { "name": "john coke" }
        },
        "segmentLength": 2
      },
      {
        "beeSon": {
          "_typeManager": {
            "_version": "0.1.0",
            "_type": 113,
            "_typeDefinitions": null,
            "nullable": false,
            "superBeeSon": false
          },
          "_json": 5
        },
        "segmentLength": 1
      },{
 "beeSon": {
                  "_typeManager": {
                    "_version": "0.1.0",
                    "_type": 8,
                    "_typeDefinitions": null,
                    "nullable": false,
                    "superBeeSon": false
                  },
                  "_json": "Hello",
                },
},{
 "beeSon": {
                  "_typeManager": {
                    "_version": "0.1.0",
                    "_type": 8,
                    "_typeDefinitions": null,
                    "nullable": false,
                    "superBeeSon": false
                  },
                  "_json": "World",
                }
}
    ],
    "nullable": false,
    "superBeeSon": false
  },
  "_json": [0, "1", false, { "name": "john coke" }, 5, "Hello", "World"]
}

Copyright

Copyright and related rights waived via CC0.

Author

@molekilla (Rogelio Morrell)