{"version":3,"sources":["webpack://JsStoreWorker/webpack/bootstrap","webpack://JsStoreWorker/./src/common/utils/promise_resolve.ts","webpack://JsStoreWorker/./src/common/enums.ts","webpack://JsStoreWorker/./src/common/utils/promise.ts","webpack://JsStoreWorker/./src/worker/model/table_meta.ts","webpack://JsStoreWorker/./src/worker/meta_helper.ts","webpack://JsStoreWorker/./src/worker/model/db_meta.ts","webpack://JsStoreWorker/./src/common/utils/for_obj.ts","webpack://JsStoreWorker/./src/worker/utils/log_helper.ts","webpack://JsStoreWorker/./src/worker/idbutil/index.ts","webpack://JsStoreWorker/./src/common/utils/promise_all.ts","webpack://JsStoreWorker/./src/worker/utils/promise_reject.ts","webpack://JsStoreWorker/./src/worker/utils/get_error.ts","webpack://JsStoreWorker/./src/worker/executors/base.ts","webpack://JsStoreWorker/./src/worker/utils/get_error_from_exception.ts","webpack://JsStoreWorker/./src/worker/utils/get_data_type.ts","webpack://JsStoreWorker/./src/worker/utils/is_null.ts","webpack://JsStoreWorker/./src/worker/executors/insert/values_checker.ts","webpack://JsStoreWorker/./src/worker/executors/update/schema_checker.ts","webpack://JsStoreWorker/./src/worker/executors/query_helper.ts","webpack://JsStoreWorker/./src/worker/executors/insert/index.ts","webpack://JsStoreWorker/./src/worker/constants/index.ts","webpack://JsStoreWorker/./src/worker/utils/set_cross_browser_idb.ts","webpack://JsStoreWorker/./src/worker/utils/get_keys.ts","webpack://JsStoreWorker/./src/worker/utils/is_array.ts","webpack://JsStoreWorker/./src/worker/utils/get_length.ts","webpack://JsStoreWorker/./src/worker/utils/get_object_first_key.ts","webpack://JsStoreWorker/./src/worker/executors/select/then_evaluator.ts","webpack://JsStoreWorker/./src/worker/executors/select/not_where.ts","webpack://JsStoreWorker/./src/worker/utils/remove_space.ts","webpack://JsStoreWorker/./src/worker/executors/select/order_by.ts","webpack://JsStoreWorker/./src/worker/executors/select/where.ts","webpack://JsStoreWorker/./src/worker/utils/get_regex_from_like.ts","webpack://JsStoreWorker/./src/worker/utils/clone.ts","webpack://JsStoreWorker/./src/worker/utils/compare.ts","webpack://JsStoreWorker/./src/worker/executors/where_checker.ts","webpack://JsStoreWorker/./src/worker/executors/base_fetch.ts","webpack://JsStoreWorker/./src/worker/executors/select/in.ts","webpack://JsStoreWorker/./src/worker/executors/select/regex.ts","webpack://JsStoreWorker/./src/worker/executors/select/join.ts","webpack://JsStoreWorker/./src/worker/executors/select/index.ts","webpack://JsStoreWorker/./src/worker/utils/is_object.ts","webpack://JsStoreWorker/./src/worker/executors/select/base_select.ts","webpack://JsStoreWorker/./src/worker/executors/select/group_by.ts","webpack://JsStoreWorker/./src/worker/executors/count/not_where.ts","webpack://JsStoreWorker/./src/worker/executors/count/index.ts","webpack://JsStoreWorker/./src/worker/executors/count/where.ts","webpack://JsStoreWorker/./src/worker/executors/count/regex.ts","webpack://JsStoreWorker/./src/worker/executors/count/in.ts","webpack://JsStoreWorker/./src/worker/executors/update/update_value.ts","webpack://JsStoreWorker/./src/worker/executors/update/index.ts","webpack://JsStoreWorker/./src/worker/executors/update/not_where.ts","webpack://JsStoreWorker/./src/worker/executors/update/where.ts","webpack://JsStoreWorker/./src/worker/executors/update/regex.ts","webpack://JsStoreWorker/./src/worker/executors/update/in.ts","webpack://JsStoreWorker/./src/worker/intersect/index.ts","webpack://JsStoreWorker/./src/worker/executors/drop_db.ts","webpack://JsStoreWorker/./src/worker/union/index.ts","webpack://JsStoreWorker/./src/worker/executors/remove/index.ts","webpack://JsStoreWorker/./src/worker/executors/remove/in.ts","webpack://JsStoreWorker/./src/worker/executors/remove/not_where.ts","webpack://JsStoreWorker/./src/worker/executors/remove/where.ts","webpack://JsStoreWorker/./src/worker/executors/remove/regex.ts","webpack://JsStoreWorker/./src/worker/executors/clear/index.ts","webpack://JsStoreWorker/./src/worker/utils/resolve.ts","webpack://JsStoreWorker/./src/worker/executors/transaction/index.ts","webpack://JsStoreWorker/./src/worker/utils/db_schema.ts","webpack://JsStoreWorker/./src/worker/query_manager.ts","webpack://JsStoreWorker/./src/worker/index.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","ERROR_TYPE","WORKER_STATUS","DATA_TYPE","API","EVENT","QUERY_OPTION","IDB_MODE","OCCURENCE","CONNECTION_STATUS","promiseResolve","Promise","resolve","promise","cb","table","columns","autoIncColumnValue","this","setColumn","alter","tableColumns","columnName","column","autoIncrement","primaryKey","enableSearch","existingColumnIndex","indexOf","q","push","existingColumn","assign","autoIncrementKey","tableName","set","util","tx","createTransaction","MetaHelper","store","objectStore","res","rej","req","put","onsuccess","onerror","keyRange","result","remove","delete","dbSchema","db","version","tables","map","TableMeta","forObj","obj","type","info","info_","message","getMsg_","log","msg","status","console","throw","logError","error","errMsg","NotArray","UndefinedColumn","UndefinedValue","UndefinedColumnName","UndefinedDbName","UndefinedColumnValue","NoValueSupplied","InvalidOp","ColumnNotExist","EnableSearchOff","NullValue","WrongDataType","TableNotExist","DbNotExist","NotObject","DbBlocked","NullValueInWhere","MethodNotExist","IndexedDbNotSupported","InvalidJoinQuery","InvalidGroupQuery","InvalidOrderQuery","ImportScriptsFailed","InvalidMiddleware","Unknown","logger","emptyTx","oncomplete","onabort","createTransactionIfNotExist","ReadWrite","con","transaction","op","Between","IDBKeyRange","bound","low","high","GreaterThan","lowerBound","GreaterThanEqualTo","LessThan","upperBound","LessThanEqualTo","only","abortTransaction","abort","close","setTimeout","initDb","oldVersion","isDbCreated","dbVersion","dbOpenRequest","indexedDB","open","onversionchange","e","target","isCreated","newVersion","onupgradeneeded","upgradeConnection","storeNames","objectStoreNames","addColumn","options","unique","multiEntry","keyPath","createIndex","deleteColumn","index","findIndex","splice","deleteIndex","forEach","contains","option","createObjectStore","alterQuery","add","drop","modify","shouldDelete","targetColumn","find","newColumn","promiseAll","promises","all","promiseReject","reject","getError","rowAffected","isTxQuery","results","getColumnInfo","onException","ex","InvalidQuery","getErrorFromException","getDataType","Null","Array","isArray","Date","DateTime","isNull","length","isNaN","autoIncValues","autoIncrementValue","checkAndModifyValues","query","err","values","ignoreIndexes","every","item","checkAndModifyValue","ignore","checkAndModifyColumnValue_","checkNotNullAndDataType_","notNull","ColumnName","dataType","columnValue","Number","undefined","default","validation","details","check","setValue","tblName","checkByColumn_","checkFurther","allowedOp","prop","validate","api","Select","Remove","Count","checkSelect","Insert","checkInsertQuery","Update","checkUpdate","getTable_","isInsertQryValid","into","in","where","checkForNullInWhere_","addGreatAndLessToNotOp_","from","whereQuery","containsNot","qry","keys","NotEqualTo","addToSingleQry","Or","queryKeys","qryKeys","validResult","skipDataCheck","valuesAffected_","execute","insertData_","then","_","return","catch","onInsertData","addMethod","idbMethod","upsert","addResult","IS_WORKER","self","alert","ServiceWorkerGlobalScope","IS_IDB_SUPPORTED","mozIndexedDB","webkitIndexedDB","msIndexedDB","IDBTransaction","webkitIDBTransaction","msIDBTransaction","webkitIDBKeyRange","msIDBKeyRange","setCrossBrowserIndexedDb","getKeys","getLength","getObjectFirstKey","setCaseAndValue","caseQuery","caseQuery_","setCaseAndColumn","columnName_","caseColumnQuery_","length_","evaluate","checkCase_","lastThen","cond","queryOption","Equal","executeSkipAndLimit","onFinished","cursor","recordSkipped","limitRecord","pushResult","continue","advance","skipRecord","executeSkip","executeSimple","executeLimit","removeSpace","replace","getOrderColumnInfo","orderColumn","join","splittedByDot","split","valueFromFirstColumn","isOrder","compareStringInDesc_","a","b","localeCompare","compareStringinAsc_","compareDefaultInDesc_","String","compareDefaultinAsc_","compareNumberInDesc_","compareNumberinAsc_","compareDateInDesc_","getTime","compareDateInAsc_","getValInDesc_","value1","value2","thenEvaluator","column1","column2","getValInAsc_","getValueComparer_","order","orderBy_","getOrderType_","by","sort","columnInfo","case","toLowerCase","executeSkipAndLimitForWhere_","onFinish","shouldAddValue","executeSkipForWhere_","executeLimitForWhere_","executeSimpleForWhere_","getRegexFromLikeExpression","likeExpression","filterValue","occurence","filterValues","Any","Last","First","RegExp","clone","copy","compare","compareValue","symbol","type1","checkFlag","props","last","pop","reduce","prev","curr","rowValue","whereColumnValue","In","checkIn","Like","checkLike_","Regex","checkRegex","checkComparisionOp_","test","shouldEvaluateLimitAtEnd","shouldEvaluateSkipAtEnd","goToWhereLogic","firstColumn","indexNames","whereCheckerInstance","executeWhereLogic","regexVal","executeRegexLogic","executeInLogic","Aggregate","executeSkipAndLimitForIn_","skipOrPush","executeSkipForIn_","executeSimpleForIn_","executeSkipAndLimitForRegex_","executeSkipForRegex_","executeLimitForRegex_","executeSimpleForRegex_","select","joinQueryStack_","currentQueryStackIndex_","tablesFetched","getTable","executeSelect","tablesToFetch","jointblInfo","getJoinTableInfo_","on","with","table1","table2","checkJoinQuery_","joinTableInfo","flatten","startExecutingJoinLogic_","onJoinQueryFinished_","as","data","setLimitAndSkipEvaluationAtEnd_","processOrderBy","processGroupDistinctAggr","joinQuery","jointables","joinType","secondtableData","valueMatchedFromSecondTable","callBack","columnDefaultValue","table1Index","table2Index","col","valueFromFirstTable","valueFromSecondTable","performInnerJoin","joinOn","splittedjoinOn","splittedjoinOnbydotFirst","splittedjoinOnbydotSecond","tableSchemaOf1stTable","tableSchemaOf2ndTable","columnFound","sorted","isSubQuery","returnResult_","concat","skip","slice","limit","setPushResult","isArrayQry","idbSorting","groupBy","initTransaction_","processWhereArrayQry","processWhere_","executeWhereUndefinedLogic","executeJoinQuery","operation","pKey","isFirstWhere","output","onSuccess","And","andResults","keyValue","removeDuplicates","processFirstQry","shift","ReadOnly","or","processOrLogic_","onWhereEvaluated","isOr","orQuerySuccess_","orQueryFinish_","orInfo","orQuery","val","columnStore","cursorRequest","openCursor","orderType","dir","exp","datas","lookupObject","len","distinct","aggregate","executeAggregateGroupBy","processGroupBy","processAggregateQry","orderQueryType","prevOrderQueryBy","currentOrderQuery","currentorderQueryBy","orderColumnDetail","columnToAggregate","datasLength","getCount","getMax","getMin","Infinity","getSum","getAvg","aggregateColumn","aggregateValType","aggregateCalculator","grpQry","objKey","lookUpObj","aggregateQry","calculateAggregate","sumOfColumn","Max","Min","Sum","Avg","avg","sumForAvg","countForAvg","count","sum","isCountTypeString","isSumTypeString","avgColumn","groupByColumn","resultCount","queryHelper","getDataFromSelect","selectInstance","countRequest","updateValue","suppliedValue","storedValue","initTransaction","executeComplexLogic_","selectObject","ignoreCase","inQuery","whereQry","cursorUpdateRequest","update","cursorOpenRequest","intersectQry","getHashKey","hashMap","hashMapTemp","isQueryForSameTable","queries","queryLength","columnValKey","fetchData","selectResult","resultPusher","dbName","dropDbRequest","deleteDatabase","onblocked","keyList","pkey","Where","processOrLogic","_orInfo","OrQuery","columnIndex","clearRequest","clear","currentTable","variableFromPath","path","reqQueue","isQueryExecuting","isTxStarted_","startExecution_","onError","notExistingTable","notExistingTable_","methodName","method","txLogic","insert","pushReq_","setResult","getResult","abortTx_","start","startTx_","tableNames","processExecutionOfQry_","onReqFinished_","finisehdRequest","executeRequest_","request","requestObj","onReqFinished","promiseObj","invalidTable","userDbSchema","database","tableAsObj","fn","middlewares","onQryFinished","postMessage","executeMiddleware_","lastIndex","middlewareContext","callNextMiddleware","promiseResult","executeQuery","queryResult","OpenDb","openDb","InitDb","CloseDb","closeDb","Intersect","DropDb","dropDb","Terminate","terminate","Union","Clear","Transaction","Get","Set","ImportScripts","importScripts_","ChangeLogStatus","Middleware","callResultMiddleware","modifiedResult","run","onResult","importScripts","pResult","dataBase","dbMeta","dbInfo","onmessage"],"mappings":"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","file":"jsstore.worker.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n","export const promiseResolve = (value?) => {\n return Promise.resolve(value);\n}","export enum ERROR_TYPE {\n UndefinedColumn = \"undefined_column\",\n UndefinedValue = \"undefined_value\",\n UndefinedColumnName = \"undefined_column_name\",\n UndefinedDbName = \"undefined_database_name\",\n UndefinedColumnValue = \"undefined_column_value\",\n NotArray = \"not_array\",\n NoValueSupplied = \"no_value_supplied\",\n ColumnNotExist = \"column_not_exist\",\n EnableSearchOff = \"enable_search_off\",\n InvalidOp = \"invalid_operator\",\n NullValue = \"null_value\",\n WrongDataType = \"wrong_data_type\",\n TableNotExist = \"table_not_exist\",\n DbNotExist = \"db_not_exist\",\n ConnectionAborted = \"connection_aborted\",\n ConnectionClosed = \"connection_closed\",\n NotObject = \"not_object\",\n InvalidConfig = \"invalid_config\",\n DbBlocked = \"Db_blocked\",\n IndexedDbNotSupported = \"indexeddb_not_supported\",\n NullValueInWhere = \"null_value_in_where\",\n InvalidJoinQuery = 'invalid_join_query',\n InvalidOrderQuery = 'invalid_order_query',\n InvalidQuery = 'invalid_query',\n InvalidGroupQuery = 'invalid_group_query',\n ImportScriptsFailed = 'import_scripts_failed',\n MethodNotExist = 'method_not_exist',\n Unknown = \"unknown\",\n InvalidMiddleware = \"invalid_middleware\"\n}\n\nexport enum WORKER_STATUS {\n Registered = \"registerd\",\n Failed = \"failed\",\n NotStarted = \"not_started\"\n}\n\nexport enum DATA_TYPE {\n String = \"string\",\n Object = \"object\",\n Array = \"array\",\n Number = \"number\",\n Boolean = \"boolean\",\n Null = \"null\",\n DateTime = \"date_time\"\n}\n\nexport enum API {\n InitDb = \"init_db\",\n Get = \"get\",\n Set = \"set\",\n Select = \"select\",\n Insert = \"insert\",\n Update = \"update\",\n Remove = \"remove\",\n OpenDb = \"open_db\",\n Clear = \"clear\",\n DropDb = \"drop_db\",\n Count = \"count\",\n ChangeLogStatus = \"change_log_status\",\n Terminate = \"terminate\",\n Transaction = \"transaction\",\n CloseDb = \"close_db\",\n Union = \"union\",\n Intersect = \"intersect\",\n ImportScripts = \"import_scripts\",\n Middleware = \"middleware\"\n}\n\nexport enum EVENT {\n RequestQueueEmpty = \"requestQueueEmpty\",\n RequestQueueFilled = \"requestQueueFilled\",\n Upgrade = \"upgrade\",\n Create = \"create\",\n Open = \"open\"\n}\n\nexport enum QUERY_OPTION {\n Where = \"where\",\n Like = 'like',\n Regex = 'regex',\n In = 'in',\n Equal = \"=\",\n Between = '-',\n GreaterThan = '>',\n LessThan = '<',\n GreaterThanEqualTo = \">=\",\n LessThanEqualTo = \"<=\",\n NotEqualTo = \"!=\",\n Aggregate = \"aggregate\",\n Max = \"max\",\n Min = \"min\",\n Avg = \"avg\",\n Count = \"count\",\n Sum = \"sum\",\n Or = \"or\",\n Skip = \"skip\",\n Limit = \"limit\",\n And = \"and\",\n IgnoreCase = \"ignoreCase\",\n Then = \"then\"\n}\n\nexport enum IDB_MODE {\n ReadOnly = \"readonly\",\n ReadWrite = \"readwrite\"\n}\n\nexport enum OCCURENCE {\n First = 'f',\n Last = 'l',\n Any = 'a'\n}\n\nexport enum CONNECTION_STATUS {\n Connected = \"connected\",\n Closed = \"closed\",\n NotStarted = \"not_started\",\n UnableToStart = \"unable_to_start\",\n ClosedByJsStore = \"closed_by_jsstore\"\n}","export const promise = (cb: (res, rej?) => any) => {\n return new Promise(cb);\n}","import { ITable, IAlterQuery, IColumn, TColumns } from \"@/common\";\n\nexport class TableMeta {\n name: string;\n columns: IColumn[] = [];\n primaryKey: string;\n autoIncColumnValue = {};\n alter?: IAlterQuery;\n\n constructor(table: ITable) {\n this.columns = this.setColumn(table.columns);\n this.name = table.name;\n this.alter = table.alter || {};\n }\n\n setColumn(tableColumns: TColumns) {\n const columns = [];\n for (const columnName in tableColumns) {\n const column: IColumn = tableColumns[columnName] as any;\n column.name = columnName;\n if (column.autoIncrement) {\n this.autoIncColumnValue[columnName] = 0;\n }\n if (column.primaryKey) {\n this.primaryKey = columnName;\n }\n column.enableSearch = column.enableSearch == null ? true : column.enableSearch;\n const existingColumnIndex = this.columns.indexOf(q => q.name === columnName);\n if (existingColumnIndex < 0) {\n columns.push(column);\n }\n else {\n const existingColumn = this.columns[existingColumnIndex];\n Object.assign(existingColumn, column);\n }\n }\n return columns;\n }\n\n\n}","import { IDBUtil } from \"@/worker/idbutil\";\nimport { promise } from \"@/common\";\n\nexport class MetaHelper {\n static tableName = \"JsStore_Meta\";\n static autoIncrementKey(tableName: string, columnName: string) {\n return `JsStore_${tableName}_${columnName}_Value`;\n }\n static dbSchema = `JsStore_DbSchema`;\n\n static set(key, value, util: IDBUtil) {\n if (!util.tx) {\n util.createTransaction([MetaHelper.tableName]);\n }\n const store = util.objectStore(MetaHelper.tableName);\n\n return promise((res, rej) => {\n const req = store.put({\n key, value\n });\n req.onsuccess = () => {\n res();\n };\n req.onerror = rej;\n });\n }\n static get(key, util: IDBUtil) {\n if (!util.tx) {\n util.createTransaction([MetaHelper.tableName]);\n }\n const store = util.objectStore(MetaHelper.tableName);\n\n return promise((res, rej) => {\n const req = store.get(\n util.keyRange(key)\n );\n req.onsuccess = () => {\n const result = req.result;\n res(result && result.value);\n };\n req.onerror = rej;\n });\n }\n\n static remove(key, util: IDBUtil) {\n if (!util.tx) {\n util.createTransaction([MetaHelper.tableName]);\n }\n const store = util.objectStore(MetaHelper.tableName);\n\n return promise((res, rej) => {\n const req = store.delete(\n util.keyRange(key)\n );\n req.onsuccess = res;\n req.onerror = rej;\n });\n }\n}","import { IDataBase } from \"@/common\";\nimport { TableMeta } from \"./table_meta\";\nimport { MetaHelper } from \"@worker/meta_helper\";\n\nexport class DbMeta {\n name: string;\n version: number;\n tables: TableMeta[];\n\n constructor(db: IDataBase) {\n this.name = db.name;\n this.version = db.version || 1;\n db.tables.push({\n name: MetaHelper.tableName,\n columns: {\n key: {\n primaryKey: true\n },\n value: {\n enableSearch: false\n }\n },\n })\n this.tables = db.tables.map(table => {\n return new TableMeta(table);\n });\n }\n}","export const forObj = (obj: object, cb: (key, value) => void) => {\n for (const key in obj) {\n cb(key, obj[key]);\n }\n}","import { ERROR_TYPE, IError } from \"@/common\";\n\nexport class LogHelper implements IError {\n type: ERROR_TYPE;\n message: string;\n private info_: any;\n\n status: boolean;\n\n log(msg) {\n if (this.status) {\n console.log(msg);\n }\n }\n\n constructor(type: ERROR_TYPE, info?) {\n this.type = type;\n this.info_ = info;\n this.message = this.getMsg_();\n }\n\n throw() {\n throw this.get();\n }\n\n\n logError() {\n console.error(this.get());\n }\n\n\n\n get() {\n return {\n message: this.message,\n type: this.type\n } as IError;\n }\n\n private getMsg_() {\n let errMsg: string;\n switch (this.type) {\n case ERROR_TYPE.NotArray:\n errMsg = \"Supplied value is not an array\";\n break;\n case ERROR_TYPE.UndefinedColumn:\n errMsg = \"Column is undefined in Where\";\n break;\n case ERROR_TYPE.UndefinedValue:\n errMsg = \"Value is undefined in Where\";\n break;\n case ERROR_TYPE.UndefinedColumnName:\n errMsg = \"Column name is undefined '\" + this.info_['TableName'] + \"'\";\n break;\n case ERROR_TYPE.UndefinedDbName:\n errMsg = \"Database name is not supplied\";\n break;\n case ERROR_TYPE.UndefinedColumnValue:\n errMsg = \"Column value is undefined\";\n break;\n case ERROR_TYPE.NoValueSupplied:\n errMsg = \"No value is supplied\";\n break;\n case ERROR_TYPE.InvalidOp:\n errMsg = \"Invalid Op Value '\" + this.info_['Op'] + \"'\";\n break;\n case ERROR_TYPE.ColumnNotExist:\n errMsg = this.info_['isOrder'] ?\n `Column '${this.info_['column']}' in order query does not exist` :\n `Column '${this.info_['column']}' does not exist`;\n break;\n case ERROR_TYPE.EnableSearchOff:\n errMsg = \"Search is turned off for the Column '\" + this.info_['column'] + \"'\";\n break;\n case ERROR_TYPE.NullValue:\n errMsg = \"Null value is not allowed for column '\" + this.info_['ColumnName'] + \"'\";\n break;\n case ERROR_TYPE.WrongDataType:\n errMsg = \"Supplied value for column '\" + this.info_['column'] +\n \"' have wrong data type\";\n break;\n case ERROR_TYPE.TableNotExist:\n errMsg = \"Table '\" + this.info_['tableName'] + \"' does not exist\";\n break;\n case ERROR_TYPE.DbNotExist:\n errMsg = `Database with name ${this.info_['dbName']} does not exist`;\n break;\n case ERROR_TYPE.NotObject:\n errMsg = \"supplied value is not object\";\n break;\n case ERROR_TYPE.InvalidOp:\n errMsg = \"Invalid Config '\" + this.info_['Config'] + \" '\";\n break;\n case ERROR_TYPE.DbBlocked:\n errMsg = `database is blocked, cant be deleted right now`;\n break;\n case ERROR_TYPE.NullValueInWhere:\n errMsg = `Null/undefined is not allowed in where. Column '${this.info_['column']}' has null`;\n break;\n case ERROR_TYPE.MethodNotExist:\n errMsg = `method ${this.info_} does not exist.`;\n break;\n case ERROR_TYPE.IndexedDbNotSupported:\n errMsg = \"Browser does not support indexeddb\";\n break;\n case ERROR_TYPE.InvalidJoinQuery:\n case ERROR_TYPE.InvalidGroupQuery:\n case ERROR_TYPE.InvalidOrderQuery:\n case ERROR_TYPE.ImportScriptsFailed:\n errMsg = this.info_;\n break;\n case ERROR_TYPE.InvalidMiddleware:\n errMsg = `No function ${this.info_} is found.`;\n break;\n default:\n if (!this.type) {\n this.type = ERROR_TYPE.Unknown\n }\n errMsg = this.message;\n break;\n }\n return errMsg;\n }\n}","import { DbMeta, TableMeta } from \"@worker/model\";\nimport { IDB_MODE, QUERY_OPTION, promise, forObj, IColumn, IDataBase, InitDbResult } from \"@/common\";\nimport { LogHelper, userDbSchema } from \"@worker/utils\";\nimport { MetaHelper } from \"../meta_helper\";\n\n\nexport class IDBUtil {\n\n db: DbMeta;\n\n con: IDBDatabase;\n tx: IDBTransaction;\n\n logger = new LogHelper(null);\n\n emptyTx() {\n if (!this.tx) return;\n this.tx.oncomplete = null;\n this.tx.onabort = null;\n this.tx.onerror = null;\n this.tx = null;\n }\n\n createTransactionIfNotExist(tables: string[], mode?: IDB_MODE) {\n if (!this.tx) {\n this.createTransaction(tables, mode);\n }\n }\n\n createTransaction(tables: string[], mode = IDB_MODE.ReadWrite) {\n this.tx = this.con.transaction(tables, mode);\n return promise((res, rej) => {\n this.tx.oncomplete = res;\n this.tx.onabort = res;\n this.tx.onerror = rej;\n });\n }\n\n keyRange(value, op?) {\n let keyRange: IDBKeyRange;\n switch (op) {\n case QUERY_OPTION.Between: keyRange = IDBKeyRange.bound(value.low, value.high, false, false); break;\n case QUERY_OPTION.GreaterThan: keyRange = IDBKeyRange.lowerBound(value, true); break;\n case QUERY_OPTION.GreaterThanEqualTo: keyRange = IDBKeyRange.lowerBound(value); break;\n case QUERY_OPTION.LessThan: keyRange = IDBKeyRange.upperBound(value, true); break;\n case QUERY_OPTION.LessThanEqualTo: keyRange = IDBKeyRange.upperBound(value); break;\n default: keyRange = IDBKeyRange.only(value); break;\n }\n return keyRange;\n }\n\n objectStore(name: string) {\n return this.tx.objectStore(name);\n }\n\n abortTransaction() {\n if (this.tx) {\n this.tx.abort();\n }\n }\n\n close() {\n if (this.con) {\n this.con.close();\n }\n // wait for 100 ms before success\n return promise(res => {\n this.con = null;\n setTimeout(res, 100);\n });\n }\n\n initDb(db) {\n this.db = db;\n let isDbCreated = false;\n const dbVersion = db.version;\n let oldVersion;\n const initLogic = (res, rej) => {\n const dbOpenRequest = indexedDB.open(db.name, dbVersion);\n dbOpenRequest.onsuccess = () => {\n this.con = dbOpenRequest.result;\n this.con.onversionchange = (e: any) => {\n // if (e.newVersion === null) { // An attempt is made to delete the db\n e.target.close(); // Manually close our connection to the db\n // }\n }\n\n res({\n isCreated: isDbCreated,\n oldVersion: oldVersion,\n newVersion: dbVersion\n } as InitDbResult);\n }\n\n dbOpenRequest.onerror = (e) => {\n console.error(\"error\", e);\n rej(e);\n };\n\n dbOpenRequest.onupgradeneeded = (e: IDBVersionChangeEvent) => {\n oldVersion = e.oldVersion;\n const target: {\n result: IDBDatabase,\n transaction: IDBTransaction\n } = (e as any).target\n const upgradeConnection = target.result;\n isDbCreated = true;\n const transaction = target.transaction;\n const storeNames = upgradeConnection.objectStoreNames;\n const createObjectStore = (table: TableMeta) => {\n const option: IDBObjectStoreParameters = table.primaryKey ? {\n keyPath: table.primaryKey\n } : {\n autoIncrement: true\n }\n\n const store = upgradeConnection.createObjectStore(table.name, option);\n table.columns.forEach(column => {\n addColumn(store, column)\n });\n }\n const addColumn = (store: IDBObjectStore, column: IColumn) => {\n if (column.enableSearch) {\n const columnName = column.name;\n const options = column.primaryKey ? { unique: true } : { unique: column.unique };\n options['multiEntry'] = column.multiEntry;\n const keyPath = column.keyPath == null ? columnName : column.keyPath;\n store.createIndex(columnName, keyPath, options);\n }\n }\n const deleteColumn = (store: IDBObjectStore, table: TableMeta, columnName: string) => {\n const index = table.columns.findIndex(q => q.name === columnName);\n if (index >= 0) {\n table.columns.splice(index, 1);\n store.deleteIndex(columnName);\n }\n }\n db.tables.forEach(table => {\n if (!storeNames.contains(table.name)) {\n return createObjectStore(table);\n }\n const store = transaction.objectStore(table.name);\n for (let i = oldVersion; i <= dbVersion; i++) {\n const alterQuery = table.alter[i];\n if (alterQuery) {\n if (alterQuery.add) {\n const newColumns = table.setColumn(alterQuery.add);\n newColumns.forEach(column => {\n addColumn(store, column);\n table.columns.push(column);\n })\n }\n forObj(\n alterQuery.drop || {}, ((columnName) => {\n deleteColumn(store, table, columnName);\n })\n )\n forObj(\n alterQuery.modify || {}, ((columnName, column: IColumn) => {\n const shouldDelete = column.multiEntry || column.keyPath || column.unique;\n let targetColumn = table.columns.find(q => q.name === columnName);\n const newColumn = Object.assign(targetColumn, column);\n newColumn.name = columnName;\n if (shouldDelete) {\n deleteColumn(store, table, columnName);\n addColumn(store, newColumn);\n table.columns.push(newColumn);\n }\n })\n )\n }\n }\n });\n }\n }\n return promise(initLogic)\n }\n}","export const promiseAll = (promises: any) => {\n return Promise.all(promises);\n};","export const promiseReject = (value) => {\n return Promise.reject(value);\n}","import { LogHelper } from \"./log_helper\";\n\nexport const getError = (e) => {\n const customError = e instanceof LogHelper;\n if (customError) {\n e.logError();\n return (e as LogHelper).get();\n }\n else {\n let error;\n if (e.name) {\n error = new LogHelper(e.name);\n error.message = e.message;\n }\n else {\n error = new LogHelper((e as any).target.error.name);\n error.message = (e as any).target.error.message;\n }\n if (process.env.NODE_ENV === 'dev') {\n error.logError();\n }\n return error.get();\n }\n}","import { IDBUtil } from \"@worker/idbutil\";\nimport { IInsertQuery, ISelectQuery, ERROR_TYPE, IUpdateQuery } from \"@/common\";\nimport { LogHelper, getError, promiseReject, getErrorFromException } from \"@worker/utils\";\nimport { DbMeta } from \"@worker/model\";\n\nexport class Base {\n db: DbMeta;\n util: IDBUtil;\n query: IInsertQuery | ISelectQuery | IUpdateQuery;\n\n rowAffected = 0;\n isTxQuery = false;\n objectStore: IDBObjectStore;\n tableName: string;\n\n protected results: any[] = [];\n // get tableName() {\n // return (this.query as SelectQuery).from || (this.query as InsertQuery).into\n // }\n\n table(name?: string) {\n const tableName = name || this.tableName;\n return this.db.tables.find(q => q.name === tableName)\n }\n\n primaryKey(tableName?: string) {\n return this.table(tableName).primaryKey;\n }\n\n\n protected getColumnInfo(columnName: string, tableName?: string) {\n return this.table(tableName).columns.find(column => column.name === columnName);\n }\n\n\n\n onException(ex: DOMException, type?) {\n console.error(ex);\n this.util.abortTransaction();\n return promiseReject(\n getErrorFromException(ex, type)\n );\n }\n}","import { ERROR_TYPE } from \"@/common\"\nimport { getError } from \"./get_error\";\n\nexport const getErrorFromException = (ex, type = ERROR_TYPE.InvalidQuery) => {\n ex.name = type;\n return getError(ex);\n}","import { DATA_TYPE } from \"@/common\";\n\nexport const getDataType = (value) => {\n if (value == null) {\n return DATA_TYPE.Null;\n }\n const type = typeof value;\n switch (type) {\n case 'object':\n if (Array.isArray(value)) {\n return DATA_TYPE.Array;\n }\n if (value instanceof Date) {\n return DATA_TYPE.DateTime;\n }\n }\n return type;\n}","export const isNull = (value) => {\n if (value == null) {\n return true;\n } else {\n switch (typeof value) {\n case 'string': return value.length === 0;\n case 'number': return isNaN(value);\n }\n }\n return false;\n};","import { TableMeta } from \"@/worker/model/table_meta\";\nimport { IColumn, TStringAny, ERROR_TYPE, DATA_TYPE, IInsertQuery } from \"@/common\";\nimport { getDataType, LogHelper, isNull } from \"@/worker/utils\";\n\n\nexport class ValuesChecker {\n table: TableMeta;\n autoIncrementValue;\n query: IInsertQuery;\n\n constructor(table: TableMeta, autoIncValues) {\n this.table = table;\n this.autoIncrementValue = autoIncValues;\n }\n\n checkAndModifyValues(query: IInsertQuery) {\n let err: LogHelper;\n this.query = query;\n const values = query.values;\n const ignoreIndexes = [];\n values.every((item, index) => {\n err = this.checkAndModifyValue(item);\n if (query.ignore && err) {\n ignoreIndexes.push(index);\n err = null;\n }\n return err ? false : true;\n });\n ignoreIndexes.forEach(index => {\n values.splice(index, 1);\n });\n return { err, values };\n }\n\n private checkAndModifyValue(value) {\n let error: LogHelper;\n this.table.columns.every(column => {\n error = this.checkAndModifyColumnValue_(column, value);\n return error ? false : true;\n })\n return error;\n }\n\n private checkNotNullAndDataType_(column: IColumn, value: TStringAny) {\n // check not null schema\n if (column.notNull && isNull(value[column.name])) {\n return this.getError(ERROR_TYPE.NullValue, { ColumnName: column.name });\n }\n // check datatype\n else if (column.dataType && !isNull(value[column.name]) &&\n getDataType(value[column.name]) !== column.dataType) {\n return this.getError(ERROR_TYPE.WrongDataType, { column: column.name });\n }\n }\n\n private checkAndModifyColumnValue_(column: IColumn, value: TStringAny) {\n const columnValue = value[column.name];\n // check auto increment scheme\n if (column.autoIncrement) {\n // if value is null, then create the autoincrement value\n if (isNull(columnValue)) {\n value[column.name] = ++this.autoIncrementValue[column.name];\n }\n else {\n if (getDataType(columnValue) === DATA_TYPE.Number) {\n // if column value is greater than autoincrement value saved, then make the\n // column value as autoIncrement value\n if (columnValue > this.autoIncrementValue[column.name]) {\n this.autoIncrementValue[column.name] = columnValue;\n }\n }\n }\n }\n // check Default Schema\n else if (column.default !== undefined && isNull(columnValue)) {\n value[column.name] = column.default;\n }\n const query = this.query;\n if (query.validation) {\n return this.checkNotNullAndDataType_(column, value);\n }\n }\n\n private getError(error: ERROR_TYPE, details: object) {\n return new LogHelper(error, details);\n }\n}","import { IColumn, DATA_TYPE, ERROR_TYPE } from \"@/common\";\nimport { LogHelper, isNull, getDataType } from \"@worker/utils\";\nimport { TableMeta } from \"@worker/model\";\n\nexport class SchemaChecker {\n table: TableMeta;\n constructor(table: TableMeta) {\n this.table = table;\n }\n\n check(setValue: object, tblName: string) {\n let log: LogHelper;\n if (typeof setValue === DATA_TYPE.Object) {\n if (this.table) {\n // loop through table column and find data is valid\n this.table.columns.every((column) => {\n if (column.name in setValue) {\n log = this.checkByColumn_(column, setValue[column.name]);\n }\n return log ? false : true;\n });\n }\n else {\n log = new LogHelper(ERROR_TYPE.TableNotExist, { tableName: tblName });\n }\n }\n else {\n log = new LogHelper(ERROR_TYPE.NotObject);\n }\n return log;\n }\n\n\n\n private checkByColumn_(column: IColumn, value) {\n // check not null schema\n if (column.notNull === true && isNull(value)) {\n return new LogHelper(ERROR_TYPE.NullValue, { ColumnName: column.name });\n }\n\n // check datatype\n const type = getDataType(value);\n const checkFurther = value != null;\n if (column.dataType && checkFurther) {\n if (type !== column.dataType && type !== 'object') {\n return new LogHelper(ERROR_TYPE.WrongDataType, { column: column.name });\n }\n }\n\n // check allowed operators\n if (checkFurther && type === 'object') {\n const allowedOp = ['+', '-', '*', '/', '{push}'];\n for (const prop in value) {\n if (allowedOp.indexOf(prop) < 0 && column.dataType && type !== column.dataType) {\n return new LogHelper(ERROR_TYPE.WrongDataType, { column: column.name });\n }\n }\n }\n }\n}","import { IInsertQuery, DATA_TYPE, ERROR_TYPE, ISelectQuery, QUERY_OPTION, IUpdateQuery, API } from \"@/common\";\nimport { LogHelper, getDataType } from \"@/worker/utils\";\nimport { DbMeta } from \"../model\";\nimport { ValuesChecker } from \"@worker/executors/insert\";\nimport { SchemaChecker } from \"./update/schema_checker\";\n\nexport class QueryHelper {\n db: DbMeta;\n\n constructor(dbSchema: DbMeta) {\n this.db = dbSchema;\n }\n\n validate(api: API, query: IInsertQuery | ISelectQuery | IUpdateQuery) {\n switch (api) {\n case API.Select:\n case API.Remove:\n case API.Count:\n return this.checkSelect(query as ISelectQuery);\n case API.Insert:\n return this.checkInsertQuery(query as IInsertQuery);\n case API.Update:\n return this.checkUpdate(query as IUpdateQuery);\n }\n }\n\n private getTable_(tableName: string) {\n return this.db.tables.find(q => q.name === tableName);\n }\n\n isInsertQryValid(query: IInsertQuery) {\n const table = this.getTable_(query.into);\n let log: LogHelper;\n if (table) {\n switch (getDataType(query.values)) {\n case DATA_TYPE.Array:\n break;\n case DATA_TYPE.Null:\n log = new LogHelper(ERROR_TYPE.NoValueSupplied);\n break;\n default:\n log = new LogHelper(ERROR_TYPE.NotArray);\n }\n }\n else {\n log = new LogHelper(ERROR_TYPE.TableNotExist, { tableName: query.into });\n }\n return {\n table, log\n };\n }\n\n private checkUpdate(query: IUpdateQuery) {\n let err = new SchemaChecker(this.getTable_(query.in)).\n check(query.set, query.in);\n if (err) return err;\n if (query.where != null) {\n err = this.checkForNullInWhere_(query);\n if (err) return err;\n this.addGreatAndLessToNotOp_(query as any);\n }\n }\n\n private checkSelect(query: ISelectQuery) {\n const table = this.getTable_(query.from);\n if (!table) {\n return new LogHelper(ERROR_TYPE.TableNotExist,\n { tableName: query.from }\n );\n }\n\n if (query.where) {\n const err = this.checkForNullInWhere_(query);\n if (err) return err;\n this.addGreatAndLessToNotOp_(query);\n }\n }\n\n private checkForNullInWhere_(query): LogHelper {\n for (const columnName in query.where) {\n if (query.where[columnName] == null) {\n return new LogHelper(ERROR_TYPE.NullValueInWhere, { column: columnName });\n }\n }\n }\n\n private addGreatAndLessToNotOp_(query: ISelectQuery) {\n const whereQuery = query.where;\n const containsNot = (qry: object, keys: string[]) => {\n return keys.findIndex(key => qry[key][QUERY_OPTION.NotEqualTo] != null) >= 0;\n };\n const addToSingleQry = (qry, keys: string[]) => {\n let value;\n keys.forEach((prop) => {\n value = qry[prop];\n if (value[QUERY_OPTION.NotEqualTo] != null) {\n qry[prop][QUERY_OPTION.GreaterThan] = value[QUERY_OPTION.NotEqualTo];\n if (qry[QUERY_OPTION.Or] === undefined) {\n qry[QUERY_OPTION.Or] = {};\n qry[QUERY_OPTION.Or][prop] = {};\n }\n else if (qry[QUERY_OPTION.Or][prop] === undefined) {\n qry[QUERY_OPTION.Or][prop] = {};\n }\n qry[QUERY_OPTION.Or][prop][QUERY_OPTION.LessThan] = value[QUERY_OPTION.NotEqualTo];\n delete qry[prop][QUERY_OPTION.NotEqualTo];\n }\n });\n return qry;\n };\n switch (getDataType(whereQuery)) {\n case DATA_TYPE.Object:\n const queryKeys = Object.keys(whereQuery);\n if (containsNot(whereQuery, queryKeys)) {\n if (queryKeys.length === 1) {\n query.where = addToSingleQry(whereQuery, queryKeys);\n }\n else {\n const whereTmpQry = [];\n queryKeys.forEach((prop) => {\n whereTmpQry.push(addToSingleQry({ [prop]: whereQuery[prop] }, [prop]));\n });\n query.where = whereTmpQry;\n }\n }\n break;\n default:\n const whereTmp = [];\n (whereQuery as object[]).forEach(qry => {\n const qryKeys = Object.keys(qry);\n if (containsNot(qry, qryKeys)) {\n qry = addToSingleQry(qry, qryKeys);\n }\n whereTmp.push(qry);\n });\n query.where = whereTmp;\n }\n }\n\n private checkInsertQuery(query: IInsertQuery) {\n const validResult = this.isInsertQryValid(query);\n let table = validResult.table;\n const error = validResult.log;\n if (error) return error;\n if (query.skipDataCheck) return;\n const valueCheckerInstance = new ValuesChecker(table, table.autoIncColumnValue);\n const { values, err } = valueCheckerInstance.checkAndModifyValues(query);\n query.values = values;\n return err;\n }\n}","export * from \"./values_checker\";\nimport { IInsertQuery, promise, promiseAll, TStringAny, API, IDB_MODE } from \"@/common\";\nimport { Base } from \"@worker/executors/base\";\nimport { IDBUtil } from \"@/worker/idbutil\";\nimport { QueryHelper } from \"@worker/executors/query_helper\";\nimport { DbMeta } from \"@/worker/model\";\nimport { getError, promiseReject } from \"@/worker/utils\";\nimport { MetaHelper } from \"@/worker/meta_helper\";\n\nexport class Insert extends Base {\n\n query: IInsertQuery;\n\n private valuesAffected_ = [];\n\n constructor(query: IInsertQuery, util: IDBUtil) {\n super();\n if (query.validation == null) {\n query.validation = true;\n }\n this.query = query;\n this.util = util;\n this.tableName = query.into;\n }\n\n execute(db: DbMeta) {\n const err = new QueryHelper(db).validate(API.Insert, this.query);\n if (err) return promiseReject(err);\n return this.insertData_(db).then(_ => {\n return this.query.return ? this.valuesAffected_ : this.rowAffected\n }).catch(err => {\n this.util.abortTransaction();\n return promiseReject(err);\n })\n }\n\n private insertData_(db: DbMeta) {\n\n let onInsertData;\n let addMethod;\n\n const query = this.query;\n if (query.return) {\n onInsertData = (value) => {\n this.valuesAffected_.push(value);\n };\n\n }\n else {\n onInsertData = (value) => {\n ++this.rowAffected;\n };\n }\n addMethod = (() => {\n const idbMethod = query.upsert ? \"put\" : \"add\";\n if (query.ignore && !this.isTxQuery) {\n return (value) => {\n const tx = this.util.con.transaction(query.into, IDB_MODE.ReadWrite);\n const objectStore = tx.objectStore(query.into);\n return objectStore[idbMethod](value);\n };\n }\n if (!this.isTxQuery) {\n this.util.createTransaction(\n [query.into, MetaHelper.tableName],\n )\n }\n this.objectStore = this.util.objectStore(this.tableName);\n return (value) => {\n return this.objectStore[idbMethod](value);\n };\n })();\n\n return promiseAll(\n query.values.map((value) => {\n return promise((res, rej) => {\n const addResult = addMethod(value);\n addResult.onerror = (err) => {\n if (query.ignore) {\n res();\n } else {\n rej(err);\n }\n }\n addResult.onsuccess = function () {\n onInsertData(value);\n res();\n };\n });\n })\n ).then(() => {\n MetaHelper.set(MetaHelper.dbSchema, db, this.util);\n });\n }\n}","import { setCrossBrowserIndexedDb } from \"@worker/utils\";\n\nexport const IS_WORKER = typeof (self as any).alert === 'undefined' && typeof ServiceWorkerGlobalScope === 'undefined';\nexport const IS_IDB_SUPPORTED = setCrossBrowserIndexedDb();","export const setCrossBrowserIndexedDb = () => {\n try {\n if (!indexedDB) {\n indexedDB = (self as any).mozIndexedDB ||\n (self as any).webkitIndexedDB || (self as any).msIndexedDB;\n }\n if (indexedDB) {\n IDBTransaction = IDBTransaction ||\n (self as any).webkitIDBTransaction || (self as any).msIDBTransaction;\n (self as any).IDBKeyRange = (self as any).IDBKeyRange ||\n (self as any).webkitIDBKeyRange || (self as any).msIDBKeyRange;\n }\n else {\n return false;\n }\n } catch (ex) {\n return false;\n }\n return true;\n};","export const getKeys = (value) => {\n return Object.keys(value);\n};","export const isArray = (value) => {\n return Array.isArray(value);\n};","import { getKeys } from \"./get_keys\"\n\nexport const getLength = (value): Number => {\n return getKeys(value).length;\n}","export const getObjectFirstKey = (value) => {\n for (const key in value) {\n return key;\n }\n};","import { ICaseOption, QUERY_OPTION } from \"@/common\";\n\nexport class ThenEvaluator {\n private columnName_: string;\n private value;\n private caseQuery_: { [columnName: string]: [ICaseOption] };\n private caseColumnQuery_: ICaseOption[];\n private length_: number;\n\n setCaseAndValue(caseQuery: any, value) {\n this.caseQuery_ = caseQuery;\n this.setValue(value);\n }\n\n setCaseAndColumn(caseQuery: { [columnName: string]: [ICaseOption] }, columnName: string) {\n this.caseQuery_ = caseQuery;\n this.setColumn(columnName);\n return this;\n }\n\n setColumn(columnName: string) {\n this.columnName_ = columnName;\n this.caseColumnQuery_ = this.caseQuery_[this.columnName_];\n this.length_ = this.caseColumnQuery_.length;\n return this;\n }\n\n setValue(value) {\n this.value = value;\n return this;\n }\n\n evaluate() {\n for (let i = 0; i < this.length_; i++) {\n if (this.checkCase_(this.caseColumnQuery_[i]) === true) {\n return this.caseColumnQuery_[i].then;\n }\n }\n const lastThen = this.caseColumnQuery_[this.length_ - 1].then;\n return lastThen == null ? this.value[this.columnName_] : lastThen;\n }\n\n private checkCase_(cond: ICaseOption) {\n let queryOption;\n for (queryOption in cond) {\n switch (queryOption) {\n case QUERY_OPTION.GreaterThan:\n if (this.value[this.columnName_] > cond[queryOption]) {\n return true;\n } break;\n case QUERY_OPTION.Equal:\n if (this.value[this.columnName_] === cond[queryOption]) {\n return true;\n } break;\n case QUERY_OPTION.LessThan:\n if (this.value[this.columnName_] < cond[queryOption]) {\n return true;\n } break;\n case QUERY_OPTION.GreaterThanEqualTo:\n if (this.value[this.columnName_] >= cond[queryOption]) {\n return true;\n } break;\n case QUERY_OPTION.LessThanEqualTo:\n if (this.value[this.columnName_] <= cond[queryOption]) {\n return true;\n } break;\n case QUERY_OPTION.NotEqualTo:\n if (this.value[this.columnName_] !== cond[queryOption]) {\n return true;\n } break;\n case QUERY_OPTION.Between:\n if (this.value[this.columnName_] > cond[queryOption].low && this.value[this.columnName_] < cond[queryOption].high) {\n return true;\n } break;\n }\n return false;\n }\n }\n}","import { Select } from \"./index\";\nimport { LogHelper, promiseReject, getError } from \"@/worker/utils\";\nimport { ERROR_TYPE, promise } from \"@/common\";\n\nexport const executeWhereUndefinedLogic = function (this: Select) {\n let cursorRequest: IDBRequest;\n if (this.query.order && this.query.order.idbSorting !== false && this.query.order.by) {\n if (this.objectStore.indexNames.contains(this.query.order.by as string)) {\n const orderType: IDBCursorDirection = this.query.order.type &&\n this.query.order.type.toLowerCase() === 'desc' ? 'prev' : 'next';\n this.sorted = true;\n cursorRequest = this.objectStore.index(this.query.order.by as string).\n openCursor(null, orderType);\n }\n else {\n return promiseReject(\n new LogHelper(\n ERROR_TYPE.ColumnNotExist,\n { column: this.query.order.by, isOrder: true }\n )\n );\n }\n }\n else {\n cursorRequest = this.objectStore.openCursor();\n }\n const onSuccess = (() => {\n if (this.shouldEvaluateLimitAtEnd === false && this.shouldEvaluateSkipAtEnd === false) {\n if (this.skipRecord && this.limitRecord) {\n return executeSkipAndLimit;\n }\n else if (this.skipRecord) {\n return executeSkip;\n }\n else if (this.limitRecord) {\n return executeLimit;\n }\n }\n return executeSimple;\n })();\n return promise((res, rej) => {\n cursorRequest.onerror = rej;\n cursorRequest.onsuccess = onSuccess.call(this, res);\n });\n}\n\nconst executeSkipAndLimit = function (this: Select, onFinished) {\n let recordSkipped = false,\n cursor: IDBCursorWithValue;\n return (e) => {\n cursor = (e as any).target.result;\n if (cursor) {\n if (recordSkipped && this.results.length !== this.limitRecord) {\n this.pushResult(cursor.value);\n cursor.continue();\n }\n else {\n recordSkipped = true;\n cursor.advance(this.skipRecord);\n }\n } else {\n onFinished();\n }\n };\n}\n\nconst executeSkip = function (this: Select, onFinished) {\n let recordSkipped = false,\n cursor;\n return (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n if (recordSkipped) {\n this.pushResult(cursor.value);\n cursor.continue();\n }\n else {\n recordSkipped = true;\n cursor.advance(this.skipRecord);\n }\n } else {\n onFinished();\n }\n };\n}\n\nconst executeSimple = function (this: Select, onFinished) {\n let cursor;\n return (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n this.pushResult(cursor.value);\n (cursor as any).continue();\n }\n else {\n onFinished();\n }\n };\n}\n\nconst executeLimit = function (this: Select, onFinished) {\n let cursor;\n return (e: any) => {\n cursor = e.target.result;\n if (cursor && this.results.length !== this.limitRecord) {\n this.pushResult(cursor.value);\n cursor.continue();\n } else {\n onFinished();\n }\n };\n}\n","export const removeSpace = (value: string) => {\n return value.replace(/\\s/g, '');\n};","import { Select } from \"./\";\nimport { removeSpace, getDataType, getError, LogHelper } from \"@/worker/utils\";\nimport { ERROR_TYPE, DATA_TYPE, ICaseOption, IColumn, IOrderQuery } from \"@/common\";\n\nexport const processGroupDistinctAggr = function (this: Select) {\n if (this.query.distinct) {\n const groupBy = [];\n const result = this.results[0];\n for (const key in result) {\n groupBy.push(key);\n }\n const primaryKey = this.primaryKey(),\n index = groupBy.indexOf(primaryKey);\n groupBy.splice(index, 1);\n this.query.groupBy = groupBy.length > 0 ? groupBy : null;\n }\n if (this.query.groupBy) {\n if (this.query.aggregate) {\n this.executeAggregateGroupBy();\n }\n else {\n this.processGroupBy();\n }\n }\n else if (this.query.aggregate) {\n this.processAggregateQry();\n }\n};\n\nconst getOrderColumnInfo = function (this: Select, orderColumn: string) {\n let column: IColumn;\n if (this.query.join == null) {\n column = this.getColumnInfo(orderColumn);\n }\n else {\n const splittedByDot = removeSpace(orderColumn).split(\".\");\n orderColumn = splittedByDot[1];\n column = this.getColumnInfo(orderColumn, splittedByDot[0]);\n }\n if (column == null) {\n const valueFromFirstColumn = this.results[0][orderColumn];\n if (valueFromFirstColumn) {\n return {\n dataType: getDataType(valueFromFirstColumn),\n name: orderColumn\n } as IColumn;\n }\n throw new LogHelper(ERROR_TYPE.ColumnNotExist,\n { column: orderColumn, isOrder: true }\n )\n\n }\n return column;\n}\n\nconst compareStringInDesc_ = (a: string, b: string) => {\n return b.localeCompare(a);\n}\n\nconst compareStringinAsc_ = (a: string, b: string) => {\n return a.localeCompare(b);\n}\n\nconst compareDefaultInDesc_ = (a: string, b) => {\n return new String(b).localeCompare(a);\n}\n\nconst compareDefaultinAsc_ = (a, b: string) => {\n return new String(a).localeCompare(b);\n}\n\nconst compareNumberInDesc_ = (a: number, b: number) => {\n return b - a;\n}\n\nconst compareNumberinAsc_ = (a: number, b: number) => {\n return a - b;\n}\n\nconst compareDateInDesc_ = (a: Date, b: Date) => {\n return b.getTime() - a.getTime();\n}\n\nconst compareDateInAsc_ = (a: Date, b: Date) => {\n return a.getTime() - b.getTime();\n}\n\nconst getValInDesc_ = function (this: Select, value1, value2, caseQuery: { [columnName: string]: [ICaseOption] }) {\n for (const columnName in caseQuery) {\n this.thenEvaluator.setCaseAndValue(caseQuery, value1);\n const column1 = this.thenEvaluator.setColumn(columnName).evaluate();\n this.thenEvaluator.setCaseAndValue(caseQuery, value2);\n const column2 = this.thenEvaluator.setColumn(columnName).evaluate();\n switch (typeof value1[column1]) {\n case DATA_TYPE.String:\n return compareStringInDesc_(value1[column1], value2[column2]);\n default:\n return compareNumberInDesc_(value1[column1], value2[column2]);\n }\n }\n}\n\nconst getValInAsc_ = function (this: Select, value1, value2, caseQuery: { [columnName: string]: [ICaseOption] }) {\n for (const columnName in caseQuery) {\n this.thenEvaluator.setCaseAndValue(caseQuery, value1);\n const column1 = this.thenEvaluator.setColumn(columnName).evaluate();\n this.thenEvaluator.setCaseAndValue(caseQuery, value2);\n const column2 = this.thenEvaluator.setColumn(columnName).evaluate();\n switch (typeof value1[column1]) {\n case DATA_TYPE.String:\n return compareStringinAsc_(value1[column1], value2[column2]);\n default:\n return compareNumberinAsc_(value1[column1], value2[column2]);\n }\n }\n}\n\nconst getValueComparer_ = (column: IColumn, order: IOrderQuery): (a, b) => number => {\n switch (column.dataType) {\n case DATA_TYPE.String:\n return order.type === 'asc' ? compareStringinAsc_ : compareStringInDesc_;\n case DATA_TYPE.Number:\n return order.type === 'asc' ? compareNumberinAsc_ : compareNumberInDesc_;\n case DATA_TYPE.DateTime:\n return order.type === 'asc' ? compareDateInAsc_ : compareDateInDesc_;\n default:\n return order.type === 'asc' ? compareDefaultinAsc_ : compareDefaultInDesc_;\n }\n\n}\n\nconst orderBy_ = function (this: Select, order: IOrderQuery) {\n order.type = getOrderType_(order.type);\n let orderColumn = order.by;\n if (orderColumn != null && typeof orderColumn === DATA_TYPE.Object) {\n if (order.type === \"asc\") {\n this.results.sort((a, b) => {\n return getValInAsc_.call(this, a, b, orderColumn as any);\n });\n }\n else {\n this.results.sort((a, b) => {\n return getValInDesc_.call(this, a, b, orderColumn as any);\n });\n }\n }\n else {\n const columnInfo = getOrderColumnInfo.call(this, orderColumn as string);\n if (columnInfo != null) {\n const orderMethod = getValueComparer_(columnInfo, order);\n orderColumn = columnInfo.name;\n if (order.case == null) {\n this.results.sort((a, b) => {\n return orderMethod(a[orderColumn as string], b[orderColumn as string]);\n });\n }\n else {\n this.thenEvaluator.setCaseAndColumn({ [orderColumn as string]: order.case }, orderColumn as string);\n this.results.sort((a, b) => {\n return orderMethod(\n this.thenEvaluator.setValue(a).evaluate(),\n this.thenEvaluator.setValue(b).evaluate()\n );\n });\n }\n }\n }\n\n}\n\nconst getOrderType_ = (type: string) => {\n return type == null ? 'asc' : type.toLowerCase();\n}\n\nexport const processOrderBy = function (this: Select) {\n const order = this.query.order;\n if (order && this.results.length > 0 && !this.sorted) {\n const orderQueryType = getDataType(order);\n if (orderQueryType === DATA_TYPE.Object) {\n orderBy_.call(this, order);\n }\n else if (orderQueryType === DATA_TYPE.Array) {\n orderBy_.call(this, order[0]);\n for (let i = 1, length = (order as any).length; i < length; i++) {\n // if (this.error == null) {\n const prevOrderQueryBy = order[i - 1].by;\n const currentOrderQuery: IOrderQuery = order[i];\n let currentorderQueryBy = currentOrderQuery.by;\n const orderColumnDetail = getOrderColumnInfo.call(this, currentorderQueryBy as string);\n if (orderColumnDetail != null) {\n currentorderQueryBy = orderColumnDetail.name;\n currentOrderQuery.type = getOrderType_(currentOrderQuery.type);\n const orderMethod = getValueComparer_(orderColumnDetail, currentOrderQuery);\n this.results.sort((a, b) => {\n if (a[prevOrderQueryBy] === b[prevOrderQueryBy]) {\n return orderMethod(\n a[currentorderQueryBy as string],\n b[currentorderQueryBy as string]);\n }\n return 0;\n });\n }\n // }\n }\n }\n }\n}\n\nexport const processAggregateQry = function (this: Select) {\n const datas = this.results;\n const datasLength = datas.length;\n const results = {};\n let columnToAggregate;\n // free results memory\n this.results = undefined;\n const getCount = () => {\n let result = 0;\n for (const i in datas) {\n result += datas[i][columnToAggregate] ? 1 : 0;\n }\n return result;\n };\n const getMax = () => {\n let result = 0;\n for (const i in datas) {\n result = result > datas[i][columnToAggregate] ?\n result : datas[i][columnToAggregate];\n }\n return result;\n };\n const getMin = () => {\n let result = Infinity, value = Infinity;\n for (const i in datas) {\n value = datas[i][columnToAggregate] ?\n datas[i][columnToAggregate] : Infinity;\n result = result < value ? result : value;\n }\n return result;\n };\n const getSum = () => {\n let result = 0;\n for (const i in datas) {\n result += datas[i][columnToAggregate];\n }\n return result;\n };\n const getAvg = () => {\n let result = 0;\n for (const i in datas) {\n result += datas[i][columnToAggregate];\n }\n return result / datasLength;\n };\n for (const prop in this.query.aggregate) {\n const aggregateColumn = this.query.aggregate[prop];\n const aggregateValType = getDataType(aggregateColumn);\n let aggregateCalculator;\n switch (prop) {\n case 'count':\n aggregateCalculator = getCount; break;\n case 'max':\n aggregateCalculator = getMax; break;\n case 'min':\n aggregateCalculator = getMin; break;\n case 'sum':\n aggregateCalculator = getSum; break;\n case 'avg':\n aggregateCalculator = getAvg; break;\n }\n switch (aggregateValType) {\n case DATA_TYPE.String:\n columnToAggregate = aggregateColumn;\n results[`${prop}(${columnToAggregate})`] = aggregateCalculator();\n break;\n case DATA_TYPE.Array:\n for (const key in aggregateColumn) {\n columnToAggregate = aggregateColumn[key];\n results[`${prop}(${columnToAggregate})`] = aggregateCalculator();\n }\n }\n }\n\n // add results to the first index of result\n for (const prop in results) {\n datas[0][prop] = results[prop];\n }\n this.results = [datas[0]];\n}","import { Select } from \"./\";\nimport { promise } from \"@/common\";\nimport { BaseFetch } from \"../base_fetch\";\n\nexport const executeWhereLogic = function (this: BaseFetch, column, value, op, dir) {\n\n value = op ? value[op] : value;\n const cursorRequest = this.objectStore.index(column).openCursor(\n this.util.keyRange(value, op),\n dir\n );\n\n const onSuccess = (() => {\n if (this.shouldEvaluateLimitAtEnd === false && this.shouldEvaluateSkipAtEnd === false) {\n if (this.skipRecord && this.limitRecord) {\n return executeSkipAndLimitForWhere_;\n }\n else if (this.skipRecord) {\n return executeSkipForWhere_;\n }\n else if (this.limitRecord) {\n return executeLimitForWhere_;\n }\n\n }\n return executeSimpleForWhere_;\n })();\n\n return promise((res, rej) => {\n cursorRequest.onerror = rej;\n cursorRequest.onsuccess = onSuccess.call(this, res);\n })\n\n}\n\nconst executeSkipAndLimitForWhere_ = function (this: Select, onFinish) {\n let recordSkipped = false;\n return (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor) {\n if (recordSkipped && this.results.length !== this.limitRecord) {\n const value = cursor.value;\n if (this.shouldAddValue(value)) {\n this.pushResult(value);\n }\n cursor.continue();\n }\n else {\n recordSkipped = true;\n cursor.advance(this.skipRecord);\n }\n }\n else {\n onFinish();\n }\n };\n}\n\nconst executeSkipForWhere_ = function (this: Select, onFinish) {\n let recordSkipped = false;\n return (e: any) => {\n const cursor = e.target.result;\n if (cursor) {\n if (recordSkipped) {\n const value = cursor.value;\n if (this.shouldAddValue(value)) {\n this.pushResult(value);\n }\n cursor.continue();\n }\n else {\n recordSkipped = true;\n cursor.advance(this.skipRecord);\n }\n }\n else {\n onFinish();\n }\n };\n}\n\nconst executeLimitForWhere_ = function (this: Select, onFinish) {\n return (e: any) => {\n const cursor = e.target.result;\n if (cursor && this.results.length !== this.limitRecord) {\n const value = cursor.value;\n if (this.shouldAddValue(value)) {\n this.pushResult(value);\n }\n cursor.continue();\n }\n else {\n onFinish();\n }\n };\n\n}\n\nconst executeSimpleForWhere_ = function (this: Select, onFinish) {\n return (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor) {\n const value = cursor.value;\n if (this.shouldAddValue(value)) {\n this.pushResult(value);\n }\n cursor.continue();\n }\n else {\n onFinish();\n }\n };\n}","import { OCCURENCE } from \"@/common\";\n\nexport const getRegexFromLikeExpression = (likeExpression: string) => {\n const filterValues = likeExpression.split('%');\n let filterValue: string;\n let occurence: OCCURENCE;\n if (filterValues[1]) {\n filterValue = filterValues[1];\n occurence = filterValues.length > 2 ? OCCURENCE.Any : OCCURENCE.Last;\n }\n else {\n filterValue = filterValues[0];\n occurence = OCCURENCE.First;\n }\n switch (occurence) {\n case OCCURENCE.First:\n return new RegExp(`^${filterValue}`, 'i');\n case OCCURENCE.Last:\n return new RegExp(`${filterValue}$`, 'i');\n default:\n return new RegExp(`${filterValue}`, 'i');\n }\n}","import { getDataType } from \"./get_data_type\";\n\nconst isObject = (value) => {\n return getDataType(value) === 'object' && !(value instanceof RegExp);\n};\n\nexport const clone = (obj) => {\n if (isObject(obj)) {\n const copy = {};\n for (const i in obj) {\n copy[i] = obj[i] != null && isObject(obj[i]) ? clone(obj[i]) : obj[i];\n }\n return copy;\n }\n return obj;\n};","import { getDataType } from \"./get_data_type\"\nimport { QUERY_OPTION, DATA_TYPE } from \"@/common\";\n\nexport const compare = (value, compareValue, symbol?) => {\n const type1 = getDataType(value);\n const type2 = getDataType(compareValue);\n\n if (type1 !== type2) return false;\n if (type1 === DATA_TYPE.DateTime) {\n value = value.getTime();\n compareValue = compareValue.getTime();\n }\n switch (symbol) {\n // greater than\n case QUERY_OPTION.GreaterThan:\n return value > compareValue;\n // less than\n case QUERY_OPTION.LessThan:\n return value < compareValue;\n // less than equal\n case QUERY_OPTION.LessThanEqualTo:\n return value <= compareValue;\n // greather than equal\n case QUERY_OPTION.GreaterThanEqualTo:\n return value >= compareValue;\n // Not equal to\n case QUERY_OPTION.NotEqualTo:\n return value !== compareValue;\n default:\n return value === compareValue;\n }\n}","import { QUERY_OPTION } from \"@/common\";\nimport { getDataType, clone, compare, getRegexFromLikeExpression } from \"@worker/utils\";\n\n/**\n * For matching the different column value existance for where option\n * \n * @export\n * @class WhereChecker\n */\nexport class WhereChecker {\n where: object;\n checkFlag: boolean;\n\n constructor(where: object, checkFlag: boolean) {\n this.where = clone(where);\n this.checkFlag = checkFlag;\n }\n\n remove(props: string[]) {\n const last = props.pop();\n const value = props.reduce((prev, curr) => prev && prev[curr], this.where);\n delete value[last];\n }\n\n check(rowValue) {\n let status = true;\n if (!this.checkFlag) return status;\n for (let columnName in this.where) {\n if (!status) {\n return status;\n }\n const whereColumnValue = this.where[columnName];\n const columnValue = rowValue[columnName];\n if (getDataType(whereColumnValue) === \"object\") {\n for (const key in whereColumnValue) {\n if (!status) {\n return status;\n }\n switch (key) {\n case QUERY_OPTION.In:\n status = this.checkIn(columnName, columnValue);\n break;\n case QUERY_OPTION.Like:\n status = this.checkLike_(columnName, columnValue);\n break;\n case QUERY_OPTION.Regex:\n status = this.checkRegex(columnName, columnValue);\n break;\n case QUERY_OPTION.Between:\n case QUERY_OPTION.GreaterThan:\n case QUERY_OPTION.LessThan:\n case QUERY_OPTION.GreaterThanEqualTo:\n case QUERY_OPTION.LessThanEqualTo:\n case QUERY_OPTION.NotEqualTo:\n status = this.checkComparisionOp_(columnName, columnValue, key);\n break;\n default:\n status = false;\n }\n }\n }\n else {\n status = compare(whereColumnValue, columnValue);\n }\n }\n return status;\n }\n\n private checkIn(column, value) {\n return (this.where[column][QUERY_OPTION.In] as any[]).find(q => compare(q, value)) != null;\n }\n\n private checkLike_(column, value) {\n return getRegexFromLikeExpression(this.where[column][QUERY_OPTION.Like]).test(value);\n }\n\n private checkRegex(column, value) {\n return this.where[column][QUERY_OPTION.Regex].test(value);\n }\n\n private checkComparisionOp_(column, value, symbol) {\n const compareValue = this.where[column][symbol];\n if (symbol != QUERY_OPTION.Between) {\n return compare(value, compareValue, symbol);\n }\n return compare(value, compareValue.low, '>=') &&\n compare(value, compareValue.high, '<=');\n }\n}","import { Base } from \"./base\";\nimport { ISelectQuery, QUERY_OPTION, ERROR_TYPE } from \"@/common\";\nimport { getRegexFromLikeExpression, promiseReject } from \"@worker/utils\";\nimport { LogHelper, getObjectFirstKey, getDataType, getLength, getError } from \"@worker/utils\";\nimport { WhereChecker } from \"./where_checker\";\nimport { executeWhereLogic } from \"./select/where\";\nimport { executeInLogic } from \"./select/in\";\nimport { executeRegexLogic } from \"./select/regex\";\n\nexport class BaseFetch extends Base {\n query: ISelectQuery;\n whereCheckerInstance: WhereChecker;\n executeWhereLogic: typeof executeWhereLogic;\n skipRecord;\n limitRecord;\n shouldEvaluateLimitAtEnd = false;\n shouldEvaluateSkipAtEnd = false;\n executeInLogic: typeof executeInLogic;\n executeRegexLogic: typeof executeRegexLogic;\n\n resultCount: number;\n\n protected shouldAddValue: (value) => boolean;\n protected goToWhereLogic() {\n const query = this.query as ISelectQuery;\n const firstColumn = getObjectFirstKey(query.where);\n if (this.objectStore.indexNames.contains(firstColumn)) {\n const value = query.where[firstColumn];\n if (getDataType(value) === 'object') {\n const checkFlag = getLength(value) > 1 ||\n getLength(query.where) > 1\n\n this.whereCheckerInstance = new WhereChecker(query.where, checkFlag);\n const key = getObjectFirstKey(value);\n this.whereCheckerInstance.remove([firstColumn, key]);\n switch (key) {\n case QUERY_OPTION.Like: {\n const regexVal = getRegexFromLikeExpression(value[QUERY_OPTION.Like]);\n return this.executeRegexLogic(firstColumn, regexVal);\n }\n case QUERY_OPTION.Regex:\n return this.executeRegexLogic(firstColumn, value[QUERY_OPTION.Regex]);\n case QUERY_OPTION.In:\n return this.executeInLogic(\n firstColumn, value[QUERY_OPTION.In]\n );\n case QUERY_OPTION.Between:\n case QUERY_OPTION.GreaterThan:\n case QUERY_OPTION.LessThan:\n case QUERY_OPTION.GreaterThanEqualTo:\n case QUERY_OPTION.LessThanEqualTo:\n return this.executeWhereLogic(firstColumn, value, key, \"next\");\n case QUERY_OPTION.Aggregate: break;\n default:\n return this.executeWhereLogic(firstColumn, value, null, \"next\");\n }\n }\n else {\n const checkFlag = getLength(query.where) > 1;\n this.whereCheckerInstance = new WhereChecker(query.where, checkFlag);\n this.whereCheckerInstance.remove([firstColumn]);\n return this.executeWhereLogic(firstColumn, value, null, \"next\");\n }\n }\n else {\n const column = this.getColumnInfo(firstColumn);\n const error = column == null ?\n new LogHelper(ERROR_TYPE.ColumnNotExist, { column: firstColumn }) :\n new LogHelper(ERROR_TYPE.EnableSearchOff, { column: firstColumn });\n return promiseReject(\n error\n );\n }\n }\n\n}","import { Select } from \"./\";\nimport { promise, promiseAll } from \"@/common\";\nimport { BaseFetch } from \"../base_fetch\";\n\nexport const executeInLogic = function (this: BaseFetch, column, values) {\n let skip = this.skipRecord;\n const skipOrPush = (val) => {\n if (skip === 0) {\n (this as Select).pushResult(val);\n }\n else {\n --skip;\n }\n };\n const onSuccess = (() => {\n if (this.shouldEvaluateLimitAtEnd === false && this.shouldEvaluateSkipAtEnd === false) {\n if (this.skipRecord && this.limitRecord) {\n return executeSkipAndLimitForIn_;\n }\n else if (this.skipRecord) {\n return executeSkipForIn_;\n }\n else if (this.limitRecord) {\n executeLimitForIn_;\n }\n }\n return executeSimpleForIn_;\n })();\n\n const columnStore = this.objectStore.index(column);\n const runInLogic: (val) => Promise = (value) => {\n return promise((res, rej) => {\n const cursorRequest = columnStore.openCursor(this.util.keyRange(value));\n cursorRequest.onsuccess = onSuccess.call(this, res, skipOrPush);\n cursorRequest.onerror = rej;\n });\n };\n\n return promiseAll(\n values.map(function (val) {\n return runInLogic(val);\n })\n );\n\n};\n\nconst executeSkipAndLimitForIn_ = function (this: Select, onFinish, skipOrPush) {\n return (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (this.results.length !== this.limitRecord && cursor) {\n const value = cursor.value;\n if (this.shouldAddValue(value)) {\n skipOrPush(value);\n }\n cursor.continue();\n }\n else {\n onFinish();\n }\n };\n}\n\nconst executeSkipForIn_ = function (this: Select, onFinish, skipOrPush) {\n\n return (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor) {\n const value = cursor.value\n if (this.shouldAddValue(value)) {\n skipOrPush(value);\n }\n cursor.continue();\n }\n else {\n onFinish();\n }\n };\n}\n\nconst executeLimitForIn_ = function (this: Select, onFinish) {\n return (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor && this.results.length !== this.limitRecord) {\n const value = cursor.value;\n if (this.shouldAddValue(value)) {\n this.pushResult(cursor.value);\n }\n cursor.continue();\n }\n else {\n onFinish();\n }\n };\n\n}\n\nconst executeSimpleForIn_ = function (this: Select, onFinish) {\n return (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor) {\n const value = cursor.value\n if (this.shouldAddValue(value)) {\n this.pushResult(value);\n }\n cursor.continue();\n }\n else {\n onFinish();\n }\n };\n}","import { BaseFetch } from \"../base_fetch\";\nimport { Select } from \".\";\nimport { promise } from \"@/common\";\n\n\nexport const executeRegexLogic = function (this: BaseFetch, column, exp: RegExp) {\n\n let skip = this.skipRecord;\n const skipOrPush = (val) => {\n if (skip === 0) {\n (this as Select).pushResult(val);\n }\n else {\n --skip;\n }\n };\n this.shouldAddValue = (cursor) => {\n return exp.test(cursor.key) &&\n this.whereCheckerInstance.check(cursor.value);\n };\n\n const cursorRequest = this.objectStore.index(column).openCursor();\n\n const onSuccess = (() => {\n if (this.shouldEvaluateLimitAtEnd === false && this.shouldEvaluateSkipAtEnd === false) {\n if (this.skipRecord && this.limitRecord) {\n return executeSkipAndLimitForRegex_;\n }\n else if (this.skipRecord) {\n return executeSkipForRegex_;\n }\n else if (this.limitRecord) {\n return executeLimitForRegex_;\n }\n }\n return executeSimpleForRegex_;\n })();\n\n return promise((res, rej) => {\n cursorRequest.onerror = rej;\n cursorRequest.onsuccess = onSuccess.call(this, res, skipOrPush);\n })\n\n}\n\nconst executeSkipAndLimitForRegex_ = function (this: Select, onFinish, skipOrPush) {\n return (e: any) => {\n const cursor = e.target.result;\n if (this.results.length !== this.limitRecord && cursor) {\n if (this.shouldAddValue(cursor)) {\n skipOrPush(cursor.value);\n }\n cursor.continue();\n } else {\n onFinish();\n }\n };\n}\n\nconst executeSkipForRegex_ = function (this: Select, onFinish, skipOrPush) {\n return (e: any) => {\n const cursor = e.target.result;\n if (cursor) {\n if (this.shouldAddValue(cursor)) {\n skipOrPush((cursor.value));\n }\n cursor.continue();\n } else {\n onFinish();\n }\n };\n}\n\nconst executeLimitForRegex_ = function (this: Select, onFinish) {\n return (e: any) => {\n const cursor = e.target.result;\n if (this.results.length !== this.limitRecord && cursor) {\n if (this.shouldAddValue(cursor)) {\n this.pushResult(cursor.value);\n }\n cursor.continue();\n } else {\n onFinish();\n }\n };\n}\n\nconst executeSimpleForRegex_ = function (this: Select, onFinish) {\n return (e: any) => {\n const cursor = e.target.result;\n if (cursor) {\n if (this.shouldAddValue(cursor)) {\n this.pushResult(cursor.value);\n }\n cursor.continue();\n } else {\n onFinish();\n }\n };\n}\n","import { Select } from \"./\";\nimport { IJoinQuery, DATA_TYPE, ERROR_TYPE, ISelectQuery } from \"@/common\";\nimport { getDataType, LogHelper, removeSpace, promiseReject } from \"@/worker/utils\";\n\n\nexport const executeJoinQuery = function (this: Select) {\n return new Join(this).execute();\n}\n\ninterface JoinQueryWithInfo extends IJoinQuery {\n joinTableInfo: JoinTableInfo\n}\n\nexport class Join {\n\n private joinQueryStack_: JoinQueryWithInfo[] = [];\n private currentQueryStackIndex_ = 0;\n tablesFetched = [];\n results = [];\n\n select: Select;\n constructor(select: Select) {\n this.select = select;\n }\n\n get query() {\n return this.select.query;\n }\n\n getTable(name: string) {\n return this.select.table(name);\n }\n\n private executeSelect(query: ISelectQuery) {\n // this.select.util.emptyTx();\n return new Select(query, this.select.util).\n execute(this.select.db);\n }\n\n execute() {\n const query = this.query;\n this.joinQueryStack_ = getDataType(query.join) === DATA_TYPE.Object ?\n [query.join as JoinQueryWithInfo] : query.join as JoinQueryWithInfo[];\n // get the data for first table\n const tableName = query.from;\n const tablesToFetch = [tableName];\n for (let i = 0, length = this.joinQueryStack_.length; i < length; i++) {\n const item = this.joinQueryStack_[i];\n let jointblInfo = this.getJoinTableInfo_(item.on);\n // table 1 is fetched & table2 needs to be fetched for join\n if (item.with === jointblInfo.table1.table) {\n jointblInfo = {\n table1: jointblInfo.table2,\n table2: jointblInfo.table1\n };\n }\n\n const err = this.checkJoinQuery_(jointblInfo, item);\n if (err) {\n return promiseReject(err);\n }\n this.joinQueryStack_[i].joinTableInfo = jointblInfo;\n tablesToFetch.push(item.with)\n }\n\n if (!this.select.isTxQuery) {\n this.select.util.createTransaction(tablesToFetch);\n }\n\n return this.executeSelect({\n from: tableName,\n where: query.where,\n case: query.case,\n flatten: query.flatten\n }).then(results => {\n this.results = results.map((item) => {\n return {\n [this.currentQueryStackIndex_]: item\n };\n });\n this.tablesFetched.push(tableName);\n return this.startExecutingJoinLogic_();\n });\n }\n\n private onJoinQueryFinished_() {\n // const query = this.query;\n if (this.results.length > 0) {\n\n try {\n let results = [];\n const tables = Object.keys(this.results[0]);\n const tablesLength = tables.length;\n const mapWithAlias = (query: IJoinQuery, value: object) => {\n if (query.as != null) {\n for (const key in query.as) {\n if (value[(query.as as any)[key]] === undefined) {\n value[(query.as as any)[key]] = value[key];\n delete value[key];\n }\n }\n }\n return value;\n };\n this.results.forEach((result) => {\n let data = result[\"0\"]; // first table data\n for (let i = 1; i < tablesLength; i++) {\n const query = this.joinQueryStack_[i - 1];\n data = { ...data, ...mapWithAlias(query, result[i]) };\n }\n results.push(data);\n });\n this.select['results'] = results;\n this.select.setLimitAndSkipEvaluationAtEnd_();\n this.select.query.flatten = null;\n if (process.env.NODE_ENV === 'dev') {\n try {\n this.select.processOrderBy();\n }\n catch (ex) {\n return promiseReject(\n new LogHelper(ERROR_TYPE.InvalidOrderQuery, ex.message)\n );\n }\n }\n else {\n this.select.processOrderBy();\n }\n\n if (process.env.NODE_ENV === 'dev') {\n try {\n this.select.processGroupDistinctAggr();\n }\n catch (ex) {\n return promiseReject(\n new LogHelper(ERROR_TYPE.InvalidGroupQuery, ex.message)\n );\n }\n }\n else {\n this.select.processGroupDistinctAggr();\n }\n }\n catch (ex) {\n return promiseReject(\n new LogHelper(ERROR_TYPE.InvalidJoinQuery, ex.message)\n );\n }\n }\n return;\n }\n\n private startExecutingJoinLogic_() {\n const joinQuery = this.joinQueryStack_[this.currentQueryStackIndex_];\n if (joinQuery) {\n try {\n let jointblInfo = joinQuery.joinTableInfo;\n return this.executeSelect({\n from: joinQuery.with,\n where: joinQuery.where,\n case: joinQuery.case,\n flatten: joinQuery.flatten\n }).then(results => {\n this.jointables(joinQuery.type, jointblInfo, results);\n this.tablesFetched.push(jointblInfo.table2.table);\n ++this.currentQueryStackIndex_;\n return this.startExecutingJoinLogic_();\n });\n }\n catch (ex) {\n return promiseReject(\n new LogHelper(ERROR_TYPE.InvalidJoinQuery, ex.message)\n );\n }\n }\n else {\n return this.onJoinQueryFinished_();\n }\n }\n\n private jointables(joinType: string, jointblInfo: JoinTableInfo, secondtableData: any[]) {\n\n const results = [];\n const column1 = jointblInfo.table1.column;\n const column2 = jointblInfo.table2.column;\n const table1Index = this.tablesFetched.indexOf(jointblInfo.table1.table);\n const table2Index = this.currentQueryStackIndex_ + 1;\n const performInnerJoin = () => {\n let index = 0;\n this.results.forEach(valueFromFirstTable => {\n secondtableData.forEach((valueFromSecondTable) => {\n if (valueFromFirstTable[table1Index][column1] === valueFromSecondTable[column2]) {\n results[index] = { ...valueFromFirstTable };\n results[index++][table2Index] = valueFromSecondTable;\n }\n });\n });\n };\n const performleftJoin = () => {\n let index = 0;\n let valueMatchedFromSecondTable: any[];\n let callBack;\n const columnDefaultValue = {};\n this.getTable(jointblInfo.table2.table).columns.forEach(col => {\n columnDefaultValue[col.name] = null;\n });\n this.results.forEach((valueFromFirstTable) => {\n valueMatchedFromSecondTable = [];\n if (table2Index === 1) {\n callBack = function (valueFromSecondTable) {\n if (valueFromFirstTable[table1Index][column1] === valueFromSecondTable[column2]) {\n valueMatchedFromSecondTable.push(valueFromSecondTable);\n }\n };\n }\n else {\n callBack = function (valueFromSecondTable) {\n const value = valueFromFirstTable[table1Index];\n if (value != null && value[column1] === valueFromSecondTable[column2]) {\n valueMatchedFromSecondTable.push(valueFromSecondTable);\n }\n };\n }\n secondtableData.forEach(callBack);\n if (valueMatchedFromSecondTable.length === 0) {\n valueMatchedFromSecondTable = [columnDefaultValue];\n }\n valueMatchedFromSecondTable.forEach(function (value) {\n results[index] = { ...valueFromFirstTable };\n results[index++][table2Index] = value;\n });\n });\n };\n switch (joinType) {\n case \"left\":\n performleftJoin(); break;\n default:\n performInnerJoin();\n }\n this.results = results;\n }\n\n private getJoinTableInfo_(joinOn: string) {\n joinOn = removeSpace(joinOn);\n const splittedjoinOn = joinOn.split(\"=\");\n const splittedjoinOnbydotFirst = splittedjoinOn[0].split(\".\");\n const splittedjoinOnbydotSecond = splittedjoinOn[1].split(\".\");\n const info = {\n table1: {\n table: splittedjoinOnbydotFirst[0],\n column: splittedjoinOnbydotFirst[1]\n },\n table2: {\n table: splittedjoinOnbydotSecond[0],\n column: splittedjoinOnbydotSecond[1]\n }\n } as JoinTableInfo;\n return info;\n }\n\n private checkJoinQuery_(jointblInfo: JoinTableInfo, qry: IJoinQuery) {\n const table1 = jointblInfo.table1;\n const table2 = jointblInfo.table2;\n const tableSchemaOf1stTable = this.getTable(table1.table);\n const tableSchemaOf2ndTable = this.getTable(table2.table);\n let err: LogHelper;\n\n // check on info & with info \n if (qry.with !== table2.table) {\n err = new LogHelper(ERROR_TYPE.InvalidJoinQuery,\n `on value should contains value of with`\n );\n }\n\n // check for column existance\n\n if (tableSchemaOf1stTable.columns.find(q => q.name === table1.column) == null) {\n err = new LogHelper(ERROR_TYPE.InvalidJoinQuery,\n `column ${table1.column} does not exist in table ${table1.table}`\n );\n }\n else if (tableSchemaOf2ndTable.columns.find(q => q.name === table2.column) == null) {\n err = new LogHelper(ERROR_TYPE.InvalidJoinQuery,\n `column ${table2.column} does not exist in table ${table2.table}`\n );\n }\n\n // check for column match in both table\n if (qry.as == null) {\n qry.as = {};\n }\n tableSchemaOf1stTable.columns.every(function (column) {\n const columnFound = tableSchemaOf2ndTable.columns.find(q => q.name === column.name && q.name !== table1.column);\n if (columnFound != null && qry.as[columnFound.name] == null) {\n err = new LogHelper(ERROR_TYPE.InvalidJoinQuery,\n `column ${column.name} exist in both table ${table1.table} & ${table2.table}`\n );\n return false;\n }\n return true;\n });\n return err;\n }\n}\n\ntype JoinTableInfo = {\n table1: { table: string, column: string }\n table2: { table: string, column: string }\n};","import { ISelectQuery, QUERY_OPTION, IDB_MODE, API, IWhereQuery } from \"@/common\";\nimport { IDBUtil } from \"@/worker/idbutil\";\nimport { QueryHelper } from \"@worker/executors/query_helper\";\nimport { DbMeta } from \"@/worker/model\";\nimport { isArray, isObject, getKeys, getObjectFirstKey, promiseReject, getLength } from \"@/worker/utils\";\nimport { setPushResult, setLimitAndSkipEvaluationAtEnd, removeDuplicates } from \"./base_select\";\nimport { ThenEvaluator } from \"./then_evaluator\";\nimport { executeWhereUndefinedLogic } from \"./not_where\"\nimport { processAggregateQry, processGroupDistinctAggr, processOrderBy } from \"./order_by\";\nimport { executeAggregateGroupBy, processGroupBy } from \"./group_by\";\nimport { executeWhereLogic } from \"./where\";\nimport { BaseFetch } from \"@executors/base_fetch\";\nimport { executeInLogic } from \"./in\";\nimport { executeRegexLogic } from \"./regex\";\nimport { executeJoinQuery } from \"./join\";\n\nexport class Select extends BaseFetch {\n sorted = false;\n isOr: boolean;\n isArrayQry: boolean;\n query: ISelectQuery;\n orInfo: {\n results?: any[];\n orQuery: object\n };\n\n isSubQuery = false;\n\n protected pushResult: (value) => void;\n\n protected thenEvaluator = new ThenEvaluator();\n\n executeWhereUndefinedLogic: typeof executeWhereUndefinedLogic;\n\n setLimitAndSkipEvaluationAtEnd_: typeof setLimitAndSkipEvaluationAtEnd\n setPushResult: typeof setPushResult;\n removeDuplicates: typeof removeDuplicates;\n executeJoinQuery: typeof executeJoinQuery\n processGroupDistinctAggr: typeof processGroupDistinctAggr;\n processOrderBy: typeof processOrderBy;\n processAggregateQry: typeof processAggregateQry;\n executeAggregateGroupBy: typeof executeAggregateGroupBy;\n processGroupBy: typeof processGroupBy;\n\n\n constructor(query: ISelectQuery, util: IDBUtil) {\n super();\n this.query = query;\n this.util = util;\n this.tableName = query.from;\n this.setPushResult();\n if (isArray(this.query.where)) {\n this.isArrayQry = true;\n this.setLimitAndSkipEvaluationAtEnd_();\n }\n else {\n this.skipRecord = query.skip;\n this.limitRecord = query.limit;\n }\n if (query.order) {\n if (isArray(query.order) || query.order.case || isObject(query.order.by)) {\n this.query.order.idbSorting = false;\n }\n this.setLimitAndSkipEvaluationAtEnd_();\n }\n else if (query.groupBy) {\n this.setLimitAndSkipEvaluationAtEnd_();\n }\n }\n\n execute(db: DbMeta): Promise {\n this.db = db;\n let pResult: Promise;\n try {\n const err = new QueryHelper(db).validate(API.Select, this.query);\n if (err) return promiseReject(err);\n this.initTransaction_();\n if (this.query.join == null) {\n if (this.query.where != null) {\n if (isArray(this.query.where)) {\n pResult = this.processWhereArrayQry();\n }\n else {\n pResult = this.processWhere_();\n }\n }\n else {\n pResult = this.executeWhereUndefinedLogic();\n }\n }\n else {\n pResult = this.executeJoinQuery();\n }\n return pResult.then(\n this.returnResult_.bind(this)\n )\n }\n catch (ex) {\n return this.onException(ex);\n }\n }\n\n private processWhereArrayQry() {\n this.isArrayQry = true;\n const whereQuery = this.query.where as IWhereQuery[];\n const pKey = this.primaryKey();\n let isFirstWhere = true, output = [], operation;\n\n const isItemExist = (keyValue) => {\n return output.findIndex(item => item[pKey] === keyValue) >= 0;\n };\n const onSuccess = () => {\n if (operation === QUERY_OPTION.And) {\n const doAnd = () => {\n let andResults = [];\n this.results.forEach((item) => {\n if (isItemExist(item[pKey])) {\n andResults.push(item);\n }\n });\n output = andResults;\n andResults = null;\n };\n\n if (isFirstWhere === true) {\n output = this.results;\n }\n else if (output.length > 0) {\n doAnd();\n }\n }\n else {\n if (output.length > 0) {\n this.results = [...output, ...this.results];\n this.removeDuplicates();\n output = this.results;\n }\n else {\n output = this.results;\n }\n }\n isFirstWhere = false;\n if (whereQuery.length > 0) {\n this.results = [];\n return processFirstQry();\n }\n else {\n this.results = output;\n }\n\n };\n const processFirstQry = () => {\n this.query.where = whereQuery.shift();\n if (this.query.where[QUERY_OPTION.Or]) {\n if (getLength(this.query.where) === 1) {\n operation = QUERY_OPTION.Or;\n this.query.where = this.query.where[QUERY_OPTION.Or] as any;\n }\n else {\n operation = QUERY_OPTION.And;\n }\n }\n else {\n operation = QUERY_OPTION.And;\n }\n return this.processWhere_().then(onSuccess);\n };\n return processFirstQry();\n }\n\n private initTransaction_() {\n if (!this.isTxQuery) {\n this.util.createTransactionIfNotExist([this.tableName], IDB_MODE.ReadOnly);\n }\n this.objectStore = this.util.objectStore(this.tableName);\n }\n\n private processWhere_() {\n this.shouldAddValue = (value) => {\n return this.whereCheckerInstance.check(value);\n };\n if ((this.query.where as IWhereQuery).or) {\n this.processOrLogic_();\n }\n return this.goToWhereLogic().then(() => {\n return this.onWhereEvaluated();\n })\n }\n\n private onWhereEvaluated() {\n if (this.isOr) {\n return this.orQuerySuccess_();\n }\n }\n\n private returnResult_ = () => {\n if (this.results.length > 0) {\n\n\n if (this.query.flatten) {\n const flattendData = [];\n const indexToDelete = {};\n this.query.flatten.forEach(column => {\n this.results.forEach((data, i) => {\n data[column].forEach(item => {\n flattendData.push(\n { ...data, ...{ [column]: item } }\n );\n });\n indexToDelete[i] = true;\n });\n });\n let itemsDeleted = 0;\n getKeys(indexToDelete).forEach(key => {\n this.results.splice(Number(key) - itemsDeleted, 1);\n ++itemsDeleted;\n });\n this.results = this.results.concat(flattendData);\n }\n this.processGroupDistinctAggr();\n this.processOrderBy();\n if (this.shouldEvaluateSkipAtEnd) {\n this.results.splice(0, this.query.skip);\n }\n if (this.shouldEvaluateLimitAtEnd) {\n this.results = this.results.slice(0, this.query.limit);\n }\n }\n return this.results;\n }\n\n private orQueryFinish_() {\n this.isOr = false;\n this.results = this.orInfo.results;\n // free or info memory\n this.orInfo = null;\n this.removeDuplicates();\n // this.onQueryFinished();\n }\n\n private orQuerySuccess_() {\n this.orInfo.results = [... this.orInfo.results, ...this.results];\n if (!this.query.limit || (this.query.limit > this.orInfo.results.length)) {\n this.results = [];\n const key = getObjectFirstKey(this.orInfo.orQuery);\n if (key != null) {\n const where = {};\n where[key] = this.orInfo.orQuery[key];\n delete this.orInfo.orQuery[key];\n this.query.where = where;\n return this.goToWhereLogic().then(this.onWhereEvaluated.bind(this))\n }\n }\n return this.orQueryFinish_();\n }\n\n private processOrLogic_() {\n this.isOr = true;\n const where = this.query.where as IWhereQuery;\n this.orInfo = {\n orQuery: where.or as any,\n results: []\n };\n // free or memory\n delete where.or;\n }\n}\n\nSelect.prototype.executeInLogic = executeInLogic;\nSelect.prototype.executeWhereUndefinedLogic = executeWhereUndefinedLogic;\nSelect.prototype.executeWhereLogic = executeWhereLogic;\nSelect.prototype.executeRegexLogic = executeRegexLogic;\n\nSelect.prototype.setLimitAndSkipEvaluationAtEnd_ = setLimitAndSkipEvaluationAtEnd\nSelect.prototype.setPushResult = setPushResult;\nSelect.prototype.removeDuplicates = removeDuplicates;\nSelect.prototype.executeJoinQuery = executeJoinQuery\nSelect.prototype.processGroupDistinctAggr = processGroupDistinctAggr;\nSelect.prototype.processOrderBy = processOrderBy;\nSelect.prototype.processAggregateQry = processAggregateQry;\nSelect.prototype.executeAggregateGroupBy = executeAggregateGroupBy;\nSelect.prototype.processGroupBy = processGroupBy;\n","export const isObject = (value) => {\n return typeof value === 'object';\n};","import { Select } from \"./index\";\n\nexport const setPushResult = function (this: Select) {\n if (this.query.case) {\n this.pushResult = (value) => {\n let columnName: string;\n this.thenEvaluator.setCaseAndValue(this.query.case, value);\n for (columnName in this.query.case) {\n value[columnName] = this.thenEvaluator.setColumn(columnName).evaluate();\n }\n this.results.push(value);\n };\n }\n else {\n this.pushResult = (value) => {\n this.results.push(value);\n };\n }\n}\n\nexport const setLimitAndSkipEvaluationAtEnd = function (this: Select) {\n if (this.query.limit) {\n this.shouldEvaluateLimitAtEnd = true;\n }\n if (this.query.skip) {\n this.shouldEvaluateSkipAtEnd = true;\n }\n}\n\nexport const removeDuplicates = function (this: Select) {\n let datas = this.results;\n // free results memory\n this.results = null;\n const key = this.primaryKey();\n const lookupObject = {};\n for (let i = 0, len = datas.length; i < len; i++) {\n lookupObject[datas[i][key]] = datas[i];\n }\n datas = [];\n for (const i in lookupObject) {\n datas.push(lookupObject[i]);\n }\n this.results = datas;\n}","import { Select } from \".\";\nimport { getDataType, getObjectFirstKey } from \"@/worker/utils\";\nimport { QUERY_OPTION, DATA_TYPE } from \"@/common\";\n\nexport const processGroupBy = function (this: Select) {\n const groupBy = this.query.groupBy as any;\n let datas = this.results;\n const lookUpObj = {};\n // free results memory\n this.results = this.query.groupBy = null;\n if (getDataType(groupBy) !== DATA_TYPE.Object) {\n if (getDataType(groupBy) === DATA_TYPE.String) {\n for (const i in datas) {\n lookUpObj[datas[i][groupBy as string]] = datas[i];\n }\n }\n else {\n let objKey;\n for (const i in datas) {\n objKey = \"\";\n for (const column in groupBy) {\n objKey += datas[i][groupBy[column]];\n }\n lookUpObj[objKey] = datas[i];\n }\n }\n }\n else {\n const caseQueryLength = Object.keys(groupBy).length;\n if (caseQueryLength === 1) {\n const groupByColumn = getObjectFirstKey(groupBy);\n this.thenEvaluator.setCaseAndColumn(groupBy, groupByColumn);\n for (const i in datas) {\n lookUpObj[this.thenEvaluator.setValue(datas[i]).evaluate()] = datas[i];\n }\n }\n else {\n let objKey;\n for (const i in datas) {\n objKey = \"\";\n this.thenEvaluator.setCaseAndValue(groupBy, datas[i]);\n for (const column in groupBy) {\n objKey += this.thenEvaluator.setColumn(column).evaluate();\n }\n lookUpObj[objKey] = datas[i];\n }\n }\n }\n // free datas memory\n datas = [];\n for (const i in lookUpObj) {\n datas.push(lookUpObj[i]);\n }\n this.results = datas;\n}\n\nexport const executeAggregateGroupBy = function (this: Select) {\n const grpQry = this.query.groupBy as any;\n let datas = this.results;\n // free results memory\n this.results = undefined;\n const lookUpObj = {};\n // assign aggregate\n const aggregateQry = this.query.aggregate;\n\n let index;\n let objKey;\n let value;\n let columnToAggregate;\n const calculateAggregate = () => {\n const getCount = () => {\n value = lookUpObj[objKey];\n // get old value\n value = value ? value[\"count(\" + columnToAggregate + \")\"] : 0;\n // add with old value if data exist\n value += datas[index][columnToAggregate] ? 1 : 0;\n return value;\n };\n const getMax = () => {\n value = lookUpObj[objKey];\n // get old value\n value = value ? value[\"max(\" + columnToAggregate + \")\"] : 0;\n datas[index][columnToAggregate] = datas[index][columnToAggregate] ?\n datas[index][columnToAggregate] : 0;\n // compare between old value and new value\n return value > datas[index][columnToAggregate] ? value : datas[index][columnToAggregate];\n };\n const getMin = () => {\n value = lookUpObj[objKey];\n // get old value\n value = value ? value[\"min(\" + columnToAggregate + \")\"] : Infinity;\n datas[index][columnToAggregate] = datas[index][columnToAggregate] ?\n datas[index][columnToAggregate] : Infinity;\n // compare between old value and new value\n return value < datas[index][columnToAggregate] ? value : datas[index][columnToAggregate];\n };\n const getSum = () => {\n value = lookUpObj[objKey];\n // get old value\n value = value ? value[\"sum(\" + columnToAggregate + \")\"] : 0;\n // add with old value if data exist\n value += datas[index][columnToAggregate] ? datas[index][columnToAggregate] : 0;\n return value;\n };\n const getAvg = () => {\n value = lookUpObj[objKey];\n // get old sum value\n let sumOfColumn = value ? value[\"sum(\" + columnToAggregate + \")\"] : 0;\n // add with old value if data exist\n sumOfColumn += datas[index][columnToAggregate] ? datas[index][columnToAggregate] : 0;\n datas[index][\"sum(\" + columnToAggregate + \")\"] = sumOfColumn;\n // get old count value\n value = value ? value[\"count(\" + columnToAggregate + \")\"] : 0;\n // add with old value if data exist\n value += datas[index][columnToAggregate] ? 1 : 0;\n datas[index][\"count(\" + columnToAggregate + \")\"] = value;\n };\n for (const prop in aggregateQry) {\n const aggregateColumn = aggregateQry[prop];\n const aggregateValType = getDataType(aggregateColumn);\n let aggregateCalculator;\n switch (prop) {\n case QUERY_OPTION.Count:\n aggregateCalculator = getCount;\n break;\n case QUERY_OPTION.Max:\n aggregateCalculator = getMax;\n break;\n case QUERY_OPTION.Min:\n aggregateCalculator = getMin;\n break;\n case QUERY_OPTION.Sum:\n aggregateCalculator = getSum;\n break;\n case QUERY_OPTION.Avg:\n aggregateCalculator = getAvg;\n break;\n }\n switch (aggregateValType) {\n case DATA_TYPE.String:\n columnToAggregate = aggregateColumn;\n datas[index][`${prop}(${columnToAggregate})`] = aggregateCalculator();\n break;\n case DATA_TYPE.Array:\n for (const item in aggregateColumn) {\n columnToAggregate = aggregateColumn[item];\n datas[index][`${prop}(${columnToAggregate})`] = aggregateCalculator();\n }\n }\n }\n };\n\n if (getDataType(grpQry) === DATA_TYPE.String) {\n for (index in datas) {\n objKey = datas[index][grpQry];\n calculateAggregate();\n lookUpObj[objKey] = datas[index];\n }\n }\n else {\n for (index in datas) {\n objKey = \"\";\n for (const column in grpQry) {\n objKey += datas[index][grpQry[column]];\n }\n calculateAggregate();\n lookUpObj[objKey] = datas[index];\n }\n\n }\n // free datas memory\n datas = [];\n for (const i in lookUpObj) {\n datas.push(lookUpObj[i]);\n }\n // Checking for avg and if exist then fill the datas;\n if (aggregateQry.avg) {\n if (getDataType(aggregateQry.avg) === DATA_TYPE.String) {\n for (index in datas) {\n const sumForAvg = datas[index][\"sum(\" + aggregateQry.avg + \")\"],\n countForAvg = datas[index][\"count(\" + aggregateQry.avg + \")\"];\n datas[index][\"avg(\" + aggregateQry.avg + \")\"] = sumForAvg / countForAvg;\n if (aggregateQry.count !== aggregateQry.avg) {\n delete datas[index][\"count(\" + aggregateQry.avg + \")\"];\n }\n if (aggregateQry.sum !== aggregateQry.avg) {\n delete datas[index][\"sum(\" + aggregateQry.avg + \")\"];\n }\n }\n }\n else {\n const isCountTypeString = getDataType(aggregateQry.count) === DATA_TYPE.String;\n const isSumTypeString = getDataType(aggregateQry.sum) === DATA_TYPE.String;\n for (index in datas) {\n for (const column in aggregateQry.avg as any) {\n const avgColumn = aggregateQry.avg[column],\n sum = datas[index][\"sum(\" + avgColumn + \")\"],\n count = datas[index][\"count(\" + avgColumn + \")\"];\n datas[index][\"avg(\" + avgColumn + \")\"] = sum / count;\n\n if (isCountTypeString) {\n if (aggregateQry.count !== avgColumn) {\n delete datas[index][\"count(\" + avgColumn + \")\"];\n }\n else if (aggregateQry.count.indexOf(avgColumn) === -1) {\n delete datas[index][\"count(\" + avgColumn + \")\"];\n }\n }\n\n if (isSumTypeString) {\n if (aggregateQry.sum !== avgColumn) {\n delete datas[index][\"sum(\" + avgColumn + \")\"];\n }\n else if (aggregateQry.sum.indexOf(avgColumn) === -1) {\n delete datas[index][\"sum(\" + avgColumn + \")\"];\n }\n }\n }\n }\n }\n }\n this.results = datas;\n}\n","import { promise } from \"@/common\";\nimport { BaseFetch } from \"../base_fetch\";\nimport { Count } from \".\";\n\nexport const executeWhereUndefinedLogic = function (this: BaseFetch) {\n let countRequest;\n const onSuccess = (() => {\n if (this.objectStore.count) {\n countRequest = this.objectStore.count();\n return (onFinish) => {\n return () => {\n (this as Count).resultCount = countRequest.result;\n onFinish();\n }\n }\n }\n else {\n let cursor;\n countRequest = this.objectStore.openCursor();\n return (onFinish) => {\n return (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n ++(this as Count).resultCount;\n cursor.continue();\n }\n else {\n onFinish();\n }\n };\n };\n }\n })();\n return promise((res, rej) => {\n countRequest.onerror = rej;\n countRequest.onsuccess = onSuccess(res);\n });\n}\n","import { BaseFetch } from \"@executors/base_fetch\";\nimport { Select } from \"@executors/select\";\nimport { ICountQuery, ISelectQuery, IDB_MODE, API, IWhereQuery } from \"@/common\";\nimport { IDBUtil } from \"@/worker/idbutil\";\nimport { DbMeta } from \"@worker/model\";\nimport { QueryHelper } from \"@executors/query_helper\";\nimport { promiseReject, isArray, getError } from \"@worker/utils\";\nimport { executeWhereUndefinedLogic } from \"@executors/count/not_where\";\nimport { executeWhereLogic } from \"./where\";\nimport { executeRegexLogic } from \"./regex\";\nimport { executeInLogic } from \"./in\";\n\nexport class Count extends BaseFetch {\n\n query: ICountQuery;\n resultCount: number = 0;\n executeWhereUndefinedLogic: typeof executeWhereUndefinedLogic;\n\n constructor(query: ICountQuery, util: IDBUtil) {\n super();\n this.query = query;\n this.util = util;\n this.tableName = query.from;\n }\n\n execute(db: DbMeta) {\n this.db = db;\n const queryHelper = new QueryHelper(db);\n const query = this.query;\n const err = queryHelper.validate(API.Count, query);\n if (err) {\n return promiseReject(\n err\n );\n }\n try {\n let result: Promise;\n const getDataFromSelect = () => {\n const selectInstance = new Select(this.query as ISelectQuery, this.util);\n selectInstance.isTxQuery = this.isTxQuery;\n return selectInstance.execute(db).then(results => {\n this.resultCount = results.length;\n });\n };\n this.initTransaction_();\n if (query.join == null) {\n if (query.where != null) {\n if ((query.where as IWhereQuery).or || isArray(this.query.where)) {\n result = getDataFromSelect();\n }\n else {\n result = this.goToWhereLogic();\n }\n }\n else {\n result = this.executeWhereUndefinedLogic() as any;\n }\n }\n else {\n result = getDataFromSelect();\n }\n return result.then(_ => {\n return this.resultCount;\n })\n }\n catch (ex) {\n this.onException(ex);\n }\n }\n\n private initTransaction_() {\n if (!this.isTxQuery) {\n this.util.createTransaction([this.query.from], IDB_MODE.ReadOnly);\n }\n this.objectStore = this.util.objectStore(this.query.from);\n }\n}\n\nCount.prototype.executeWhereUndefinedLogic = executeWhereUndefinedLogic;\nCount.prototype.executeWhereLogic = executeWhereLogic\nCount.prototype.executeRegexLogic = executeRegexLogic\nCount.prototype.executeInLogic = executeInLogic","import { BaseFetch } from \"../base_fetch\";\nimport { getLength } from \"@/worker/utils\";\nimport { Count } from \".\";\nimport { promise } from \"@/common\";\n\nexport const executeWhereLogic = function (this: BaseFetch, column, value, op) {\n value = op ? value[op] : value;\n let cursorRequest;\n let cursor: IDBCursorWithValue;\n\n\n return promise((res, rej) => {\n if (getLength(this.query.where) === 1 && this.objectStore.count) {\n cursorRequest = this.objectStore.index(column).count(this.util.keyRange(value, op));\n cursorRequest.onsuccess = () => {\n (this as Count).resultCount = cursorRequest.result;\n res();\n }\n }\n else {\n cursorRequest = this.objectStore.index(column).openCursor(this.util.keyRange(value, op));\n cursorRequest.onsuccess = (e) => {\n cursor = e.target.result;\n if (cursor) {\n if (this.whereCheckerInstance.check(cursor.value)) {\n ++(this as Count).resultCount;\n }\n cursor.continue();\n }\n else {\n res();\n }\n }\n }\n cursorRequest.onerror = rej;\n });\n}","import { BaseFetch } from \"../base_fetch\";\nimport { promise } from \"@/common\";\nimport { Count } from \".\";\n\nexport const executeRegexLogic = function (this: BaseFetch, column: string, exp: RegExp) {\n let cursor: IDBCursorWithValue;\n const cursorRequest = this.objectStore.index(column).openCursor();\n this.shouldAddValue = (cursor) => {\n return exp.test(cursor.key) &&\n this.whereCheckerInstance.check(cursor.value);\n };\n return promise((res, rej) => {\n cursorRequest.onerror = rej;\n cursorRequest.onsuccess = (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n if (this.shouldAddValue(cursor)) {\n ++(this as Count).resultCount;\n }\n cursor.continue();\n }\n else {\n res();\n }\n };\n })\n}","import { promise, promiseAll } from \"@/common\";\nimport { BaseFetch } from \"../base_fetch\";\n\n\nexport const executeInLogic = function (this: BaseFetch, column, values) {\n let cursor: IDBCursorWithValue;\n const columnStore = this.objectStore.index(column);\n const runInLogic: (val) => Promise = (value) => {\n const keyRange = this.util.keyRange(value);\n if (this.objectStore.count) {\n return promise((res, rej) => {\n const cursorRequest = columnStore.count(keyRange);\n cursorRequest.onsuccess = (e: any) => {\n this.resultCount += e.target.result;\n res();\n };\n cursorRequest.onerror = rej;\n });\n }\n return promise((res, rej) => {\n const cursorRequest = columnStore.openCursor(keyRange);\n cursorRequest.onsuccess = (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n if (this.whereCheckerInstance.check(cursor.value)) {\n ++this.resultCount;\n }\n cursor.continue();\n }\n else {\n res();\n }\n };\n cursorRequest.onerror = rej;\n });\n };\n\n return promiseAll(\n values.map(function (val) {\n return runInLogic(val);\n })\n );\n}\n","import { getDataType } from \"@worker/utils\";\nimport { DATA_TYPE } from \"@/common\";\n\nexport const updateValue = (suppliedValue, storedValue) => {\n for (const key in suppliedValue) {\n if (getDataType(suppliedValue[key]) !== DATA_TYPE.Object) {\n storedValue[key] = suppliedValue[key];\n }\n else {\n for (const op in suppliedValue[key]) {\n switch (op as any) {\n case '+': storedValue[key] += suppliedValue[key][op]; break;\n case '-': storedValue[key] -= suppliedValue[key][op]; break;\n case '*': storedValue[key] *= suppliedValue[key][op]; break;\n case '/': storedValue[key] /= suppliedValue[key][op]; break;\n case '{push}': storedValue[key].push(suppliedValue[key][op]); break;\n default: storedValue[key] = suppliedValue[key];\n }\n break;\n }\n }\n }\n return storedValue;\n};","import { IUpdateQuery, ISelectQuery, QUERY_OPTION, API, IWhereQuery } from \"@/common\";\nimport { IDBUtil } from \"@/worker/idbutil\";\nimport { DbMeta } from \"@worker/model\";\nimport { QueryHelper } from \"../query_helper\";\nimport { promiseReject, isArray } from \"@worker/utils\";\nimport { BaseFetch } from \"@executors/base_fetch\";\nimport { Select } from \"@executors/select\";\nimport { executeWhereUndefinedLogic } from \"./not_where\";\nimport { executeInLogic } from \"./in\";\nimport { executeRegexLogic } from \"./regex\";\nimport { executeWhereLogic } from \"./where\";\n\nexport class Update extends BaseFetch {\n executeWhereUndefinedLogic: typeof executeWhereUndefinedLogic\n\n constructor(query: IUpdateQuery, util: IDBUtil) {\n super();\n this.query = query as any;\n this.util = util;\n this.tableName = query.in;\n }\n\n execute(db: DbMeta) {\n this.db = db;\n const query: IUpdateQuery = this.query as any;\n try {\n const queryHelper = new QueryHelper(db);\n const err = queryHelper.validate(API.Update, query);\n if (err) return promiseReject(err);\n\n this.initTransaction();\n let pResult: Promise;\n if (query.where != null) {\n if ((query.where as IWhereQuery).or || isArray(query.where)) {\n pResult = this.executeComplexLogic_();\n }\n else {\n pResult = this.goToWhereLogic();\n }\n }\n else {\n pResult = this.executeWhereUndefinedLogic();\n }\n return pResult.then(() => {\n return this.rowAffected;\n })\n }\n catch (ex) {\n return this.onException(ex);\n }\n }\n\n private executeComplexLogic_() {\n const query: IUpdateQuery = this.query as any;\n const selectObject = new Select({\n from: query.in,\n where: query.where,\n ignoreCase: query.ignoreCase\n } as ISelectQuery, this.util);\n selectObject.isTxQuery = this.isTxQuery;\n return selectObject.execute(this.db).then((results: any[]) => {\n const key = this.primaryKey(query.in);\n const inQuery = [];\n results.forEach((value) => {\n inQuery.push(value[key]);\n });\n results = null;\n const whereQry = { [key]: { [QUERY_OPTION.In]: inQuery } };\n this.query.where = whereQry;\n this.initTransaction();\n return this.goToWhereLogic();\n });\n }\n\n private initTransaction() {\n const tableName = (this.query as any).in;\n if (!this.isTxQuery) {\n this.util.createTransaction([tableName]);\n }\n this.objectStore = this.util.objectStore(tableName);\n }\n}\n\nUpdate.prototype.executeWhereUndefinedLogic = executeWhereUndefinedLogic;\nUpdate.prototype.executeWhereLogic = executeWhereLogic\nUpdate.prototype.executeRegexLogic = executeRegexLogic\nUpdate.prototype.executeInLogic = executeInLogic","import { Update } from \"./\";\nimport { promise } from \"@/common\";\nimport { updateValue } from \"./update_value\";\n\n\nexport const executeWhereUndefinedLogic = function (this: Update) {\n const cursorRequest: IDBRequest = this.objectStore.openCursor();\n const setValue = (this.query as any).set;\n return promise((res, rej) => {\n cursorRequest.onsuccess = (e: any) => {\n const cursor: IDBCursorWithValue = (e as any).target.result;\n if (cursor) {\n try {\n const cursorUpdateRequest = cursor.update(updateValue(setValue, cursor.value));\n cursorUpdateRequest.onsuccess = () => {\n ++this.rowAffected;\n cursor.continue();\n };\n cursorUpdateRequest.onerror = rej;\n } catch (ex) {\n rej(\n ex\n );\n }\n }\n else {\n res();\n }\n };\n cursorRequest.onerror = rej;\n })\n\n}\n","import { promise } from \"@/common\";\nimport { updateValue } from \"./update_value\";\nimport { Update } from \"./\";\n\nexport const executeWhereLogic = function (this: Update, column, value, op) {\n\n value = op ? value[op] : value;\n const cursorRequest = this.objectStore.index(column).openCursor(this.util.keyRange(value, op));\n const setValue = (this.query as any).set;\n return promise((res, rej) => {\n cursorRequest.onsuccess = (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor) {\n if (this.whereCheckerInstance.check(cursor.value)) {\n try {\n const cursorUpdateRequest = cursor.update(updateValue(setValue, cursor.value));\n cursorUpdateRequest.onsuccess = () => {\n ++this.rowAffected;\n cursor.continue();\n };\n cursorUpdateRequest.onerror = rej;\n } catch (ex) {\n rej(\n ex\n );\n }\n }\n else {\n cursor.continue();\n }\n }\n else {\n res();\n }\n };\n cursorRequest.onerror = rej\n })\n}","import { Update } from \"./\";\nimport { updateValue } from \"./update_value\";\nimport { promise } from \"@/common\";\n\nexport const executeRegexLogic = function (this: Update, column: string, exp: RegExp) {\n let cursor: IDBCursorWithValue;\n const cursorOpenRequest = this.objectStore.index(column).openCursor();\n this.shouldAddValue = (cursor) => {\n return exp.test(cursor.key) &&\n this.whereCheckerInstance.check(cursor.value);\n };\n const setValue = (this.query as any).set;\n return promise((res, rej) => {\n\n cursorOpenRequest.onsuccess = (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n if (this.shouldAddValue(cursor)) {\n try {\n const cursorUpdateRequest = cursor.update(updateValue(setValue, cursor.value));\n cursorUpdateRequest.onsuccess = () => {\n ++this.rowAffected;\n cursor.continue();\n };\n cursorUpdateRequest.onerror = rej;\n } catch (ex) {\n rej(\n ex\n );\n }\n }\n else {\n cursor.continue();\n }\n\n }\n else {\n res();\n }\n };\n cursorOpenRequest.onerror = rej;\n })\n\n}\n","import { Update } from \"./\";\nimport { promiseAll, promise, IUpdateQuery } from \"@/common\";\nimport { updateValue } from \"./update_value\";\n\n\nexport const executeInLogic = function (this: Update, column, values: any[]) {\n const columnStore = this.objectStore.index(column);\n const query: IUpdateQuery = this.query as any;\n const runInLogic: (val) => Promise = (value) => {\n return promise((res, rej) => {\n const cursorRequest = columnStore.openCursor(this.util.keyRange(value));\n cursorRequest.onsuccess = (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor) {\n const value = cursor.value;\n if (this.whereCheckerInstance.check(value)) {\n try {\n const cursorUpdateRequest = cursor.update(updateValue(query.set, value));\n cursorUpdateRequest.onsuccess = () => {\n ++this.rowAffected;\n cursor.continue();\n };\n cursorUpdateRequest.onerror = rej;\n }\n catch (ex) {\n rej(\n ex\n );\n }\n\n }\n else {\n cursor.continue();\n }\n }\n else {\n res();\n }\n };\n cursorRequest.onerror = rej;\n });\n };\n\n return promiseAll(\n values.map(function (val) {\n return runInLogic(val);\n })\n );\n}\n","import { IIntersectQuery, ISelectQuery } from \"@/common\";\nimport { Base } from \"@executors/base\";\nimport { Select } from \"@executors/select\";\nimport { DbMeta } from \"../model\";\n\nexport class Intersect extends Base {\n\n constructor(intersectQry: IIntersectQuery, util) {\n super();\n this.query = intersectQry as any;\n this.util = util;\n }\n\n execute(db: DbMeta) {\n this.db = db;\n const intersectQry: IIntersectQuery = this.query as any;\n let index = 0;\n let hashMap = {};\n let hashMapTemp = {};\n let isQueryForSameTable = true;\n const queries = intersectQry.queries;\n const queryLength = queries.length;\n queries.every((qry, i) => {\n if (i + 1 < queryLength && qry.from !== queries[i + 1].from) {\n isQueryForSameTable = false;\n return false;\n }\n return true;\n });\n let getHashKey;\n if (isQueryForSameTable) {\n const pKey = this.primaryKey(queries[0].from);\n getHashKey = (val) => {\n return val[pKey];\n };\n }\n else {\n getHashKey = (val) => {\n let columnValKey = \"\";\n for (const key in val) {\n columnValKey += val[key];\n }\n return columnValKey;\n };\n }\n\n let select: Select;\n const fetchData = () => {\n if (index < queryLength) {\n select = new Select(queries[index], this.util);\n return select.execute(this.db).then((selectResult) => {\n hashMap = {};\n selectResult.forEach(val => {\n const columnValKey = getHashKey(val);\n if (index === 0) {\n hashMapTemp[columnValKey] = val;\n } else if (hashMapTemp[columnValKey] != null) {\n hashMap[columnValKey] = val;\n }\n });\n if (index > 0) {\n hashMapTemp = { ...hashMap };\n }\n\n ++index;\n return fetchData();\n })\n }\n else {\n const results = [];\n let resultPusher: (key: string) => void;\n let skip = intersectQry.skip;\n const limit = intersectQry.limit;\n const onFinished = () => {\n select['results'] = results;\n Object.assign(select.query, {\n order: intersectQry.order,\n join: {} as any\n } as ISelectQuery);\n select.processOrderBy();\n select.processGroupDistinctAggr();\n return (select['results']);\n };\n let shouldStopLoop = false;\n let key: string;\n const pushResult = () => {\n results.push(hashMap[key]);\n };\n const checkLimitAndPush = () => {\n if (results.length < limit) {\n pushResult();\n }\n else {\n shouldStopLoop = true;\n }\n };\n const skipChecker = (callBack: () => void) => {\n if (skip === 0) {\n callBack();\n }\n else {\n --skip;\n }\n };\n if (intersectQry.skip && intersectQry.limit) {\n resultPusher = () => {\n skipChecker(() => {\n checkLimitAndPush();\n });\n };\n\n }\n else if (intersectQry.limit) {\n resultPusher = checkLimitAndPush;\n }\n else if (intersectQry.skip) {\n resultPusher = () => {\n skipChecker(() => {\n pushResult();\n });\n };\n }\n else {\n resultPusher = () => {\n pushResult();\n };\n }\n if (limit) {\n for (key in hashMap) {\n resultPusher(key);\n if (shouldStopLoop) {\n break;\n }\n }\n }\n else {\n for (key in hashMap) {\n resultPusher(key);\n }\n }\n return onFinished();\n }\n };\n return fetchData();\n }\n}","import { LogHelper, getError } from \"@worker/utils\";\nimport { ERROR_TYPE, promise } from \"@/common\";\n\nexport class DropDb {\n\n execute(dbName: string) {\n return promise((res, rej) => {\n const dropDbRequest = indexedDB.deleteDatabase(dbName);\n dropDbRequest.onblocked = () => {\n const err = new LogHelper(ERROR_TYPE.DbBlocked);\n return rej(\n getError(err)\n );\n };\n dropDbRequest.onerror = (e) => {\n return rej(\n getError(e)\n )\n };\n dropDbRequest.onsuccess = () => {\n res();\n };\n })\n }\n}\n","import { Base } from \"@executors/base\";\nimport { ISelectQuery } from \"@/common\";\nimport { DbMeta } from \"@worker/model\";\nimport { Select } from \"@executors/select\";\nimport { IDBUtil } from \"@/worker/idbutil\";\n\nexport class Union extends Base {\n\n constructor(query: ISelectQuery[], util: IDBUtil) {\n super();\n this.query = query as any;\n this.util = util;\n }\n\n execute(db: DbMeta) {\n this.db = db;\n const query: ISelectQuery[] = this.query as any;\n let index = 0;\n const hashMap = {};\n let isQueryForSameTable = true;\n const queryLength = query.length;\n query.every((qry, i) => {\n if (i + 1 < queryLength && qry.from !== query[i + 1].from) {\n isQueryForSameTable = false;\n return false;\n }\n return true;\n });\n let getHashKey;\n if (isQueryForSameTable) {\n const pKey = this.primaryKey(query[0].from);\n getHashKey = (val) => {\n return val[pKey];\n };\n }\n else {\n getHashKey = (val) => {\n let columnValKey = \"\";\n for (const key in val) {\n columnValKey += val[key];\n }\n return columnValKey;\n };\n }\n let select: Select;\n const fetchData = () => {\n if (index < query.length) {\n select = new Select(query[index++], this.util);\n return select.execute(db).then((selectResult) => {\n selectResult.forEach(val => {\n hashMap[getHashKey(val)] = val;\n });\n return fetchData();\n })\n }\n else {\n const results = [];\n for (const key in hashMap) {\n results.push(hashMap[key]);\n }\n return results;\n }\n };\n return fetchData();\n }\n\n\n}","import { BaseFetch } from \"../base_fetch\";\nimport { IRemoveQuery, QUERY_OPTION, API, IWhereQuery } from \"@/common\";\nimport { IDBUtil } from \"@/worker/idbutil\";\nimport { QueryHelper } from \"@executors/query_helper\";\nimport { DbMeta } from \"@/worker/model\";\nimport { promiseReject, isArray, getObjectFirstKey, getError } from \"@/worker/utils\";\nimport { Select } from \"@executors/select\";\nimport { executeWhereUndefinedLogic } from \"./not_where\";\nimport { executeInLogic } from \"./in\";\nimport { executeWhereLogic } from \"./where\";\nimport { executeRegexLogic } from \"./regex\";\n\nexport class Remove extends BaseFetch {\n isOr;\n executeWhereUndefinedLogic;\n\n constructor(\n query: IRemoveQuery, util: IDBUtil\n ) {\n super();\n this.query = query;\n this.util = util;\n this.tableName = query.from;\n }\n\n execute(db: DbMeta) {\n this.db = db;\n const queryHelper = new QueryHelper(db);\n const query = this.query;\n const err = queryHelper.validate(API.Remove, query);\n if (err) return promiseReject(\n err\n );\n try {\n this.initTransaction_();\n let pResult: Promise;\n if (query.where != null) {\n if (isArray(query.where)) {\n pResult = this.processWhereArrayQry();\n }\n else {\n pResult = this.processWhere_();\n }\n }\n else {\n pResult = this.executeWhereUndefinedLogic();\n }\n return pResult.then(() => {\n return this.rowAffected;\n })\n\n }\n catch (ex) {\n return this.onException(ex);\n }\n\n }\n\n private processWhereArrayQry() {\n const selectObject = new Select(this.query, this.util);\n selectObject.isTxQuery = this.isTxQuery;\n return selectObject.execute(this.db).then((results) => {\n const keyList = [];\n const pkey = this.primaryKey(this.query.from);\n results.forEach((item) => {\n keyList.push(item[pkey]);\n });\n results = null;\n const whereQry = { [pkey]: { [QUERY_OPTION.In]: keyList } };\n this.query[QUERY_OPTION.Where] = whereQry;\n return this.processWhere_();\n })\n }\n\n private processWhere_() {\n if ((this.query.where as IWhereQuery).or) {\n this.processOrLogic();\n }\n return this.goToWhereLogic().then(() => {\n return this.onWhereEvaluated();\n });\n }\n\n private initTransaction_() {\n if (!this.isTxQuery) {\n this.util.createTransaction([this.query.from]);\n }\n this.objectStore = this.util.objectStore(this.query.from);\n }\n\n private onWhereEvaluated() {\n if (this.isOr) {\n return this.orQuerySuccess_();\n }\n }\n\n private orQuerySuccess_() {\n const key = getObjectFirstKey((this as any)._orInfo.OrQuery);\n if (key != null) {\n const where = {};\n where[key] = (this as any)._orInfo.OrQuery[key];\n delete (this as any)._orInfo.OrQuery[key];\n this.query.where = where;\n return this.goToWhereLogic().then(() => {\n return this.onWhereEvaluated();\n })\n }\n else {\n this.isOr = true;\n }\n }\n\n private processOrLogic() {\n this.isOr = true;\n const where = this.query.where as IWhereQuery;\n (this as any)._orInfo = {\n OrQuery: where.or\n };\n\n // free or memory\n delete where.or;\n }\n}\n\nRemove.prototype.executeInLogic = executeInLogic;\nRemove.prototype.executeWhereUndefinedLogic = executeWhereUndefinedLogic;\nRemove.prototype.executeWhereLogic = executeWhereLogic;\nRemove.prototype.executeRegexLogic = executeRegexLogic;","import { Remove } from \".\";\nimport { promise, promiseAll } from \"@/common\";\n\nexport const executeInLogic = function (this: Remove, column, values) {\n const columnIndex = this.objectStore.index(column)\n const runInLogic: (val) => Promise = (value) => {\n return promise((res, rej) => {\n const cursorRequest = columnIndex.openCursor(this.util.keyRange(value));\n cursorRequest.onsuccess = (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor) {\n if (this.whereCheckerInstance.check(cursor.value)) {\n cursor.delete();\n ++this.rowAffected;\n }\n cursor.continue();\n }\n else {\n res();\n }\n };\n cursorRequest.onerror = rej;\n });\n };\n\n return promiseAll(\n values.map(function (val) {\n return runInLogic(val);\n })\n );\n}\n","import { Remove } from \".\";\nimport { promise } from \"@/common\";\n\nexport const executeWhereUndefinedLogic = function (this: Remove) {\n let cursor;\n const cursorRequest = this.objectStore.openCursor();\n return promise((res, rej) => {\n cursorRequest.onsuccess = (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n cursor.delete();\n ++this.rowAffected;\n (cursor as any).continue();\n }\n else {\n res();\n }\n };\n cursorRequest.onerror = rej;\n })\n\n}\n","import { Remove } from \".\";\nimport { promise } from \"@/common\";\n\nexport const executeWhereLogic = function (this: Remove, column, value, op) {\n let cursor: IDBCursorWithValue,\n cursorRequest;\n value = op ? value[op] : value;\n cursorRequest = this.objectStore.index(column).openCursor(this.util.keyRange(value, op));\n return promise((res, rej) => {\n cursorRequest.onsuccess = (e) => {\n cursor = e.target.result;\n if (cursor) {\n if (this.whereCheckerInstance.check(cursor.value)) {\n cursor.delete();\n ++this.rowAffected;\n }\n cursor.continue();\n }\n else {\n res();\n }\n };\n\n cursorRequest.onerror = rej\n })\n\n}\n\n","import { Remove } from \"./\";\nimport { promise } from \"@/common\";\n\nexport const executeRegexLogic = function (this: Remove, column: string, exp: RegExp) {\n let cursor: IDBCursorWithValue;\n const cursorRequest = this.objectStore.index(column).openCursor();\n this.shouldAddValue = (cursor) => {\n return exp.test(cursor.key) &&\n this.whereCheckerInstance.check(cursor.value);\n };\n return promise((res, rej) => {\n cursorRequest.onsuccess = (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n if (this.shouldAddValue(cursor)) {\n cursor.delete();\n ++this.rowAffected;\n }\n cursor.continue();\n }\n else {\n res();\n }\n };\n cursorRequest.onerror = rej;\n })\n\n}","import { Base } from \"@executors/base\";\nimport { IDBUtil } from \"@/worker/idbutil\";\nimport { DbMeta } from \"@/worker/model\";\nimport { MetaHelper } from \"@/worker/meta_helper\";\nimport { promise } from \"@/common\";\n\nexport class Clear extends Base {\n constructor(tableName: string, util: IDBUtil) {\n super();\n this.query = tableName as any;\n this.util = util;\n this.tableName = tableName;\n }\n\n execute(db: DbMeta) {\n this.db = db;\n const tableName: string = this.query as any;\n if (!this.isTxQuery) {\n this.util.createTransaction([tableName, MetaHelper.tableName]);\n }\n const clearRequest: IDBRequest = this.util.objectStore(tableName).clear();\n try {\n return promise((res, rej) => {\n clearRequest.onsuccess = (e) => {\n const currentTable = this.table(tableName);\n for (const columnName in currentTable.autoIncColumnValue) {\n currentTable.autoIncColumnValue[columnName] = 0;\n }\n MetaHelper.set(MetaHelper.dbSchema, db, this.util).then(() => {\n res();\n }).catch(rej);\n };\n\n clearRequest.onerror = rej;\n })\n }\n catch (ex) {\n return this.onException(ex);\n }\n\n }\n}","import { isArray } from \"./is_array\";\n\nexport const variableFromPath = (path: string) => {\n const properties: string[] = isArray(path) ? path as any : path.split(\".\");\n return properties.reduce((prev, curr) => prev && prev[curr], self);\n}","import { Base } from \"@executors/base\";\nimport { ITranscationQuery, WebWorkerRequest, ERROR_TYPE, ISelectQuery, API, IInsertQuery, IUpdateQuery, IRemoveQuery, ICountQuery, WebWorkerResult, promise } from \"@/common\";\nimport { IDBUtil } from \"@worker/idbutil\";\nimport { promiseReject, LogHelper, variableFromPath } from \"@worker/utils\";\nimport { Insert } from \"@executors/insert\";\nimport { Select } from \"@executors/select\";\nimport { Count } from \"@executors/count\";\nimport { Update } from \"@executors/update\";\nimport { Remove } from \"@executors/remove\";\nimport { DbMeta } from \"@worker/model\";\nimport { IQueryExecutor } from \"@/worker/interfaces\";\nimport { MetaHelper } from \"@/worker/meta_helper\";\n\nexport class Transaction extends Base {\n results = {} as any;\n reqQueue: WebWorkerRequest[] = [];\n isQueryExecuting = false;\n\n isTxStarted_ = false;\n\n onSuccess: (result: any) => void;\n onError: (err: LogHelper) => void;\n\n constructor(qry: ITranscationQuery, util: IDBUtil) {\n super();\n this.query = qry as any;\n this.util = util;\n }\n\n execute(db: DbMeta) {\n this.db = db;\n\n const err = this.validate();\n if (err) return promiseReject(\n err\n );\n this.startExecution_()\n\n return promise((res, rej) => {\n this.onSuccess = res;\n this.onError = rej;\n }).then(result => {\n this.log(`transaction finished`);\n return result;\n })\n }\n\n validate() {\n const query: ITranscationQuery = this.query as any;\n const notExistingTable = this.notExistingTable_(query.tables);\n if (notExistingTable) {\n return new LogHelper(ERROR_TYPE.TableNotExist, { tableName: notExistingTable });\n }\n const methodName = query.method;\n let txLogic = variableFromPath(methodName);\n if (!txLogic) {\n return new LogHelper(ERROR_TYPE.MethodNotExist, methodName);\n }\n }\n\n private startExecution_() {\n const query: ITranscationQuery = this.query as any;\n const select = (qry: ISelectQuery) => {\n return this.pushReq_({\n name: API.Select,\n query: qry\n } as WebWorkerRequest);\n };\n const insert = (qry: IInsertQuery) => {\n return this.pushReq_({\n name: API.Insert,\n query: qry\n } as WebWorkerRequest);\n };\n const update = (qry: IUpdateQuery) => {\n return this.pushReq_({\n name: API.Update,\n query: qry\n } as WebWorkerRequest);\n };\n const remove = (qry: IRemoveQuery) => {\n return this.pushReq_({\n name: API.Remove,\n query: qry\n } as WebWorkerRequest);\n };\n const count = (qry: ICountQuery) => {\n return this.pushReq_({\n name: API.Count,\n query: qry\n } as WebWorkerRequest);\n };\n const setResult = (key: string, value) => {\n this.results[key] = value;\n };\n const getResult = (key: string) => {\n return this.results[key];\n };\n const abort = (msg: string) => {\n this.abortTx_(msg);\n };\n\n const start = () => {\n this.startTx_();\n };\n const methodName = query.method\n let txLogic = variableFromPath(methodName);\n\n this.log(`transaction query started`);\n\n return txLogic.call(\n this,\n {\n data: query.data,\n insert: insert, select: select,\n update: update, remove: remove,\n count: count, setResult: setResult,\n getResult: getResult, abort: abort,\n start: start\n }\n );\n }\n\n log(message) {\n this.util.logger.log(message);\n }\n\n private startTx_() {\n try {\n this.isTxStarted_ = true;\n let tableNames = (this.query as any).tables as string[];\n tableNames = tableNames.concat(MetaHelper.tableName)\n this.util.createTransaction(tableNames).then(_ => {\n this.onSuccess(this.results);\n }).catch(err => {\n this.onError(err);\n })\n return this.processExecutionOfQry_();\n }\n catch (ex) {\n this.onError(this.onException(ex) as any);\n }\n }\n\n\n\n\n\n private onReqFinished_(result) {\n const finisehdRequest = this.reqQueue.shift();\n\n this.log(`finished request : ${finisehdRequest.name} `);\n\n if (finisehdRequest) {\n if (result.error) {\n this.abortTx_(\"automatic abort of transaction due to error occured\");\n this.log(`transaction aborted due to error occured`);\n this.onError(result.error);\n }\n else {\n this.isQueryExecuting = false;\n if (finisehdRequest.onSuccess) {\n finisehdRequest.onSuccess(result);\n }\n this.processExecutionOfQry_();\n }\n }\n }\n\n private abortTx_(msg: string) {\n this.reqQueue = [];\n this.util.abortTransaction();\n this.log(`transaction aborted. Msg : ${msg}`);\n\n }\n\n private executeRequest_(request: WebWorkerRequest) {\n this.isQueryExecuting = true;\n let requestObj: IQueryExecutor;\n this.log(`executing request : ${request.name} `);\n const onReqFinished = this.onReqFinished_.bind(this);\n const query = request.query\n switch (request.name) {\n case API.Select:\n requestObj = new Select(\n query, this.util\n );\n break;\n case API.Insert:\n requestObj = new Insert(\n query, this.util\n );\n break;\n case API.Update:\n requestObj = new Update(\n query, this.util\n );\n break;\n case API.Remove:\n requestObj = new Remove(\n query, this.util\n );\n break;\n case API.Count:\n requestObj = new Count(\n query, this.util\n );\n break;\n }\n requestObj.isTxQuery = true;\n requestObj.execute(this.db).then(onReqFinished).catch(err => {\n const result = {\n error: err\n } as WebWorkerResult;\n onReqFinished(result);\n })\n }\n\n private pushReq_(request: WebWorkerRequest) {\n const push = () => {\n this.reqQueue.push(request);\n };\n const promiseObj = promise((resolve, reject) => {\n request.onSuccess = (result) => {\n resolve(result);\n };\n request.onError = (error) => {\n reject(error);\n };\n });\n if (this.isTxStarted_ === true) {\n push();\n this.processExecutionOfQry_();\n }\n else {\n push();\n }\n this.log(`request pushed : ${request.name}`);\n return promiseObj;\n }\n\n private processExecutionOfQry_() {\n if (this.isQueryExecuting === false) {\n if (this.reqQueue.length > 0) {\n this.executeRequest_(this.reqQueue[0]);\n }\n }\n }\n\n private notExistingTable_(tables: string[]) {\n let invalidTable: string = null;\n tables.every(tableName => {\n const table = this.table(tableName);\n if (table == null) {\n invalidTable = tableName;\n return false;\n }\n return true;\n });\n return invalidTable;\n }\n}","import { DbMeta } from \"@worker/model\";\nimport { IDataBase, ITable } from \"@/common\";\n\nexport const userDbSchema = (db: DbMeta) => {\n const database = {\n name: db.name,\n version: db.version,\n tables: []\n } as IDataBase;\n db.tables.forEach(table => {\n const tableAsObj = {\n name: table.name,\n columns: {}\n } as ITable;\n table.columns.forEach(column => {\n tableAsObj.columns[column.name] = column;\n });\n database.tables.push(tableAsObj);\n })\n return database;\n}","import { WebWorkerRequest, promiseResolve, API, IDataBase, WebWorkerResult, promise, ERROR_TYPE, IDbInfo } from \"@/common\";\nimport { DbMeta } from \"./model\";\nimport { IDBUtil } from \"./idbutil\";\nimport { Insert } from \"@executors/insert\";\nimport { IS_WORKER, IS_IDB_SUPPORTED } from \"./constants\";\nimport { MetaHelper } from \"./meta_helper\";\nimport { Select } from \"@executors/select\";\nimport { Count } from \"@executors/count\";\nimport { Update } from \"@executors/update\";\nimport { Intersect } from \"./intersect\";\nimport { DropDb } from \"@executors/drop_db\";\nimport { Union } from \"./union\";\nimport { Remove } from \"@executors/remove\";\nimport { Clear } from \"@executors/clear\";\nimport { Transaction } from \"@executors/transaction\";\nimport { LogHelper, getError, promiseReject, variableFromPath, userDbSchema, getLength } from \"@worker/utils\";\n\nexport class QueryManager {\n util: IDBUtil;\n db: DbMeta;\n\n middlewares: string[] = [];\n\n private onQryFinished;\n\n protected get logger() {\n return this.util.logger;\n }\n\n constructor(fn?: (result: any) => void) {\n this.util = new IDBUtil();\n this.onQryFinished = IS_WORKER ? (result) => {\n self.postMessage(result);\n } : fn;\n }\n\n private executeMiddleware_(request: WebWorkerRequest) {\n const lastIndex = (getLength(this.middlewares) as any) - 1;\n if (lastIndex < 0) {\n return promiseResolve();\n }\n const middlewareContext = {};\n const db = this.db;\n Object.defineProperty(middlewareContext, 'database', {\n get() {\n return userDbSchema(db);\n }\n });\n return promise((res) => {\n let index = 0;\n const callNextMiddleware = () => {\n if (index <= lastIndex) {\n let promiseResult = variableFromPath(this.middlewares[index++])(request, middlewareContext);\n if (!promiseResult || !promiseResult.then) {\n promiseResult = Promise.resolve(promiseResult);\n }\n promiseResult.then(_ => {\n callNextMiddleware();\n });\n }\n else {\n res();\n }\n };\n callNextMiddleware();\n });\n }\n\n executeQuery(request: WebWorkerRequest) {\n let queryResult: Promise;\n const query = request.query;\n switch (request.name) {\n case API.OpenDb:\n queryResult = this.openDb(query);\n break;\n case API.InitDb:\n queryResult = this.initDb(query);\n break;\n case API.CloseDb:\n queryResult = this.closeDb();\n break;\n case API.Insert:\n queryResult = new Insert(query, this.util).\n execute(this.db);\n break;\n case API.Select:\n queryResult = new Select(query, this.util).\n execute(this.db);\n break;\n case API.Count:\n queryResult = new Count(query, this.util).execute(this.db);\n break;\n case API.Update:\n queryResult = new Update(query, this.util).execute(this.db);\n break;\n case API.Intersect:\n queryResult = new Intersect(query, this.util).execute(this.db);\n break;\n case API.DropDb:\n queryResult = this.dropDb();\n break;\n case API.Terminate:\n queryResult = this.terminate();\n break;\n case API.Union:\n queryResult = new Union(query, this.util).execute(this.db);\n break;\n case API.Remove:\n queryResult = new Remove(query, this.util).execute(this.db);\n break;\n case API.Clear:\n queryResult = new Clear(query, this.util).execute(this.db);\n break;\n case API.Transaction:\n queryResult = new Transaction(query, this.util).execute(this.db);\n break;\n case API.Get:\n queryResult = MetaHelper.get(query as string, this.util);\n break;\n case API.Set:\n queryResult = MetaHelper.set(query.key, query.value, this.util);\n break;\n case API.ImportScripts:\n queryResult = this.importScripts_(request);\n break;\n case API.ChangeLogStatus:\n this.logger.status = query;\n queryResult = Promise.resolve();\n break;\n case API.Middleware:\n const value = variableFromPath(query);\n if (!value) {\n return promiseReject(\n new LogHelper(ERROR_TYPE.InvalidMiddleware, query)\n );\n }\n this.middlewares.push(query);\n return promiseResolve();\n default:\n if (process.env.NODE_ENV === 'dev') {\n console.error('The Api:-' + request.name + ' does not support.');\n }\n queryResult = promiseResolve();\n }\n this.logger.log(`Executing query ${request.name} in web worker`);\n return queryResult;\n }\n\n private callResultMiddleware(middlewares: any[], result) {\n return promise((res) => {\n let index = 0;\n const lastIndex = (getLength(middlewares) as any) - 1;\n const callNextMiddleware = () => {\n if (index <= lastIndex) {\n let promiseResult = middlewares[index++](result);\n if (!promiseResult.then) {\n promiseResult = promiseResolve(promiseResult);\n }\n promiseResult.then(modifiedResult => {\n result = modifiedResult;\n callNextMiddleware();\n });\n }\n else {\n res(result);\n }\n };\n callNextMiddleware();\n });\n }\n\n run(request: WebWorkerRequest) {\n let middlewares = [];\n request.onResult = (cb) => {\n middlewares.push((result) => {\n return cb(result);\n });\n };\n this.executeMiddleware_(request).then(_ => {\n return this.executeQuery(request).then((result) => {\n return this.callResultMiddleware(middlewares, result).then(modifiedResult => {\n this.returnResult_({\n result: modifiedResult\n });\n });\n });\n }).catch(ex => {\n middlewares = [];\n const err = getError(ex);\n const result = {\n error: err\n } as WebWorkerResult;\n this.returnResult_(result);\n });\n }\n\n private importScripts_(request: WebWorkerRequest) {\n return promise((res, rej) => {\n try {\n importScripts(...request.query);\n res();\n } catch (e) {\n const err = new LogHelper(ERROR_TYPE.ImportScriptsFailed, e.message);\n rej(err);\n }\n });\n }\n\n private returnResult_(result: WebWorkerResult) {\n this.logger.log(`Query finished inside web worker`);\n if (this.util) {\n this.util.emptyTx();\n }\n this.onQryFinished(result);\n }\n\n private dropDb() {\n const dbName = this.db.name;\n return this.terminate().then(() => {\n return new DropDb().execute(dbName);\n });\n }\n\n closeDb() {\n return this.util.close();\n }\n\n terminate() {\n return this.closeDb().then(() => {\n this.db = null;\n });\n }\n\n openDb(query: IDbInfo) {\n let pResult: Promise;\n if (this.db && query.name === this.db.name) {\n pResult = this.initDb();\n }\n else {\n pResult = this.initDb({\n name: query.name,\n tables: [\n ],\n version: query.version\n });\n }\n return this.closeDb().then(_ => {\n return pResult.then(() => {\n return this.db;\n });\n });\n }\n\n initDb(dataBase?: IDataBase) {\n if (!IS_IDB_SUPPORTED) {\n return promiseReject(\n new LogHelper(ERROR_TYPE.IndexedDbNotSupported)\n );\n }\n\n const dbMeta = dataBase ? new DbMeta(dataBase) : this.db;\n this.util = new IDBUtil();\n\n return promise((res, rej) => {\n this.util.initDb(dbMeta).then((dbInfo) => {\n if (dbInfo.isCreated) {\n MetaHelper.get(\n MetaHelper.dbSchema,\n this.util\n ).then((value: DbMeta) => {\n if (value) {\n value.tables.forEach((table, index) => {\n dbMeta.tables[index].autoIncColumnValue =\n table.autoIncColumnValue;\n });\n }\n this.db = dbMeta;\n dbInfo.database = userDbSchema(this.db);\n MetaHelper.set(\n MetaHelper.dbSchema, dbMeta,\n this.util\n ).then(() => {\n res(dbInfo);\n });\n });\n }\n else {\n MetaHelper.get(\n MetaHelper.dbSchema,\n this.util\n ).then((value: any) => {\n this.db = value;\n dbInfo.database = userDbSchema(this.db);\n res(dbInfo);\n });\n }\n }).catch(rej);\n });\n }\n\n\n\n\n}\n","import { QueryManager } from \"@/worker/query_manager\";\nimport { IS_WORKER } from \"./constants\";\nexport * from \"./query_manager\";\n\nif (IS_WORKER) {\n const manager = new QueryManager();\n (self as any).onmessage = function (e) {\n manager.run(e.data);\n };\n}\n\n"],"sourceRoot":""}