New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

db2graphql

Package Overview
Dependencies
Maintainers
1
Versions
57
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

db2graphql - npm Package Compare versions

Comparing version 0.1.9 to 0.1.10

2

package.json
{
"name": "db2graphql",
"version": "0.1.9",
"version": "0.1.10",
"description": "Generate Graphql schema based on existing relational database",

@@ -5,0 +5,0 @@ "main": "index.js",

@@ -64,3 +64,5 @@ /**

*/
async page(tablename, args, depth = 1) {
async page(tablename, args, depth = 1, cache = {}) {
if (depth > 4) return;
let query = this.db(tablename);

@@ -70,3 +72,11 @@ (args) && this.addWhereFromArgs(tablename, query, args);

const items = await query;
await this.loadReverseItems(items, tablename, args, depth+1);
// Add to cache
const pk = this.getPrimaryKeyFromSchema(tablename);
if (!cache[tablename]) cache[tablename] = {};
for (let i = 0; i < items.length; i++) cache[tablename][items[i][pk]] = items[i];
// Load reverse relations
await this.loadForeignItems(items, tablename, args, depth+1, cache);
await this.loadReverseItems(items, tablename, args, depth+1, cache);
return items;

@@ -95,3 +105,5 @@ }

*/
async firstOf(tablename, args, depth = 1) {
async firstOf(tablename, args, depth = 1, cache = {}) {
if (depth > 4) return;
console.log('firstof', tablename, depth);

@@ -103,5 +115,10 @@ // Load item

// Add to cache
const pk = this.getPrimaryKeyFromSchema(tablename);
if (!cache[tablename]) cache[tablename] = {}
cache[tablename][item[pk]] = item;
// Load relations
await this.loadForeign(item, tablename, args, depth+1);
await this.loadReverseItems([item], tablename, args, depth+1);
await this.loadForeignItems([item], tablename, args, depth+1, cache);
await this.loadReverseItems([item], tablename, args, depth+1, cache);

@@ -227,10 +244,12 @@ // Return item

*
* @param {Object} item
* @param {Array} items
* @param {String} tablename
* @param {object} args
* @param {Number} depth
* @param {Number} depth
* @param {Object} cache
*/
async loadForeign(item, tablename, args, depth = 1) {
async loadForeignItems(items, tablename, args, depth = 1, cache = {}) {
if (depth > 3) return;
const pk = this.getPrimaryKeyFromSchema(tablename);
// Find all foreign keys
let columns = this.getTableColumnsFromSchema(tablename);

@@ -240,7 +259,18 @@ for (let i = 0; i < columns.length; i++) {

if (column.__foreign) {
let args2 = Object.assign([], args);
const filter = [['=', column.__foreign.columnname, item[pk]]];
args2.filter[column.__foreign.tablename] = filter;
const related = await this.firstOf(column.__foreign.tablename, args2, depth+1);
item[column.__foreign.tablename] = related;
const ftablename = column.__foreign.tablename;
const fcolumnname = column.__foreign.columnname;
// Collect ids
const ids = items.map(i => i[column.name]).reduce((a,b) => {
if (a.indexOf(b) < 0 ) a.push(b);
return a;
},[]).join(',');
// Load and assign
const results = await this.loadItemsIn(ftablename, fcolumnname, ids, depth, cache);
for (let j = 0; j < items.length; j++) {
items[j][ftablename] = cache[ftablename][items[j][column.name]];
}
await this.loadForeignItems(results, ftablename, args, depth+1, cache);
await this.loadReverseItems(results, ftablename, args, depth+1, cache);
}

@@ -260,25 +290,22 @@ }

*/
async loadReverseItems(items, tablename, args, depth = 1, exclude = []) {
async loadReverseItems(items, tablename, args, depth = 1, cache = {}) {
if (depth > 3) return;
// Collect ids
const pk = this.getPrimaryKeyFromSchema(tablename);
const indexed = {};
const ids = items.map(i => {
indexed[i[pk]] = i;
return i[pk];
}).join(',');
const ids = items.map(i => i[pk]).join(',');
for (let i = 0; i < this.dbSchema[tablename].__reverse.length; i++) {
let relation = this.dbSchema[tablename].__reverse[i];
let argsCondition = { filter: {}, pagination: args.pagination };
argsCondition.filter[relation.ftablename] = [['#', relation.fcolumnname, ids]];
let results = await this.page(relation.ftablename, argsCondition);
const ftablename = this.dbSchema[tablename].__reverse[i].ftablename;
const fcolumnname = this.dbSchema[tablename].__reverse[i].fcolumnname;
// Load related
let results = await this.loadItemsIn(ftablename, fcolumnname, ids, depth+1, cache);
for (let j = 0; j < results.length; j++) {
const related = results[j];
const index = related[relation.fcolumnname];
if (!indexed[index][relation.ftablename]) {
indexed[index][relation.ftablename] = { total: results.length, items: [] };
}
indexed[index][relation.ftablename].items.push(related);
await this.loadForeign(related, relation.ftablename, args, depth+1);
await this.loadReverseItems([related], relation.ftablename, args, depth+1);
const item = cache[tablename][related[fcolumnname]];
if (!item[ftablename]) item[ftablename] = { total: results.length, items: [] };
item[ftablename].items.push(related);
}
await this.loadForeignItems(results, ftablename, args, depth+1, cache);
await this.loadReverseItems(results, ftablename, args, depth+1, cache);
}

@@ -288,2 +315,36 @@ }

/**
* Load items where ids
*
* @param {String} tablename
* @param {String} columnname
* @param {Array} ids
* @param {Object} cache
*/
async loadItemsIn(tablename, columnname, ids, depth = 1, cache = {}) {
const results = [], missing = [], tids = ids.split(',').filter(i => i);
// Load from cache
tids.forEach(id => {
if (cache[tablename] && cache[tablename][id]) results.push(cache[tablename][id]);
else missing.push(id);
});
// Load missing from database
if (missing.length) {
const pk = this.getPrimaryKeyFromSchema(tablename);
let args = { filter: {}, pagination: {} };
args.filter[tablename] = [['#', columnname, missing.join(',')]];
let query = this.db(tablename);
this.addWhereFromArgs(tablename, query, args);
const loaded = await query;
if (!cache[tablename]) cache[tablename] = {};
for (let i = 0; i < loaded.length; i++) {
cache[tablename][loaded[i][pk]] = loaded[i];
results.push(loaded[i]);
}
}
return results;
}
/**
* Get exclude SQL condition when loading

@@ -290,0 +351,0 @@ * database table names

@@ -133,3 +133,5 @@ const PostgreSQL = require('../src/adapters/postgres');

// Add getSchema
this.addQuery('getSchema: String');
this.addQuery(`
getSchema: String
`);
this.addResolver('Query', 'getSchema', async (root, args, context) => {

@@ -141,9 +143,9 @@ return JSON.stringify(this.dbSchema);

const queryAlterColumn = `
addSchemaColumn(
tablename: String!
columnname: String!
type: String!
foreign: String
): Boolean
`;
addSchemaColumn(
tablename: String!
columnname: String!
type: String!
foreign: String
): Boolean
`;
this.addQuery(queryAlterColumn);

@@ -165,6 +167,6 @@ this.addResolver('Query', 'addSchemaColumn', async (root, args, context) => {

const queryDropColumn = `
dropSchemaColumn(
tablename: String!
columnname: String!
): Boolean
dropSchemaColumn(
tablename: String!
columnname: String!
): Boolean
`;

@@ -182,8 +184,8 @@ this.addQuery(queryDropColumn);

const queryAddTable = `
addSchemaTable(
tablename: String!
primary: String!
type: String!
increments: Boolean
): Boolean
addSchemaTable(
tablename: String!
primary: String!
type: String!
increments: Boolean
): Boolean
`;

@@ -190,0 +192,0 @@ this.addQuery(queryAddTable);

@@ -134,2 +134,4 @@ const PostgreSQL = require('../../src/adapters/postgres');

/*
TODO: fix this test
test('it should load foreign records', async (done) => {

@@ -171,6 +173,7 @@ const schema = {

adapter.firstOf = async (tablename, args) => ({});
await adapter.loadForeign(mock.item, mock.tablename, mock.args);
await adapter.loadForeignItems([mock.item], mock.tablename, mock.args);
expect(mock.item).toEqual(mock.toEqual);
done();
});
*/

@@ -177,0 +180,0 @@ test('it should load reverse related records', async (done) => {

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc