Skip to content

Python and Javascript bindings to create and work with normalized relational JSON data

Notifications You must be signed in to change notification settings

rylito/datastore

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 

Repository files navigation

datastore

Python and Javascript bindings to create and work with normalized relational JSON data

Python

import json
from data_store import DataStore

schema = {
    'EMPLOYEE': ['first_name', 'last_name', {'name': 'id', 'hash_key': True}],
    'LANGUAGE': [{'name': 'name', 'hash_key': True}, 'popularity_rank'],
    'EXPERIENCE': [{'name': 'for_employee', 'fk': 'EMPLOYEE'}, {'name': 'for_language', 'fk': 'LANGUAGE'}, 'years']
}

employees = [
    {'first_name': 'Tom', 'last_name': 'Brown', 'id': 1},
    {'first_name': 'Steve', 'last_name': 'Smith', 'id': 2},
    {'first_name': 'Lisa', 'last_name': 'Jones', 'id': 3},
]

languages = [
    {'name': 'Python', 'popularity_rank': 1},
    {'name': 'Java', 'popularity_rank': 2},
    {'name': 'JavaScript', 'popularity_rank': 3},
]

experience = [
    {'for_employee': employees[0], 'for_language': languages[0], 'years': 3},
    {'for_employee': employees[0], 'for_language': languages[2], 'years': 4},
    {'for_employee': employees[1], 'for_language': languages[1], 'years': 5},
    {'for_employee': employees[2], 'for_language': languages[0], 'years': 2},
    {'for_employee': employees[2], 'for_language': languages[1], 'years': 1},
    {'for_employee': employees[2], 'for_language': languages[2], 'years': 6},
]

ds = DataStore(schema)

ds.insert_many('EXPERIENCE', experience)

serialized = json.dumps(ds.serialize())
print(serialized)

Serialized Data

{"EMPLOYEE": {"columns": ["first_name", "last_name", "id"], "data": [["Tom", "Brown", 1], ["Steve", "Smith", 2], ["Lisa", "Jones", 3]]}, "LANGUAGE": {"columns": ["name", "popularity_rank"], "data": [["Python", 1], ["JavaScript", 3], ["Java", 2]]}, "EXPERIENCE": {"columns": [{"name": "for_employee", "fk": "EMPLOYEE"}, {"name": "for_language", "fk": "LANGUAGE"}, "years"], "data": [[0, 0, 3], [0, 1, 4], [1, 2, 5], [2, 0, 2], [2, 2, 1], [2, 1, 6]]}}

JavaScript

let json_data = '{"EMPLOYEE": {"columns": ["first_name", "last_name", "id"], "data": [["Tom", "Brown", 1], ["Steve", "Smith", 2], ["Lisa", "Jones", 3]]}, "LANGUAGE": {"columns": ["name", "popularity_rank"], "data": [["Python", 1], ["JavaScript", 3], ["Java", 2]]}, "EXPERIENCE": {"columns": [{"name": "for_employee", "fk": "EMPLOYEE"}, {"name": "for_language", "fk": "LANGUAGE"}, "years"], "data": [[0, 0, 3], [0, 1, 4], [1, 2, 5], [2, 0, 2], [2, 2, 1], [2, 1, 6]]}}';

let data = JSON.parse(json_data);
let ds = new DataStore(data);

ds.select('EMPLOYEE').as_list()

[
  { first_name: "Tom", last_name: "Brown", id: 1 },
  { first_name: "Steve", last_name: "Smith", id: 2 },
  { first_name: "Lisa", last_name: "Jones", id: 3 },
]

ds.select('EMPLOYEE').as_dict('id')

{
  1: { first_name: "Tom", last_name: "Brown", id: 1 },
  2: { first_name: "Steve", last_name: "Smith", id: 2 },
  3: { first_name: "Lisa", last_name: "Jones", id: 3 },
}

ds.select('EMPLOYEE').as_dict('last_name')

{
  Brown: { first_name: "Tom", last_name: "Brown", id: 1 },
  Jones: { first_name: "Lisa", last_name: "Jones", id: 3 },
  Smith: { first_name: "Steve", last_name: "Smith", id: 2 },
}

ds.select('EMPLOYEE').only('first_name').as_dict('last_name')

{
  Brown: { first_name: "Tom" },
  Jones: { first_name: "Lisa" },
  Smith: { first_name: "Steve" },
}

ds.select('EXPERIENCE').as_list()

[
  {
    for_employee: { first_name: "Tom", last_name: "Brown", id: 1 },
    for_language: { name: "Python", popularity_rank: 1 },
    years: 3,
  },
  {
    for_employee: { first_name: "Tom", last_name: "Brown", id: 1 },
    for_language: { name: "JavaScript", popularity_rank: 3 },
    years: 4,
  },
  {
    for_employee: { first_name: "Steve", last_name: "Smith", id: 2 },
    for_language: { name: "Java", popularity_rank: 2 },
    years: 5,
  },
  {
    for_employee: { first_name: "Lisa", last_name: "Jones", id: 3 },
    for_language: { name: "Python", popularity_rank: 1 },
    years: 2,
  },
  {
    for_employee: { first_name: "Lisa", last_name: "Jones", id: 3 },
    for_language: { name: "Java", popularity_rank: 2 },
    years: 1,
  },
  {
    for_employee: { first_name: "Lisa", last_name: "Jones", id: 3 },
    for_language: { name: "JavaScript", popularity_rank: 3 },
    years: 6,
  }
]

About

Python and Javascript bindings to create and work with normalized relational JSON data

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published