Creating a database

January 8, 2021 ยท View on GitHub

Authors: Jubin Jose, Nibin Peter

A database creation process starts from schema definition. Below is the pseudo-code to generate a database from given schema:

Note: content inside angle brackets <> should be replaced accordingly based on the programming language used.

At the user / client side

user_defined_schema = {
    "description": "Database description",
    "unique": "random string",
    "encoder": "example.com/autoencoder.model",
    "codelen": <vector length integer>,
    "metadata": {
        "key 1": "type",
        "key 2": "type",
        ...
    }
}

def sign_message (JSON_object):
    return <Refer Aquila DB API specification to see modified JSON which is returned>

# call Aquila DB API to create a database and get database name in return
database_name = AquilaDB_DB_create_API(sign_message(user_defined_schema))

At the server / Aquila DB side

def AquilaDB_DB_create_API (user_defined_schema):
    # predefine metadata to be used in schema
    metadata_pre = {}
    for each `key` in sorted(user_defined_schema.metadata.list_keys()):
        metadata_pre[`key`] = {
            "type": <user_defined_schema.metadata[key]>
        }
    
    # generate actual schema from user defined schema
    generated_schema = { 
        "$schema": "http://json-schema.org/schema#", 
        "$id": "//aquilanetwork/schema/id/v1", 
        "title": "Schema", 
        "description": <user_defined_schema.description>,
        "encoder": <user_defined_schema.encoder>,
        "unique": <user_defined_schema.unique>,
        "type": "object",
        "properties": {
            "code": {
                "description": "Encoded data",
                "type": "array",
                "maxItems": <user_defined_schema.codelen>
                "items": {
                    "type": "number"
                }
            },
            "metadata": {
                "$ref": "#/definitions/metadata"
            }
        },
        "definitions": {
            "metadata": {
                "description": "User defined metadata",
                "type": "object",
                "properties": <metadata_pre>,
                "required": [<user_defined_schema.metadata.list_keys()>]
            }
        },
        "required": ["code", "metadata"]
    }
    
    # generate database name from content ID of schema
    # refer schema specification for pseudo-code
    database_name = CID(generated_schema)
    # create <AquilaDB data>/<database name> directory inside host file system 
    # & keep a copy of schema, empty key-value storage & empty vector storage
    status = init_database(database_name, generated_schema)
    # return database name with status
    return status, database_name