def _get_classid_for_dataset(connection, dataset_id, class_name): query = sqlalchemy.text(""" SELECT id FROM dataset_class WHERE name = :name AND dataset = :dataset_id""") result = connection.execute(query, { "name": class_name, "dataset_id": dataset_id }) if result.rowcount < 1: raise exceptions.NoDataFoundException("No such class exists.") clsid = result.fetchone() return clsid[0]
def create_snapshot(dataset_id): """Creates a snapshot of current version of a dataset. Snapshots are stored as JSON and have the following structure: { "name": "..", "description": "..", "classes": [ { "name": "..", "description: "..", "recordings": ["..", ...] }, ... ] } Args: dataset_id (string/uuid): ID of a dataset. Returns: ID (UUID) of a snapshot that was created. """ dataset = get(dataset_id) if not dataset: raise exceptions.NoDataFoundException( "Can't find dataset with a specified ID.") snapshot = { "name": dataset["name"], "description": dataset["description"], "classes": [{ "name": c["name"], "description": c["description"], "recordings": c["recordings"], } for c in dataset["classes"]], } with db.engine.connect() as connection: result = connection.execute( sqlalchemy.text(""" INSERT INTO dataset_snapshot (id, dataset_id, data) VALUES (uuid_generate_v4(), :dataset_id, :data) RETURNING id::text """), { "dataset_id": dataset_id, "data": json.dumps(snapshot), }) return result.fetchone()["id"]
def get(id): """Get dataset with a specified ID. Returns: Dictionary with dataset details if it has been found, None otherwise. """ with db.engine.connect() as connection: result = connection.execute( "SELECT id::text, name, description, author, created, public, last_edited " "FROM dataset " "WHERE id = %s", (str(id), )) if result.rowcount < 1: raise exceptions.NoDataFoundException( "Can't find dataset with a specified ID.") row = dict(result.fetchone()) row["classes"] = _get_classes(row["id"]) return row