0.0.1 • Published 9 months ago

data-aggr v0.0.1

Weekly downloads
-
License
MIT
Repository
-
Last release
9 months ago

data-aggr

Data aggregation funcitons with typescript strict support

Contains functions:

  • aggr
  • disaggr

Funciton aggr()

Declaration of aggr()

/**
 * Aggregates and distributes objects from dictionary of models arrays
 * into array of objects (see tests for details)
 */
export function aggr<T extends {}, V extends Record<string, any[]> /* extends Record<string, (I* extends {})[]> */>(
    rootModels: T[], 
    vals: V,
    distribFn: (t: T, k: keyof V, v: V[typeof k][number]) => boolean
): (T & V)[]

Example of usage

const users = [
    {name: "Serj", age: 18},
    {name: "Mike", age: 32},
    {name: "Vasily", age: 23},
]

const permissions = [
    {name: "view-table", user: "Serj"},
    {name: "view-table", user: "Vasily"},
    {name: "admin", user: "Mike"},
    {name: "edit-table", user: "Vasily"}
]

const friends = [
    {name: "Edvard", friendof: "Vasily", location: "Australia"},
    {name: "Shasam", friendof: "Serj", location: "Baku"}
]

const aggregated = aggr(users, 
    {
        permissions: permissions,
        friends: friends
    },
    (r, k, v) => (k === "permissions") 
        ? ((v as typeof permissions[number]).user === r.name)
        : ((v as typeof friends[number]).friendof === r.name)
)

assert.deepStrictEqual(aggregated, [
    {
        name: "Serj", 
        age: 18, 
        permissions: [{name: "view-table", user: "Serj"}],
        friends: [{name: "Shasam", friendof: "Serj", location: "Baku"}],
    },
    {
        name: "Mike",
        age: 32,
        permissions: [{name: "admin", user: "Mike"}],
        friends: [],
    },
    {
        name: "Vasily", 
        age: 23,
        permissions: [
            {name: "view-table", user: "Vasily"}, 
            {name: "edit-table", user: "Vasily"}
        ],
        friends: [{name: "Edvard", friendof: "Vasily", location: "Australia"}]
    }
])

Function diaggr()

Declaration of disaggr()

/**
 * Extract values from models by key, contains array of values.
 * Return omited models and dictionary of extracted values.
 * Is reversed function for function aggr() 
 */
export function disaggr<T extends {}, K extends keyof T>(
    aggreagetes: T[],
    extractKeys: K[] /* extends any[] */
): [Omit<T, K>[], Pick<T, K>]

Example of usage disaggr()

const usersPersisted = [
    {
        name: "Serj", 
        age: 18, 
        permissions: [{name: "view-table", user: "Serj"}],
        friends: [{name: "Shasam", friendof: "Serj", location: "Baku"}],
    },
    {
        name: "Mike",
        age: 32,
        permissions: [{name: "admin", user: "Mike"}],
        friends: [],
    },
    {
        name: "Vasily", 
        age: 23,
        permissions: [
            {name: "view-table", user: "Vasily"}, 
            {name: "edit-table", user: "Vasily"}
        ],
        friends: [{name: "Edvard", friendof: "Vasily", location: "Australia"}]
    }
]

const [users, {permissions: permissions, friends: friends}] = 
    disaggr(usersPersisted, ["permissions", "friends"])

assert.deepStrictEqual(users, [
    {name: "Serj", age: 18},
    {name: "Mike", age: 32},
    {name: "Vasily", age: 23},
])

assert.deepStrictEqual(permissions, [
    {name: "view-table", user: "Serj"},
    {name: "admin", user: "Mike"},
    {name: "view-table", user: "Vasily"},
    {name: "edit-table", user: "Vasily"}
])

assert.deepStrictEqual(friends, [
    {name: "Shasam", friendof: "Serj", location: "Baku"},
    {name: "Edvard", friendof: "Vasily", location: "Australia"},
])

License

MIT

Author

Anatoly Starodubtsev tostar74@mail.ru

0.0.1

9 months ago