biz9-data
Version:
BiZ9-Data Package is an object-relational mapper (ORM) that lets you build a clean, portable, reusable, and high-level data access layer with Node.js for data driven applications. The package consists of create, read, update and destroy (CRUD) methods to
285 lines (283 loc) • 15.1 kB
JavaScript
/*
Copyright 2016 Certified CoderZ
Author: Brandon Poole Sr. (biz9framework@gmail.com)
License GNU General Public License v3.0
Description: BiZ9 Framework: Data - Foreign
*/
const async = require('async');
const {Log,Str,Num,Obj,DateTime}=require("/home/think1/www/doqbox/biz9-framework/biz9-utility/source");
const {Data_Value_Type,Data_Logic,Data_Table}=require("/home/think1/www/doqbox/biz9-framework/biz9-data-logic/source");
const {Adapter} = require('./adapter.js');
class Foreign {
static get_data = (database,cache,data_items,option) => {
return new Promise((callback) => {
let error = null;
const foreign_search_items = [];
async.series([
function(call){
for(const option_foreign of option.foreigns){
let foreign_item = Foreign.get_search(option_foreign);
for(const data_item of data_items){
let query_field = {};
query_field[foreign_item.foreign_field] = data_item[foreign_item.parent_field];
foreign_item.query.$or.push(query_field);
}
foreign_search_items.push(foreign_item);
}
const run_data = async (database,cache,search_item) => {
await Foreign.get_search_item_data(database,cache,search_item);
for(const data_item of data_items){
if(search_item.value_type == Data_Value_Type.ITEMS){
const match_items = search_item.items.filter(item_find => item_find[search_item.foreign_field] === data_item[search_item.parent_field]);
data_item[search_item.title] = [];
if(match_items.length>0){
data_item[search_item.title] = [...match_items];
}
}else if(search_item.value_type == Data_Value_Type.COUNT){
data_item[search_item.title] = search_item.data;
}else if(search_item.value_type == Data_Value_Type.ONE){
if(search_item.items.length>0){
data_item[search_item.title] = search_item.items[0];
}else{
data_item[search_item.title] = Data_Logic.get_not_found(search_item.foreign_table,0);
}
}
}
}
const run = async (database,cache) => {
for(const search_item of foreign_search_items){
await run_data(database,cache,search_item);
}
}
run(database,cache).then(() => {
call();
});
},
]).then(result => {
callback([error,data_items]);
}).catch(err => {
Log.error("Foreign-Get",err);
callback([error,[]]);
});
});
};
//9_search 9_get_search
static get_search = (foreign_item) => {
return {
value_type : foreign_item.value_type ? foreign_item.value_type : Data_Value_Type.ITEMS,
foreign_table : foreign_item.foreign_table,
foreign_field : foreign_item.foreign_field,
parent_field : foreign_item.parent_field,
parent_value : '',
field : foreign_item.field ? foreign_item.field : null,
title : foreign_item.title ? foreign_item.title : foreign_item.foreign_table,
page_current : foreign_item.page_current ? foreign_item.page_current : 1,
page_size : foreign_item.page_size ? foreign_item.page_size : 0,
sort_by : foreign_item.sort_by ? foreign_item.sort_by : {},
foreigns : foreign_item.foreigns ? foreign_item.foreigns : [],
items : [],
query : { $or: [] },
data : null
}
};
static get_items_data = (database,cache,search_item) =>{
return new Promise((resolve) => {
let search = Data_Logic.get_search(search_item.foreign_table,search_item.query,search_item.sort_by,search_item.page_current,search_item.page_size);
let foreign_option = search_item.field ? search_item.field : {};
if(search_item.query.$or.length>0){
Adapter.get_item_list(database,cache,search.table,search.filter,search.sort_by,search.page_current,search.page_size,foreign_option).then(([biz_error,items,item_count,page_count])=>{
resolve(items);
}).catch(err => {
Log.error('Foreign-Get-Data',err);
error=Log.append(error,err);
});
}else{
resolve([]);
}
});
}
static run_search_item_data = (database,cache,search_item)=> {
return new Promise((callback) => {
let error = null;
let data = null;
async.series([
async function(call) {
if(search_item.value_type == Data_Value_Type.ITEMS || search_item.value_type == Data_Value_Type.ONE ){
const biz_data = await Foreign.get_items_data(database,cache,search_item);
search_item.items = [...biz_data];
}else if(search_item.value_type == Data_Value_Type.COUNT){
const biz_data = await Foreign.get_count_data(database,search_item);
search_item.data = biz_data;
}
},
]).then(result => {
callback(search_item);
}).catch(err => {
Log.error("Blank-Get",err);
callback([error,[]]);
});
});
}
static get_count_data = (database,search_item) =>{
return new Promise((resolve) => {
let data = [];
function get_data(search_item,query) {
return new Promise((resolve2) => {
let search = Data_Logic.get_search(search_item.foreign_table,query,search_item.sort_by,search_item.page_current,search_item.page_size);
Adapter.get_count_item_list(database,search.table,search.filter).then(([biz_error,biz_data])=>{
search_item.data = 'applke';
resolve2(biz_data.count?biz_data.count : 0);
}).catch(err => {
Log.error('Foreign-Get-Data',err);
error=Log.append(error,err);
});
});
}
const run = async () => {
for(const search_item_query of search_item.query.$or){
const biz_data = await get_data(search_item,search_item_query);
if(search_item.value_type != Data_Value_Type.COUNT){
data.push({id:search_item_query.parent_id,data:biz_data});
}else{
data = biz_data;
}
}
}
run().then(() => {
resolve(data);
});
});
}
static get_search_item_data =(database,cache,search_item)=> {
return new Promise((callback) => {
let error = null;
let data = null;
async.series([
async function(call) {
search_item = await Foreign.run_search_item_data(database,cache,search_item);
},
function(call){
Foreign.get_search_item_detail_data(database,cache,search_item).then((error,search_item) => {
search_item = search_item;
call();
});
},
]).then(result => {
callback(search_item);
}).catch(err => {
Log.error("Foreign-Get-Search-Item-Data",err);
callback([error,[]]);
});
});
}
static get_search_item_detail_data = async (database,cache,search_item) => {
/* options
- none
*/
return new Promise((callback) => {
let error = null;
var sub_search_foreign_items = [];
async.series([
async function(call){
let sub_foreign_search_items = [];
if(search_item.value_type != Data_Value_Type.COUNT){
for(const sub_search_item of search_item.foreigns){
let sub_search_foreign_item = Foreign.get_search(sub_search_item); //here2
for(const data_item of search_item.items){
let query_field = {};
query_field[sub_search_foreign_item.foreign_field] = data_item[sub_search_foreign_item.parent_field];
sub_search_foreign_item.query.$or.push(query_field);
}
sub_search_foreign_item = await Foreign.run_search_item_data(database,cache,sub_search_foreign_item); //here3
sub_search_foreign_items.push(sub_search_foreign_item);
for(const data_item of search_item.items){
if(sub_search_foreign_item.value_type == Data_Value_Type.ITEMS){
const match_items = sub_search_foreign_item.items.filter(item_find => item_find[sub_search_foreign_item.foreign_field] === data_item[sub_search_foreign_item.parent_field]);
data_item[sub_search_foreign_item.title] = [];
if(match_items.length>0){
data_item[sub_search_foreign_item.title] = [...match_items];
}
}else if(sub_search_foreign_item.value_type == Data_Value_Type.COUNT){
data_item[sub_search_foreign_item.title] = sub_search_foreign_item.data;
}else if(sub_search_foreign_item.value_type == Data_Value_Type.ONE){
const match_items = sub_search_foreign_item.items.filter(item_find => item_find[sub_search_foreign_item.foreign_field] === data_item[sub_search_foreign_item.parent_field]);
if(match_items.length>0){
data_item[sub_search_foreign_item.title] = {};
data_item[sub_search_foreign_item.title] = match_items[0];
}else{
data_item[sub_search_foreign_item.title] = Data_Logic.get_not_found(sub_search_item.foreign_table,0);
}
}
}
}
}
},
async function(call){
var sub_child_search_foreign_items = [];
for(const sub_search_main_foreign_item of sub_search_foreign_items){
for(const sub_search_sub_foreign of sub_search_main_foreign_item.foreigns){
let sub_search_foreign_item = Foreign.get_search(sub_search_sub_foreign);
for(const sub_child_query_item of sub_search_main_foreign_item.items){
let query_field = {};
query_field[sub_search_foreign_item.foreign_field] = sub_child_query_item[sub_search_foreign_item.parent_field];
sub_search_foreign_item.query.$or.push(query_field);
}
sub_search_foreign_item = await Foreign.run_search_item_data(database,cache,sub_search_foreign_item); //here3
for(const data_item of sub_search_main_foreign_item.items){
if(sub_search_foreign_item.value_type == Data_Value_Type.ITEMS){
const match_items = sub_search_foreign_item.items.filter(item_find => item_find[sub_search_foreign_item.foreign_field] === data_item[sub_search_foreign_item.parent_field]);
data_item[sub_search_foreign_item.title] = [];
if(match_items.length>0){
data_item[sub_search_foreign_item.title] = [...match_items];
}
}else if(sub_search_foreign_item.value_type == Data_Value_Type.COUNT){
data_item[sub_search_foreign_item.title] = sub_search_foreign_item.data;
}else if(sub_search_foreign_item.value_type == Data_Value_Type.ONE){
const match_items = sub_search_foreign_item.items.filter(item_find => item_find[sub_search_foreign_item.foreign_field] === data_item[sub_search_foreign_item.parent_field]);
if(match_items.length>0){
data_item[sub_search_foreign_item.title] = {};
data_item[sub_search_foreign_item.title] = match_items[0];
}else{
data_item[sub_search_foreign_item.title] = Data_Logic.get_not_found(sub_search_sub_foreign.foreign_table,0);
}
}
}
}
}
},
]).then(result => {
callback([error,search_item]);
}).catch(err => {
Log.error("Get-Search-Item-Detail",err);
callback([err,{}]);
});
});
};
static blank = async (database,table,items) => {
/* options
- none
*/
return new Promise((callback) => {
let error = null;
let data = {};
async.series([
async function(call){
const [biz_error,biz_data] = await get(database,table,items);
if(biz_error){
error=Log.append(error,biz_error);
}else{
data = biz_data;
}
},
]).then(result => {
callback([error,data]);
}).catch(err => {
Log.error("Blank-Data",err);
callback([err,{}]);
});
});
};
}
module.exports = {
Foreign
};