UNPKG

flexbiz-server

Version:

Flexible Server

45 lines (44 loc) 21.4 kB
const lodash=require("lodash"),{runWithoutSession}=require("./sessionContext");let cachedKeys={};try{cachedKeys=require("./redis-cache").cachedKeys()}catch($e$$){Logger.warn("Redis cache config not found, caching disabled.")} const {generateRedisKey,sortObjectKeys}=require("./redis-cache"),redisGet=$key$$=>new Promise($resolve$$=>global.clientRedis.get($key$$,($err$$,$reply$$)=>$resolve$$($reply$$||null))),redisMGet=$keys$$=>new Promise($resolve$$=>global.clientRedis.mget($keys$$,($err$$,$reply$$)=>$resolve$$($reply$$||[]))),{isValidObjectIdValue}=require("./utils"); function findDynamicFields($dataArray$$){if(!$dataArray$$||$dataArray$$.length<2)return[];const $baseline$$=$dataArray$$[0],$dynamicFields$$=new Set;for(let $i$$=1;$i$$<$dataArray$$.length;$i$$++){const $currentObject$$=$dataArray$$[$i$$];var $currentValue_keys$$=Object.keys($currentObject$$);for(const $key$$ of $currentValue_keys$$)$dynamicFields$$.has($key$$)||($currentValue_keys$$=$currentObject$$[$key$$],$currentValue_keys$$!==null&&typeof $currentValue_keys$$==="object"||$baseline$$[$key$$]=== $currentValue_keys$$||$dynamicFields$$.add($key$$))}return Array.from($dynamicFields$$)}function getFields($fields$$){if($fields$$&&!lodash.isFunction($fields$$)){var $select$$={};(Array.isArray($fields$$)?$fields$$:[$fields$$]).forEach($map$$=>{lodash.isString($map$$)?$select$$[$map$$]=1:lodash.isObject($map$$)&&($map$$.value?$select$$[$map$$.value]=1:Object.keys($map$$).forEach($key$$=>$select$$[$map$$[$key$$]]=1))});return Object.keys($select$$).length>0?$select$$:void 0}} function normalizeArgs($items$$,$id_app$$,$model$$,$joinFields$$,$_fn_fn$$,$options$$){let $_id_app$$=$id_app$$,$_model$$=$model$$,$_joinFields$$=$joinFields$$;Array.isArray($id_app$$)&&($_id_app$$=$id_app$$,$_model$$=null,$_joinFields$$=$model$$,$_fn_fn$$=$joinFields$$);$_joinFields$$=$_joinFields$$?Array.isArray($_joinFields$$)?$_joinFields$$:[$_joinFields$$]:[];$_joinFields$$.forEach($join$$=>{$join$$.fields_need_get_data||$join$$.setFields||$join$$.asyncSetFields||($join$$.fields_need_get_data= getFields($join$$.fields))});return{items:$items$$||[],id_app:$_id_app$$,modelOrigin:$_model$$,joinFields:$_joinFields$$,fn:$_fn_fn$$||(()=>{}),options:$options$$||{cache:!0}}}function safeCallback($fn$$,$result$$){try{typeof $fn$$==="function"&&$fn$$($result$$)}catch($e$$){Logger.error("Callback Error:",$e$$)}} function analyzeJoinStrategy($finalIdApp_join$jscomp$1_value$$,$item$$,$model$$,$globalIdApp$$){$finalIdApp_join$jscomp$1_value$$.modelName=$model$$?.modelName;var $cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$=$currentQueryIdApp$$=>{if($model$$.schema?.paths?.id_app)return $item$$.id_app||$globalIdApp$$||$currentQueryIdApp$$},$dynamicKey_queryForKey_v$$={},$dynamicKey$$=$globalIdApp$$;if($finalIdApp_join$jscomp$1_value$$.where&& lodash.isFunction($finalIdApp_join$jscomp$1_value$$.where)){let $q$$=$finalIdApp_join$jscomp$1_value$$.where($item$$)||{};if($model$$.schema?.paths?.id_app&&!$q$$.id_app)if($finalIdApp_join$jscomp$1_value$$=$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$($q$$.id_app))$q$$.id_app=$finalIdApp_join$jscomp$1_value$$;else return{type:"SKIP"};if("_id"in $q$$&&!isValidObjectIdValue($q$$._id)||$model$$.schema?.paths?.id_app&& Object.keys($q$$).length>1&&Object.keys($q$$).filter($k$$=>$k$$!=="id_app"&&($q$$[$k$$]||$q$$[$k$$]===0)).length==0)return{type:"SKIP"};$dynamicKey_queryForKey_v$$={...$q$$};$dynamicKey$$=$model$$.schema?.paths?.id_app?$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$($q$$.id_app):$globalIdApp$$;$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$= generateRedisKey($model$$.modelName,$dynamicKey_queryForKey_v$$,$dynamicKey$$);return{type:"MANUAL",query:$q$$,cacheKey:$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$}}if(typeof $finalIdApp_join$jscomp$1_value$$.where==="string"){var $field_manualQ_staticQuery$$=$finalIdApp_join$jscomp$1_value$$.where;$finalIdApp_join$jscomp$1_value$$=$item$$[$field_manualQ_staticQuery$$];if($finalIdApp_join$jscomp$1_value$$==null|| $finalIdApp_join$jscomp$1_value$$==="")return{type:"SKIP"};$dynamicKey$$=$field_manualQ_staticQuery$$;var $k$jscomp$2_queryForKey$$={};if($model$$.schema?.paths?.id_app)if($cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$=$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$($globalIdApp$$))$k$jscomp$2_queryForKey$$.id_app=$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$; else return{type:"SKIP"};($cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$=$model$$.schema.paths[$field_manualQ_staticQuery$$])&&$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$.options&&$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$.options.ref&& ($dynamicKey$$="_id");if($dynamicKey$$==="_id"&&!isValidObjectIdValue($finalIdApp_join$jscomp$1_value$$))return{type:"SKIP"};$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$=sortObjectKeys($k$jscomp$2_queryForKey$$);return{type:"BATCH",staticQuery:$k$jscomp$2_queryForKey$$,dynamicKey:$dynamicKey$$,dynamicValue:$finalIdApp_join$jscomp$1_value$$,signature:`${$model$$.modelName}_${JSON.stringify($cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$)}_${$dynamicKey$$}`}}$field_manualQ_staticQuery$$= {};let $dynamicValue$$=$dynamicKey_queryForKey_v$$=null;if($finalIdApp_join$jscomp$1_value$$.where&&lodash.isObject($finalIdApp_join$jscomp$1_value$$.where)){let $dynamicCount$$=0;for(let $k$$ in $finalIdApp_join$jscomp$1_value$$.where){const $value_key$$=$finalIdApp_join$jscomp$1_value$$.where[$k$$];if(!lodash.isObject($value_key$$)||$value_key$$._bsontype||$value_key$$.$in){const $value$$=$item$$[$k$$];if($k$$==="_id"&&!isValidObjectIdValue($value$$))return{type:"SKIP"};$dynamicCount$$===0&&($dynamicKey_queryForKey_v$$= $value_key$$,$dynamicValue$$=$value$$);$dynamicCount$$++}else $field_manualQ_staticQuery$$[$k$$]=$value_key$$}$dynamicCount$$>1&&($dynamicKey_queryForKey_v$$=null)}else if($finalIdApp_join$jscomp$1_value$$.akey&&$finalIdApp_join$jscomp$1_value$$.bkey&&($dynamicKey_queryForKey_v$$=$finalIdApp_join$jscomp$1_value$$.bkey,$dynamicValue$$=$item$$[$finalIdApp_join$jscomp$1_value$$.akey],$dynamicKey_queryForKey_v$$==="_id"&&!isValidObjectIdValue($dynamicValue$$)))return{type:"SKIP"};if($dynamicKey_queryForKey_v$$){if($dynamicValue$$== null||$dynamicValue$$==="")return{type:"SKIP"};if($model$$.schema?.paths?.id_app)if($cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$=$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$($field_manualQ_staticQuery$$.id_app))$field_manualQ_staticQuery$$.id_app=$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$; else return{type:"SKIP"};if("_id"in $field_manualQ_staticQuery$$&&!isValidObjectIdValue($field_manualQ_staticQuery$$._id))return{type:"SKIP"};$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$=sortObjectKeys($field_manualQ_staticQuery$$);return{type:"BATCH",staticQuery:$field_manualQ_staticQuery$$,dynamicKey:$dynamicKey_queryForKey_v$$,dynamicValue:$dynamicValue$$,signature:`${$model$$.modelName}_${JSON.stringify($cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$)}_${$dynamicKey_queryForKey_v$$}`}}$field_manualQ_staticQuery$$= {...$field_manualQ_staticQuery$$};if($finalIdApp_join$jscomp$1_value$$.where&&lodash.isObject($finalIdApp_join$jscomp$1_value$$.where))for($k$jscomp$2_queryForKey$$ in $finalIdApp_join$jscomp$1_value$$.where)$dynamicKey_queryForKey_v$$=$finalIdApp_join$jscomp$1_value$$.where[$k$jscomp$2_queryForKey$$],lodash.isObject($dynamicKey_queryForKey_v$$)?$field_manualQ_staticQuery$$[$k$jscomp$2_queryForKey$$]=$dynamicKey_queryForKey_v$$:$field_manualQ_staticQuery$$[$dynamicKey_queryForKey_v$$]=$item$$[$k$jscomp$2_queryForKey$$]; if($model$$.schema?.paths?.id_app)if($cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$=$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$($field_manualQ_staticQuery$$.id_app))$dynamicKey$$=$field_manualQ_staticQuery$$.id_app=$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$; else return{type:"SKIP"};if("_id"in $field_manualQ_staticQuery$$&&!isValidObjectIdValue($field_manualQ_staticQuery$$._id))return{type:"SKIP"};$dynamicKey_queryForKey_v$$={...$field_manualQ_staticQuery$$};$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$=generateRedisKey($model$$.modelName,$dynamicKey_queryForKey_v$$,$dynamicKey$$);return{type:"MANUAL",query:$field_manualQ_staticQuery$$,cacheKey:$cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_finalIdApp$jscomp$2_finalIdApp$jscomp$3_path_resolveIdApp_sortedStatic_sortedStatic$$}} function createQueryPlan($dynamicFields$jscomp$1_items$$,$joinFields$$,$modelOrigin$$,$id_app$$){const $batchPlan$$={},$manualQueries$$=[],$metaMap$$=new Map;$dynamicFields$jscomp$1_items$$.forEach($item$$=>{const $itemMetas$$=[];$joinFields$$.forEach($join$$=>{var $_model$jscomp$1_cacheKey$$=typeof $modelOrigin$$!=="function"||$modelOrigin$$.findOne?$modelOrigin$$:$modelOrigin$$($item$$);lodash.isString($_model$jscomp$1_cacheKey$$)&&($_model$jscomp$1_cacheKey$$=mongoose.models[$_model$jscomp$1_cacheKey$$]); if($_model$jscomp$1_cacheKey$$){var $strategy$$=analyzeJoinStrategy($join$$,$item$$,$_model$jscomp$1_cacheKey$$,$id_app$$);if($strategy$$&&$strategy$$.type!=="SKIP"){const $fields$$=$join$$.fields_need_get_data;if($strategy$$.type==="MANUAL")$manualQueries$$.push({model:$_model$jscomp$1_cacheKey$$,modelName:$_model$jscomp$1_cacheKey$$.modelName,query:$strategy$$.query,fields:$fields$$,item:$item$$,join:$join$$,cacheKey:$strategy$$.cacheKey}),$itemMetas$$.push({type:"MANUAL",join:$join$$,cacheKey:$strategy$$.cacheKey}); else if($strategy$$.type==="BATCH"){const {signature:$signature$$,dynamicKey:$dynamicKey$$,dynamicValue:$dynamicValue$$,staticQuery:$staticQuery$$}=$strategy$$;$batchPlan$$[$signature$$]||($batchPlan$$[$signature$$]={model:$_model$jscomp$1_cacheKey$$,staticQuery:$staticQuery$$,dynamicKey:$dynamicKey$$,signature:$signature$$,values:new Set,fields:void 0});mergeFields($batchPlan$$[$signature$$],$fields$$);$batchPlan$$[$signature$$].values.add($dynamicValue$$);$_model$jscomp$1_cacheKey$$=`${$signature$$}_VAL_${$dynamicValue$$== null?"__NULL__":$dynamicKey$$==="_id"?$dynamicValue$$.toString():$dynamicValue$$}`.replace(/\./g,"_");$itemMetas$$.push({type:"BATCH",join:$join$$,cacheKey:$_model$jscomp$1_cacheKey$$})}}else $itemMetas$$.push({type:"SKIP",join:$join$$,cacheKey:"__SKIP__"})}});$itemMetas$$.length&&$metaMap$$.set($item$$,$itemMetas$$)});$dynamicFields$jscomp$1_items$$=findDynamicFields($manualQueries$$.map($m$$=>$m$$.query));if($dynamicFields$jscomp$1_items$$.length===1){const $dynamicKey$$=$dynamicFields$jscomp$1_items$$[0], $remainingManualQueries$$=[];$manualQueries$$.forEach($mq$$=>{var $newBatchCacheKey_val$$=$mq$$.query[$dynamicKey$$],$itemMetas$jscomp$1_metaToUpdate_staticQuery$$={...$mq$$.query};delete $itemMetas$jscomp$1_metaToUpdate_staticQuery$$[$dynamicKey$$];var $signature$jscomp$1_sortedStatic$$=sortObjectKeys($itemMetas$jscomp$1_metaToUpdate_staticQuery$$);$signature$jscomp$1_sortedStatic$$=`${$mq$$.modelName}_${JSON.stringify($signature$jscomp$1_sortedStatic$$)}_${$dynamicKey$$}`;if($dynamicKey$$!=="_id"|| isValidObjectIdValue($newBatchCacheKey_val$$)){if($batchPlan$$[$signature$jscomp$1_sortedStatic$$]||($batchPlan$$[$signature$jscomp$1_sortedStatic$$]={model:$mq$$.model,staticQuery:$itemMetas$jscomp$1_metaToUpdate_staticQuery$$,dynamicKey:$dynamicKey$$,signature:$signature$jscomp$1_sortedStatic$$,values:new Set,fields:void 0}),mergeFields($batchPlan$$[$signature$jscomp$1_sortedStatic$$],$mq$$.fields),$batchPlan$$[$signature$jscomp$1_sortedStatic$$].values.add($newBatchCacheKey_val$$),$newBatchCacheKey_val$$= `${$signature$jscomp$1_sortedStatic$$}_VAL_${$newBatchCacheKey_val$$==null?"__NULL__":$dynamicKey$$==="_id"?$newBatchCacheKey_val$$.toString():$newBatchCacheKey_val$$}`.replace(/\./g,"_"),$itemMetas$jscomp$1_metaToUpdate_staticQuery$$=$metaMap$$.get($mq$$.item))if($itemMetas$jscomp$1_metaToUpdate_staticQuery$$=$itemMetas$jscomp$1_metaToUpdate_staticQuery$$.find($m$$=>$m$$.cacheKey===$mq$$.cacheKey))$itemMetas$jscomp$1_metaToUpdate_staticQuery$$.type="BATCH",$itemMetas$jscomp$1_metaToUpdate_staticQuery$$.cacheKey= $newBatchCacheKey_val$$}else $remainingManualQueries$$.push($mq$$)});$manualQueries$$.length=0;$remainingManualQueries$$.length>0&&$manualQueries$$.push(...$remainingManualQueries$$)}return{batchPlan:$batchPlan$$,manualQueries:$manualQueries$$,metaMap:$metaMap$$}} function mergeFields($plan$$,$newFields$$){$plan$$.fields!==null&&($newFields$$===void 0?$plan$$.fields=null:($plan$$.fields?Object.assign($plan$$.fields,$newFields$$):$plan$$.fields={...$newFields$$},$plan$$.dynamicKey&&($plan$$.fields[$plan$$.dynamicKey]=1)))} async function executeQueries($batchPlan$$,$manualQueries$$,$options$$,$id_app$$){const $fetchedCache$$={};await runWithoutSession(async()=>{const $promises$$=[];Object.values($batchPlan$$).forEach($plan$$=>{const $values$$=Array.from($plan$$.values).filter($v$$=>$v$$!=null);$values$$.length&&$promises$$.push((async()=>{try{const $modelName$$=$plan$$.model.modelName,$isCacheEnabled$$=$options$$.cache&&cachedKeys&&cachedKeys[$modelName$$];let $missingValues$$=[...$values$$];if($isCacheEnabled$$&&global.clientRedis){const $redisMap$$= $values$$.map($val$$=>{var $rKey_tempQ$$={...$plan$$.staticQuery};$rKey_tempQ$$[$plan$$.dynamicKey]=$val$$;$rKey_tempQ$$=generateRedisKey($modelName$$,$rKey_tempQ$$,$id_app$$);return{val:$val$$,rKey:$rKey_tempQ$$}}),$keysToGet$$=$redisMap$$.map($i$$=>$i$$.rKey),$results$$=await redisMGet($keysToGet$$)||[];$missingValues$$=[];$results$$.forEach(($jsonStr$$,$i$$)=>{$i$$=$redisMap$$[$i$$].val;if($jsonStr$$)try{const $data$$=JSON.parse($jsonStr$$);$data$$._id&&($data$$._id=$data$$._id.toString());const $cacheKey$$= `${$plan$$.signature}_VAL_${$i$$==null?"__NULL__":$plan$$.dynamicKey==="_id"?$i$$.toString():$i$$}`.replace(/\./g,"_");$fetchedCache$$[$cacheKey$$]=$data$$}catch($e$$){Logger.warn("\u26a0\ufe0f [joinData] parse d\u1eef li\u1ec7u t\u1eeb redis",$e$$),$missingValues$$.push($i$$)}else $missingValues$$.push($i$$)})}$plan$$.dynamicKey==="_id"&&($missingValues$$=$missingValues$$.filter($m$$=>isValidObjectIdValue($m$$)));if($missingValues$$.length){const $query$$={...$plan$$.staticQuery,[$plan$$.dynamicKey]:{$in:$missingValues$$}}; $plan$$.model.schema.paths.id_app&&($query$$.id_app=$id_app$$);let $mq$$=$plan$$.model.find($query$$);$plan$$.fields&&($mq$$=$mq$$.select($plan$$.fields));let $dbResults$$;try{$dbResults$$=await $mq$$.lean()}catch($e$$){throw Logger.warn("\u274c[joinData] Batch Error with query:",JSON.stringify($query$$,null,2)),$e$$;}$dbResults$$.forEach($row$$=>{$row$$._id&&($row$$._id=$row$$._id.toString());var $cacheKey$jscomp$4_val$$=$row$$[$plan$$.dynamicKey];$cacheKey$jscomp$4_val$$=`${$plan$$.signature}_VAL_${$cacheKey$jscomp$4_val$$== null?"__NULL__":$plan$$.dynamicKey==="_id"?$cacheKey$jscomp$4_val$$.toString():$cacheKey$jscomp$4_val$$}`.replace(/\./g,"_");$fetchedCache$$[$cacheKey$jscomp$4_val$$]=$row$$})}}catch($e$$){Logger.error("\u274c[joinData] Batch Error:",$e$$.message)}})())});const $pendingRequests$$=new Map;$manualQueries$$.forEach($mq$$=>{const $key$$=$mq$$.cacheKey;if($pendingRequests$$.has($key$$))$promises$$.push($pendingRequests$$.get($key$$));else{var $executionPromise$$=(async()=>{try{let $data$$=null;if($options$$.cache&& cachedKeys&&cachedKeys[$mq$$.modelName]&&global.clientRedis){const $jsonStr$$=await redisGet($mq$$.cacheKey);if($jsonStr$$)try{$data$$=JSON.parse($jsonStr$$)}catch($e$$){Logger.warn("\u26a0\ufe0f [joinData][executeQueries][manualQueries] JSON parse error from Redis:",$mq$$.cacheKey)}}if(!$data$$)if(Object.values($mq$$.query).filter($v$$=>$v$$===void 0||$v$$===null).length>0)Logger.info("\u26a0\ufe0f [joinData][executeQueries][manualQueries]",$mq$$.model.modelName,": query kh\u00f4ng h\u1ee3p l\u1ec7 do c\u00f3 tr\u01b0\u1eddng c\u00f3 gi\u00e1 tr\u1ecb = null or undefined", $mq$$.query);else if("_id"in $mq$$.query&&!isValidObjectIdValue($mq$$.query._id))Logger.info("\u26a0\ufe0f [joinData][executeQueries][manualQueries]",$mq$$.model.modelName,": query kh\u00f4ng h\u1ee3p l\u1ec7.",$mq$$.query);else{let $query$$=$mq$$.model.findOne($mq$$.query);$mq$$.fields&&($query$$=$query$$.select($mq$$.fields));$data$$=await $query$$.lean()}$data$$?($data$$._id&&($data$$._id=$data$$._id.toString()),$fetchedCache$$[$mq$$.cacheKey]=$data$$):$fetchedCache$$[$mq$$.cacheKey]=null}catch($e$$){Logger.error("\u274c[joinData][executeQueries] Manual Query Error:", $e$$,$mq$$.query),$fetchedCache$$[$mq$$.cacheKey]=null}finally{$pendingRequests$$.delete($key$$)}})();$pendingRequests$$.set($key$$,$executionPromise$$);$promises$$.push($executionPromise$$)}});await Promise.all($promises$$)});return $fetchedCache$$} async function mapResultsToItems($data$jscomp$2_items$$,$metaMap$$,$dataCache$$){for(let $item$$ of $data$jscomp$2_items$$){$data$jscomp$2_items$$=$metaMap$$.get($item$$)||[];for(let $meta$$ of $data$jscomp$2_items$$){const {join:$join$$,cacheKey:$cacheKey$$}=$meta$$;$data$jscomp$2_items$$=($data$jscomp$2_items$$=$dataCache$$[$cacheKey$$])||null;await applyFields($item$$,$data$jscomp$2_items$$||{},$join$$)}}} async function applyFields($item$$,$data$$,$join$$){if($data$$)try{$join$$.fields&&(lodash.isFunction($join$$.fields)?$join$$.fields($item$$,$data$$):(Array.isArray($join$$.fields)?$join$$.fields:[$join$$.fields]).forEach($map$$=>{if(lodash.isObject($map$$))if($map$$.name&&$map$$.value)$item$$[$map$$.name]=$data$$[$map$$.value];else for(let $key_map$$ in $map$$)$item$$[$key_map$$]=$data$$[$map$$[$key_map$$]];else $item$$[$map$$]=$data$$[$map$$]})),$join$$.setFields&&$join$$.setFields($item$$,$data$$), $join$$.asyncSetFields&&await $join$$.asyncSetFields($item$$,$data$$,()=>{}).catch(console.error)}catch($e$$){Logger.error("[joinData] [applyFields]",$e$$.message,JSON.stringify({item:$item$$,data:$data$$,join:$join$$},null,2))}} Array.prototype.joinModel9=async function($args_id_app$$,$dataCache$jscomp$1_model$$,$joinFields$$,$fn$$,$options$$={cache:!0}){$args_id_app$$=normalizeArgs(this,$args_id_app$$,$dataCache$jscomp$1_model$$,$joinFields$$,$fn$$,$options$$);if(!$args_id_app$$.items.length)return safeCallback($args_id_app$$.fn,$args_id_app$$.items),$args_id_app$$.items;if(Array.isArray($args_id_app$$.id_app)&&!$args_id_app$$.modelOrigin){$dataCache$jscomp$1_model$$=$args_id_app$$.id_app;for(let $item$$ of $args_id_app$$.items)for(let $join$$ of $args_id_app$$.joinFields){$joinFields$$= null;if($join$$.akey&&$join$$.bkey){const $val$$=$item$$[$join$$.akey];$val$$!==void 0&&$val$$!==null&&($joinFields$$=$dataCache$jscomp$1_model$$.find($d$$=>$d$$[$join$$.bkey]==$val$$))}else $join$$.where&&lodash.isObject($join$$.where)&&!lodash.isFunction($join$$.where)?$joinFields$$=$dataCache$jscomp$1_model$$.find($d$$=>{let $isMatch$$=!0;for(let $k$$ in $join$$.where)if($item$$[$join$$.where[$k$$]]!=$d$$[$k$$]){$isMatch$$=!1;break}return $isMatch$$}):$join$$.where&&lodash.isFunction($join$$.where)&& ($joinFields$$=$dataCache$jscomp$1_model$$.find($d$$=>$join$$.where($item$$,$d$$)));$joinFields$$&&await applyFields($item$$,$joinFields$$,$join$$)}safeCallback($args_id_app$$.fn,$args_id_app$$.items);return $args_id_app$$.items}const {batchPlan:$batchPlan$$,manualQueries:$manualQueries$$,metaMap:$metaMap$$}=createQueryPlan($args_id_app$$.items,$args_id_app$$.joinFields,$args_id_app$$.modelOrigin,$args_id_app$$.id_app);$dataCache$jscomp$1_model$$=await executeQueries($batchPlan$$,$manualQueries$$, $args_id_app$$.options,$args_id_app$$.id_app);await mapResultsToItems($args_id_app$$.items,$metaMap$$,$dataCache$jscomp$1_model$$);safeCallback($args_id_app$$.fn,$args_id_app$$.items);return $args_id_app$$.items};