pict 1.0.379 → 1.0.380
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/pict.js +29 -6
- package/dist/pict.js.map +1 -1
- package/dist/pict.min.js +2 -2
- package/dist/pict.min.js.map +1 -1
- package/package.json +1 -1
- package/source/filters/Filter.js +41 -26
- package/types/source/Pict-Meadow-EntityProvider.d.ts +43 -7
- package/types/source/Pict-Meadow-EntityProvider.d.ts.map +1 -1
- package/types/source/filters/Filter.d.ts.map +1 -1
- package/types/source/providers/Pict-Icons-Base.d.ts +73 -0
- package/types/source/providers/Pict-Icons-Base.d.ts.map +1 -0
- package/types/source/providers/Provider-Icon.d.ts +70 -0
- package/types/source/providers/Provider-Icon.d.ts.map +1 -0
- package/types/source/templates/Pict-Template-AddressedTemplate.d.ts +32 -0
- package/types/source/templates/Pict-Template-AddressedTemplate.d.ts.map +1 -0
- package/types/source/templates/Pict-Template-Function.d.ts +36 -0
- package/types/source/templates/Pict-Template-Function.d.ts.map +1 -0
- package/types/source/templates/Pict-Template-Icon.d.ts +36 -0
- package/types/source/templates/Pict-Template-Icon.d.ts.map +1 -0
- package/types/source/templates/Pict-Template-InlineTemplate.d.ts +29 -0
- package/types/source/templates/Pict-Template-InlineTemplate.d.ts.map +1 -0
package/dist/pict.js
CHANGED
|
@@ -6106,7 +6106,7 @@ try{if(!global.localStorage)return false;}catch(_){return false;}var val=global.
|
|
|
6106
6106
|
// presumably different callback function.
|
|
6107
6107
|
// This makes sure that own properties are retained, so that
|
|
6108
6108
|
// decorations and such are not lost along the way.
|
|
6109
|
-
module.exports=wrappy;function wrappy(fn,cb){if(fn&&cb)return wrappy(fn)(cb);if(typeof fn!=='function')throw new TypeError('need wrapper function');Object.keys(fn).forEach(function(k){wrapper[k]=fn[k];});return wrapper;function wrapper(){var args=new Array(arguments.length);for(var i=0;i<args.length;i++){args[i]=arguments[i];}var ret=fn.apply(this,args);var cb=args[args.length-1];if(typeof ret==='function'&&ret!==cb){Object.keys(cb).forEach(function(k){ret[k]=cb[k];});}return ret;}}},{}],191:[function(require,module,exports){module.exports=extend;var hasOwnProperty=Object.prototype.hasOwnProperty;function extend(){var target={};for(var i=0;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;}},{}],192:[function(require,module,exports){module.exports={"name":"pict","version":"1.0.
|
|
6109
|
+
module.exports=wrappy;function wrappy(fn,cb){if(fn&&cb)return wrappy(fn)(cb);if(typeof fn!=='function')throw new TypeError('need wrapper function');Object.keys(fn).forEach(function(k){wrapper[k]=fn[k];});return wrapper;function wrapper(){var args=new Array(arguments.length);for(var i=0;i<args.length;i++){args[i]=arguments[i];}var ret=fn.apply(this,args);var cb=args[args.length-1];if(typeof ret==='function'&&ret!==cb){Object.keys(cb).forEach(function(k){ret[k]=cb[k];});}return ret;}}},{}],191:[function(require,module,exports){module.exports=extend;var hasOwnProperty=Object.prototype.hasOwnProperty;function extend(){var target={};for(var i=0;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;}},{}],192:[function(require,module,exports){module.exports={"name":"pict","version":"1.0.380","description":"Pict browser library.","main":"source/Pict.js","scripts":{"start":"node source/Pict.js","test":"npx quack test","tests":"npx quack test -g","coverage":"npx quack coverage","build":"npx quack build","prepublishOnly":"npx quack build","docker-dev-build":"docker build ./ -f Dockerfile_LUXURYCode -t pict-image:local","docker-dev-run":"docker run -it -d --name pict-dev -p 37447:8080 -p 19506:8086 -v \"$PWD/.config:/home/coder/.config\" -v \"$PWD:/home/coder/pict\" -u \"$(id -u):$(id -g)\" -e \"DOCKER_USER=$USER\" pict-image:local","docker-dev-shell":"docker exec -it pict-dev /bin/bash","lint":"eslint source/**/*.js test/**/*.js","types":"tsc -p ."},"files":["source/","dist/","types/"],"types":"types/source/Pict.d.ts","mocha":{"diff":true,"extension":["js"],"package":"./package.json","reporter":"spec","slow":"75","timeout":"5000","ui":"tdd","watch-files":["source/**/*.js","test/**/*.js"],"watch-ignore":["lib/vendor"]},"repository":{"type":"git","url":"git+https://stevenvelozo@github.com/stevenvelozo/pict.git"},"author":"steven velozo <steven@velozo.com>","license":"MIT","bugs":{"url":"https://github.com/fable-retold/pict/issues"},"homepage":"https://github.com/fable-retold/pict#readme","devDependencies":{"@eslint/js":"^9.39.1","@types/jquery":"^3.5.33","@types/sinon":"^17.0.4","eslint":"^9.39.1","globals":"^16.5.0","pict-docuserve":"^1.4.19","quackage":"^1.3.0","sinon":"^20.0.0","typescript":"^5.9.3"},"dependencies":{"cachetrax":"^1.0.6","fable":"^3.1.75","pict-application":"^1.0.34","pict-provider":"^1.0.13","pict-template":"^1.0.15","pict-view":"^1.0.68"}};},{}],193:[function(require,module,exports){// This assumes Pict has been required in the browser. Delcare these as globals so linter can do its job.
|
|
6110
6110
|
/* global Pict, _Pict: writeable *//**
|
|
6111
6111
|
* Simple function to load a pict Application
|
|
6112
6112
|
*
|
|
@@ -7242,7 +7242,11 @@ case'ExternalJoinMatch':case'ExternalJoinStringMatch':case'ExternalJoinDateMatch
|
|
|
7242
7242
|
*/if(!tmpFilterByColumns){tmpFilterByColumns=tmpFilterConfig.ExternalFilterByColumns||(tmpFilterConfig.ExternalFilterByColumn?[tmpFilterConfig.ExternalFilterByColumn]:['Name']);}for(const tmpField of tmpFilterByColumns){for(const tmpValue of tmpValuesArray){const tmpFilter={Index:-1,Entity:tmpFilterConfig.ExternalFilterByTable,Instruction:'FBVOR',Field:tmpField};if(tmpFilterConfig.ExactMatch||typeof tmpFilterConfig.ExactMatch==='undefined'&&(tmpFilterConfig.Type=='ExternalJoinNumericMatch'||tmpFilterConfig.Type=='ExternalJoinDateMatch'||tmpFilterConfig.Type=='ExternalJoinSelectedValue'||tmpFilterConfig.Type=='ExternalJoinSelectedValueList')){//TODO: optimize this to use in-list, but requires restructuring of this code
|
|
7243
7243
|
tmpFilter.Operator='EQ';tmpFilter.Value=tmpValue;}else{tmpFilter.Operator='LK';tmpFilter.Value=`%25${tmpValue}%25`;//FIXME: point of URI encoding needs to be addressed
|
|
7244
7244
|
}tmpFilterResult.Filters.push(tmpFilter);}}if(!tmpFilterConfig.JoinTable){this.log.error(`${tmpFilterConfig.Type} filter missing JoinTable, cannot filter join table.`,{FilterConfig:tmpFilterConfig});break;}if(!tmpFilterConfig.JoinTableExternalConnectionColumn){this.log.error(`${tmpFilterConfig.Type} filter missing JoinTableExternalConnectionColumn, cannot filter join table [${tmpFilterConfig.JoinTable}].`);break;}if(tmpFilterResult.Filters.length>0){tmpFilterResult.Filters.push({Index:0,Fulcrum:true,Entity:tmpFilterConfig.JoinTable,Instruction:'FBL',Field:tmpFilterConfig.JoinTableExternalConnectionColumn,Operator:'INN',ValueTemplate:`{~PJU:,^${tmpFilterConfig.ExternalFilterByTableConnectionColumn||tmpFilterConfig.JoinTableExternalConnectionColumn}^Record.State[Step-1]~}`});if(tmpFilterConfig.PolyJoinRemoteType){tmpFilterResult.Filters.push({Index:0,Fulcrum:true,Entity:tmpFilterConfig.JoinTable,Instruction:'FBV',Field:tmpFilterConfig.PolyJoinRemoteColumn||'RemoteType',Operator:'EQ',ValueTemplate:tmpFilterConfig.PolyJoinRemoteType});}if(!tmpFilterConfig.CoreConnectionColumn){this.log.error(`${tmpFilterConfig.Type} filter missing CoreConnectionColumn, cannot filter core table [${pFilterState.Entity}].`);break;}tmpFilterResult.JoinConfig={CoreEntity:pFilterState.Entity,Instruction:'FBLOR',Fields:[tmpFilterConfig.CoreConnectionColumn],Operator:'INN',ValueTemplate:`{~PJU:,^${tmpFilterConfig.JoinTableCoreConnectionColumn}^Record.State[Step0]~}`};}break;case'ExternalJoinStringRange':case'ExternalJoinNumericRange':case'ExternalJoinDateRange':case'ExternalJoinRange':if(!tmpFilterConfig.Values||tmpFilterConfig.Values.Start==null&&tmpFilterConfig.Values.End==null){break;}// do not honor '0' for dates
|
|
7245
|
-
if(tmpFilterConfig.Type=='ExternalJoinDateRange'){if((!tmpFilterConfig.Values.Start||tmpFilterConfig.Values.Start=='0')&&(!tmpFilterConfig.Values.End||tmpFilterConfig.Values.End=='0')){break;}}for(const tmpField of tmpFilterConfig.ExternalFilterByColumns||(tmpFilterConfig.ExternalFilterByColumn?[tmpFilterConfig.ExternalFilterByColumn]:['Name'])){const hasStartValue=tmpFilterConfig.Values&&tmpFilterConfig.Values.Start&&(tmpFilterConfig.Type!='ExternalJoinDateRange'||tmpFilterConfig.Values.Start!='0');const hasEndValue=tmpFilterConfig.Values&&tmpFilterConfig.Values.End&&(tmpFilterConfig.Type!='ExternalJoinDateRange'||tmpFilterConfig.Values.End!='0');if(hasStartValue){
|
|
7245
|
+
if(tmpFilterConfig.Type=='ExternalJoinDateRange'){if((!tmpFilterConfig.Values.Start||tmpFilterConfig.Values.Start=='0')&&(!tmpFilterConfig.Values.End||tmpFilterConfig.Values.End=='0')){break;}}for(const tmpField of tmpFilterConfig.ExternalFilterByColumns||(tmpFilterConfig.ExternalFilterByColumn?[tmpFilterConfig.ExternalFilterByColumn]:['Name'])){const hasStartValue=tmpFilterConfig.Values&&tmpFilterConfig.Values.Start&&(tmpFilterConfig.Type!='ExternalJoinDateRange'||tmpFilterConfig.Values.Start!='0');const hasEndValue=tmpFilterConfig.Values&&tmpFilterConfig.Values.End&&(tmpFilterConfig.Type!='ExternalJoinDateRange'||tmpFilterConfig.Values.End!='0');if(hasStartValue){// Range is `(Start <= field <= End)` — both bounds AND'd; per-
|
|
7246
|
+
// group serializer wraps the stanzas in a single paren group,
|
|
7247
|
+
// so no OpenParen needed here. See the matching note in the
|
|
7248
|
+
// core Range case below.
|
|
7249
|
+
tmpFilterResult.Filters.push({Index:-1,Entity:tmpFilterConfig.ExternalFilterByTable,Instruction:'FBV',CloseParen:false,Field:tmpField,Operator:tmpFilterConfig.StartExclusive?'GT':'GE',Value:tmpFilterConfig.Values.Start});}if(hasEndValue){tmpFilterResult.Filters.push({Index:-1,Entity:tmpFilterConfig.ExternalFilterByTable,Instruction:'FBV',CloseParen:false,Field:tmpField,Operator:tmpFilterConfig.EndExclusive?'LT':'LE',Value:tmpFilterConfig.Values.End});}}if(!tmpFilterConfig.JoinTable){this.log.error(`${tmpFilterConfig.Type} filter missing JoinTable, cannot filter join table.`,{FilterConfig:tmpFilterConfig});break;}if(!tmpFilterConfig.JoinTableExternalConnectionColumn){this.log.error(`${tmpFilterConfig.Type} filter missing JoinTableExternalConnectionColumn, cannot filter join table [${tmpFilterConfig.JoinTable}].`);break;}if(tmpFilterResult.Filters.length>0){tmpFilterResult.Filters.push({Index:0,Fulcrum:true,Entity:tmpFilterConfig.JoinTable,Instruction:'FBL',Field:tmpFilterConfig.JoinTableExternalConnectionColumn,Operator:'INN',ValueTemplate:`{~PJU:,^${tmpFilterConfig.ExternalFilterByTableConnectionColumn||tmpFilterConfig.JoinTableExternalConnectionColumn}^Record.State[Step-1]~}`});if(tmpFilterConfig.PolyJoinRemoteType){tmpFilterResult.Filters.push({Index:0,Fulcrum:true,Entity:tmpFilterConfig.JoinTable,Instruction:'FBV',Field:tmpFilterConfig.PolyJoinRemoteColumn||'RemoteType',Operator:'EQ',ValueTemplate:tmpFilterConfig.PolyJoinRemoteType});}if(!tmpFilterConfig.CoreConnectionColumn){this.log.error(`${tmpFilterConfig.Type} filter missing CoreConnectionColumn, cannot filter core table [${pFilterState.Entity}].`);break;}if(!tmpFilterConfig.JoinTableCoreConnectionColumn){this.log.error(`${tmpFilterConfig.Type} filter missing JoinTableCoreConnectionColumn, cannot filter core table [${pFilterState.Entity}].`);break;}tmpFilterResult.JoinConfig={CoreEntity:pFilterState.Entity,Instruction:'FBLOR',Fields:[tmpFilterConfig.CoreConnectionColumn],Operator:'INN',ValueTemplate:`{~PJU:,^${tmpFilterConfig.JoinTableCoreConnectionColumn}^Record.State[Step0]~}`};}break;case'StringRange':case'DateRange':case'NumericRange':case'Range':if(!tmpFilterConfig.Values||tmpFilterConfig.Values.Start==null&&tmpFilterConfig.Values.End==null){break;}// do not honor '0' for dates
|
|
7246
7250
|
if(tmpFilterConfig.Type=='DateRange'){if((!tmpFilterConfig.Values.Start||tmpFilterConfig.Values.Start=='0')&&(!tmpFilterConfig.Values.End||tmpFilterConfig.Values.End=='0')){break;}}/*
|
|
7247
7251
|
"Values":
|
|
7248
7252
|
{
|
|
@@ -7250,14 +7254,20 @@ if(tmpFilterConfig.Type=='DateRange'){if((!tmpFilterConfig.Values.Start||tmpFilt
|
|
|
7250
7254
|
"End": "2024-01-01T00:00:00Z"
|
|
7251
7255
|
},
|
|
7252
7256
|
"FilterByColumn": "CreateDate",
|
|
7253
|
-
*/for(const tmpField of tmpFilterConfig.FilterByColumns||(tmpFilterConfig.FilterByColumn?[tmpFilterConfig.FilterByColumn]:['Name'])){const hasStartValue=tmpFilterConfig.Values&&tmpFilterConfig.Values.Start&&(tmpFilterConfig.Type!='DateRange'||tmpFilterConfig.Values.Start!='0');const hasEndValue=tmpFilterConfig.Values&&tmpFilterConfig.Values.End&&(tmpFilterConfig.Type!='DateRange'||tmpFilterConfig.Values.End!='0');if(hasStartValue){
|
|
7257
|
+
*/for(const tmpField of tmpFilterConfig.FilterByColumns||(tmpFilterConfig.FilterByColumn?[tmpFilterConfig.FilterByColumn]:['Name'])){const hasStartValue=tmpFilterConfig.Values&&tmpFilterConfig.Values.Start&&(tmpFilterConfig.Type!='DateRange'||tmpFilterConfig.Values.Start!='0');const hasEndValue=tmpFilterConfig.Values&&tmpFilterConfig.Values.End&&(tmpFilterConfig.Type!='DateRange'||tmpFilterConfig.Values.End!='0');if(hasStartValue){// Range is `(Start <= field <= End)` — both bounds AND'd. No
|
|
7258
|
+
// OpenParen here; the per-group serializer already wraps the
|
|
7259
|
+
// stanzas in one paren group, and meadow-endpoints' filter
|
|
7260
|
+
// parser rejects further nesting (`FOP(FOP(...))` 404s on the
|
|
7261
|
+
// /1.0/PrivateDataLake/* routes).
|
|
7262
|
+
tmpFilterResult.Filters.push({Index:0,CoreEntity:true,Entity:pFilterState.Entity,Instruction:'FBV',Field:tmpField,CloseParen:false,Operator:tmpFilterConfig.StartExclusive?'GT':'GE',Value:tmpFilterConfig.Values.Start});}if(hasEndValue){tmpFilterResult.Filters.push({Index:0,CoreEntity:true,Entity:pFilterState.Entity,Instruction:'FBV',CloseParen:false,Field:tmpField,Operator:tmpFilterConfig.EndExclusive?'LT':'LE',Value:tmpFilterConfig.Values.End});}}break;case'StringMatch':case'DateMatch':case'NumericMatch':case'Match':/*
|
|
7254
7263
|
"Values": [ "John", "Jane" ],
|
|
7255
7264
|
"FilterByColumn": "Name",
|
|
7256
7265
|
"ExactMatch": false,
|
|
7257
7266
|
*/for(const tmpField of tmpFilterConfig.FilterByColumns||(tmpFilterConfig.FilterByColumn?[tmpFilterConfig.FilterByColumn]:['Name'])){for(const tmpValue of tmpValuesArray){const tmpFilter={Index:0,CoreEntity:true,Entity:pFilterState.Entity,Instruction:'FBVOR',Field:tmpField};// don't use like for numbers
|
|
7258
7267
|
if(tmpFilterConfig.ExactMatch||typeof tmpFilterConfig.ExactMatch==='undefined'&&(tmpFilterConfig.Type=='NumericMatch'||tmpFilterConfig.Type=='DateMatch')){tmpFilter.Operator='EQ';tmpFilter.Value=tmpValue;}else{tmpFilter.Operator='LK';tmpFilter.Value=`%25${tmpValue}%25`;//FIXME: figure out a cleaner way to do URL encoding for these - probably, should be downstream, but isn't currently
|
|
7259
7268
|
}tmpFilterResult.Filters.push(tmpFilter);}}break;case'InternalJoinStringRange':case'InternalJoinNumericRange':case'InternalJoinDateRange':case'InternalJoinRange':if(!tmpFilterConfig.Values||tmpFilterConfig.Values.Start==null&&tmpFilterConfig.Values.End==null){break;}// do not honor '0' for dates
|
|
7260
|
-
if(tmpFilterConfig.Type=='InternalJoinDateRange'){if((!tmpFilterConfig.Values.Start||tmpFilterConfig.Values.Start=='0')&&(!tmpFilterConfig.Values.End||tmpFilterConfig.Values.End=='0')){break;}}for(const tmpField of tmpFilterConfig.ExternalFilterByColumns||(tmpFilterConfig.ExternalFilterByColumn?[tmpFilterConfig.ExternalFilterByColumn]:['Name'])){const hasStartValue=tmpFilterConfig.Values&&tmpFilterConfig.Values.Start&&(tmpFilterConfig.Type!='InternalJoinDateRange'||tmpFilterConfig.Values.Start!='0');const hasEndValue=tmpFilterConfig.Values&&tmpFilterConfig.Values.End&&(tmpFilterConfig.Type!='InternalJoinDateRange'||tmpFilterConfig.Values.End!='0');if(hasStartValue){
|
|
7269
|
+
if(tmpFilterConfig.Type=='InternalJoinDateRange'){if((!tmpFilterConfig.Values.Start||tmpFilterConfig.Values.Start=='0')&&(!tmpFilterConfig.Values.End||tmpFilterConfig.Values.End=='0')){break;}}for(const tmpField of tmpFilterConfig.ExternalFilterByColumns||(tmpFilterConfig.ExternalFilterByColumn?[tmpFilterConfig.ExternalFilterByColumn]:['Name'])){const hasStartValue=tmpFilterConfig.Values&&tmpFilterConfig.Values.Start&&(tmpFilterConfig.Type!='InternalJoinDateRange'||tmpFilterConfig.Values.Start!='0');const hasEndValue=tmpFilterConfig.Values&&tmpFilterConfig.Values.End&&(tmpFilterConfig.Type!='InternalJoinDateRange'||tmpFilterConfig.Values.End!='0');if(hasStartValue){// Range bounds AND'd within the per-group paren wrap.
|
|
7270
|
+
tmpFilterResult.Filters.push({Index:0,Entity:tmpFilterConfig.RemoteTable,Instruction:'FBV',Field:tmpField,CloseParen:false,Operator:tmpFilterConfig.StartExclusive?'GT':'GE',Value:tmpFilterConfig.Values.Start});}if(hasEndValue){tmpFilterResult.Filters.push({Index:0,Entity:tmpFilterConfig.RemoteTable,Instruction:'FBV',CloseParen:false,Field:tmpField,Operator:tmpFilterConfig.EndExclusive?'LT':'LE',Value:tmpFilterConfig.Values.End});}}if(tmpFilterResult.Filters.length>0){if(!tmpFilterConfig.JoinInternalConnectionColumn){this.log.error(`${tmpFilterConfig.Type} filter missing JoinInternalConnectionColumn, cannot filter core table [${pFilterState.Entity}].`);break;}tmpFilterResult.JoinConfig={Instruction:'FBLOR',CoreEntity:pFilterState.Entity,Fields:[tmpFilterConfig.JoinInternalConnectionColumn],Operator:'INN',ValueTemplate:`{~PJU:,^${tmpFilterConfig.JoinExternalConnectionColumn}^Record.State[Step0]~}`};}break;case'InternalJoinSelectedValue':case'InternalJoinSelectedValueList':tmpFilterByColumns=[tmpFilterConfig.ExternalFilterTableLookupColumn||`ID${tmpFilterConfig.RemoteTable}`];// fall through
|
|
7261
7271
|
case'InternalJoinMatch':case'InternalJoinStringMatch':case'InternalJoinDateMatch':case'InternalJoinNumericMatch':/*
|
|
7262
7272
|
"Values": [ "Bob" ],
|
|
7263
7273
|
"RemoteTable": "User",
|
|
@@ -7265,7 +7275,12 @@ case'InternalJoinMatch':case'InternalJoinStringMatch':case'InternalJoinDateMatch
|
|
|
7265
7275
|
"JoinExternalConnectionColumn": "IDUser",
|
|
7266
7276
|
"JoinInternalConnectionColumn": "CreatingIDUser",
|
|
7267
7277
|
*/if(!tmpFilterByColumns){tmpFilterByColumns=tmpFilterConfig.ExternalFilterByColumns||(tmpFilterConfig.ExternalFilterByColumn?[tmpFilterConfig.ExternalFilterByColumn]:['Name']);}for(const tmpField of tmpFilterByColumns){for(const tmpValue of tmpValuesArray){const tmpFilter={Index:0,Entity:tmpFilterConfig.RemoteTable,Instruction:'FBVOR',Field:tmpField};if(tmpFilterConfig.ExactMatch||typeof tmpFilterConfig.ExactMatch==='undefined'&&(tmpFilterConfig.Type=='InternalJoinNumericMatch'||tmpFilterConfig.Type=='InternalJoinDateMatch'||tmpFilterConfig.Type=='InternalJoinSelectedValue'||tmpFilterConfig.Type=='InternalJoinSelectedValueList')){//TODO: optimize this to use in-list, but requires restructuring of this code
|
|
7268
|
-
tmpFilter.Operator='EQ';tmpFilter.Value=tmpValue;}else{tmpFilter.Operator='LK';tmpFilter.Value=`%25${tmpValue}%25`;}tmpFilterResult.Filters.push(tmpFilter);}}if(tmpFilterResult.Filters.length>0){if(!tmpFilterConfig.JoinInternalConnectionColumn){this.log.error(`${tmpFilterConfig.Type} filter missing JoinInternalConnectionColumn, cannot filter core table [${pFilterState.Entity}].`);break;}tmpFilterResult.JoinConfig={Instruction:'FBLOR',CoreEntity:pFilterState.Entity,Fields:[tmpFilterConfig.JoinInternalConnectionColumn],Operator:'INN',ValueTemplate:`{~PJU:,^${tmpFilterConfig.JoinExternalConnectionColumn}^Record.State[Step0]~}`};}break;case'RawFilter':if(!tmpFilterConfig.Value){this.log.warn(`RawFilter configuration missing Value, not adding filter.`,{FilterConfig:tmpFilterConfig});break;}pFilterState.UserFilters.push(tmpFilterConfig.Value);break;default:this.log.warn(`Unknown filter type ${tmpFilterConfig.Type} in filter configuration.`,{FilterConfig:tmpFilterConfig});}
|
|
7278
|
+
tmpFilter.Operator='EQ';tmpFilter.Value=tmpValue;}else{tmpFilter.Operator='LK';tmpFilter.Value=`%25${tmpValue}%25`;}tmpFilterResult.Filters.push(tmpFilter);}}if(tmpFilterResult.Filters.length>0){if(!tmpFilterConfig.JoinInternalConnectionColumn){this.log.error(`${tmpFilterConfig.Type} filter missing JoinInternalConnectionColumn, cannot filter core table [${pFilterState.Entity}].`);break;}tmpFilterResult.JoinConfig={Instruction:'FBLOR',CoreEntity:pFilterState.Entity,Fields:[tmpFilterConfig.JoinInternalConnectionColumn],Operator:'INN',ValueTemplate:`{~PJU:,^${tmpFilterConfig.JoinExternalConnectionColumn}^Record.State[Step0]~}`};}break;case'RawFilter':if(!tmpFilterConfig.Value){this.log.warn(`RawFilter configuration missing Value, not adding filter.`,{FilterConfig:tmpFilterConfig});break;}pFilterState.UserFilters.push(tmpFilterConfig.Value);break;default:this.log.warn(`Unknown filter type ${tmpFilterConfig.Type} in filter configuration.`,{FilterConfig:tmpFilterConfig});}// Per-clause URLPrefix knob: the remote-table resolution requests (the join lookup
|
|
7279
|
+
// against RemoteTable) otherwise inherit the recordset entity provider's URLPrefix.
|
|
7280
|
+
// When a clause's remote entity lives at a different API root than the recordset
|
|
7281
|
+
// (e.g. a lake-backed recordset joining to a main-API entity), set URLPrefix on the
|
|
7282
|
+
// clause to resolve the join there. The core-entity (recordset) request is unaffected.
|
|
7283
|
+
if(tmpFilterConfig.URLPrefix){for(const tmpRemoteResolutionFilter of tmpFilterResult.Filters){tmpRemoteResolutionFilter.URLPrefix=tmpFilterConfig.URLPrefix;}}if(tmpFilterResult.Filters.length>0){if(tmpFilterConfig.GUIDGroup){if(groupedFilterStates[tmpFilterConfig.GUIDGroup]){groupedFilterStates[tmpFilterConfig.GUIDGroup].PreparedFilters.push(tmpFilterResult);}else{groupedFilterStates[tmpFilterConfig.GUIDGroup]={PreparedFilters:[tmpFilterResult],Junction:'AND',Ordinal:0};}}else{tmpResult.push(tmpFilterResult);}}}const sortSet=arr=>{for(let x=0;x<arr.length;x++){arr[x].Ordinal=arr[x].Ordinal||0;}return arr.sort((a,b)=>{if(a.Ordinal>b.Ordinal){return 1;}else if(b.Ordinal>a.Ordinal){return-1;}return 0;});};const spreadGroupings=arr=>{const outputSet=[];for(const group of arr){if(group.PreparedFilters){group.PreparedFilters[0].GroupOpen=true;group.PreparedFilters[0].GroupJunction=group.Junction;group.PreparedFilters[group.PreparedFilters.length-1].GroupClose=true;for(let x=0;x<group.PreparedFilters.length;x++){outputSet.push(group.PreparedFilters[x]);}}else{outputSet.push(group);}}return outputSet;};for(let g of Object.keys(groupedFilterStates)){var _groupedFilterStates$;if((_groupedFilterStates$=groupedFilterStates[g].PreparedFilters)!==null&&_groupedFilterStates$!==void 0&&_groupedFilterStates$.length){groupedFilterStates[g].PreparedFilters=sortSet(groupedFilterStates[g].PreparedFilters);}tmpResult.push(groupedFilterStates[g]);}tmpResult=spreadGroupings(sortSet(tmpResult));pFilterState.PreparedFilters=tmpResult;}/**
|
|
7269
7284
|
* @param {FilterState} pFilterState
|
|
7270
7285
|
*/linkPreparedFilters(pFilterState){const tmpGroupedStanzas=[];for(const tmpPreparedFilter of pFilterState.PreparedFilters||[]){if(tmpPreparedFilter.JoinConfig){const tmpSubGroup=tmpPreparedFilter.Filters;const tmpJoinConfig=tmpPreparedFilter.JoinConfig;for(const tmpField of tmpJoinConfig.Fields||[]){const tmpStanza={Index:1,CoreEntity:true,Entity:tmpPreparedFilter.JoinConfig.CoreEntity,Instruction:tmpPreparedFilter.JoinConfig.Instruction||'FBVOR',Field:tmpField,Operator:tmpJoinConfig.Operator,Value:tmpJoinConfig.Value,ValueTemplate:tmpJoinConfig.ValueTemplate};tmpSubGroup.push(tmpStanza);}tmpGroupedStanzas.push(tmpSubGroup);}else{tmpGroupedStanzas.push(tmpPreparedFilter.Filters);}}return tmpGroupedStanzas;}/**
|
|
7271
7286
|
* Generate a computed index for each filter in the meadow filter stanzas such that the overall address space is non-overlapping and stable.
|
|
@@ -7276,7 +7291,15 @@ tmpFilter.Operator='EQ';tmpFilter.Value=tmpValue;}else{tmpFilter.Operator='LK';t
|
|
|
7276
7291
|
*/compileMeadowFilterStanzas(pFilterState){const tmpBundleConfig=[];//TODO: mathematically solve the number line
|
|
7277
7292
|
// planned synthesized syntax for running on the server
|
|
7278
7293
|
// FBV-3_Author~Name~LK~%25Ann%25~FBL-2_BookAuthorJoin~IDAuthor~INN~{~PJU:,^State[Step-3]^IDAuthor~}~FBV-1~User~NameFirst~LK~%25Bob%25~FBVOR-1~User~NameLast~LK~%25Bob%25~FBV~CreateDate~GT~2023-01-01T00:00:00Z~FBV~CreateDate~LT~2024-01-01T00:00:00Z~FBL~IDBook~INN~{~PJU:,^State[Step-2]^IDBook~}
|
|
7279
|
-
if(!pFilterState.Filter){pFilterState.Filter=`${pFilterState.Entity||'Unknown'}-${this.pict.getUUID()}`;}tmpBundleConfig.push({Type:'SetStateAddress',StateAddress:`Bundle[${pFilterState.Filter}]`});const tmpGroupedFilters={};const tmpGroupedFilterKeys=[];const tmpGroupedCoreFilters=[];const tmpGroupedCoreFilterKeys=[];let tmpCoreEntity;const tmpCoreFilterStrings=[];for(const tmpFilterGroup of pFilterState.PreparedFilters){for(const tmpFilter of tmpFilterGroup.Filters){if(tmpFilter.CoreEntity){tmpCoreEntity=tmpFilter.Entity;const tmpFilterGUID=`${tmpFilterGroup.GUID}-${tmpFilter.ComputedIndex}`;if(!tmpGroupedCoreFilterKeys.find(v=>v==tmpFilterGUID)){tmpGroupedCoreFilterKeys.push(tmpFilterGUID);}if(!tmpGroupedCoreFilters[tmpFilterGUID]){tmpGroupedCoreFilters[tmpFilterGUID]={Stanzas:[],ComputedIndex:tmpFilter.ComputedIndex,Entity:tmpFilter.Entity,Junction:tmpFilterGroup.Junction||'AND',GroupOpen:tmpFilterGroup.GroupOpen||false,GroupJunction:tmpFilterGroup.GroupJunction||'AND',GroupClose:tmpFilterGroup.GroupClose||false};}tmpGroupedCoreFilters[tmpFilterGUID].Stanzas.push(this._compileSimpleFilterToString(tmpFilter));}else{const tmpFilterGroupGUID=`${tmpFilterGroup.GUID}-${tmpFilter.ComputedIndex}`;if(!tmpGroupedFilterKeys.find(v=>v==tmpFilterGroupGUID)){tmpGroupedFilterKeys.push(tmpFilterGroupGUID);}if(!tmpGroupedFilters[tmpFilterGroupGUID]){tmpGroupedFilters[tmpFilterGroupGUID]={Stanzas:[],ComputedIndex:tmpFilter.ComputedIndex,Entity:tmpFilter.Entity};}tmpGroupedFilters[tmpFilterGroupGUID].Stanzas.push(this._compileSimpleFilterToString(tmpFilter));}}for(const tmpFilterGroupKey of tmpGroupedFilterKeys){tmpGroupedFilters[tmpFilterGroupKey].Stanzas=tmpGroupedFilters[tmpFilterGroupKey].Stanzas.filter(f=>f.length>0);if(tmpGroupedFilters[tmpFilterGroupKey].Stanzas.length>0){tmpBundleConfig.push({Type:'MeadowEntity',AllRecords:true,Entity:tmpGroupedFilters[tmpFilterGroupKey].Entity,Filter:tmpGroupedFilters[tmpFilterGroupKey].Stanzas.join('~'),Destination:`State[Step${tmpGroupedFilters[tmpFilterGroupKey].ComputedIndex}]`});}}}for(const tmpCoreFilterKey of tmpGroupedCoreFilterKeys){tmpGroupedCoreFilters[tmpCoreFilterKey].Stanzas=tmpGroupedCoreFilters[tmpCoreFilterKey].Stanzas.filter(f=>f.length>0);if(tmpGroupedCoreFilters[tmpCoreFilterKey].Stanzas.length>0){let stringConstruct='';if(tmpGroupedCoreFilters[tmpCoreFilterKey].GroupOpen){stringConstruct+=tmpGroupedCoreFilters[tmpCoreFilterKey].GroupJunction=='OR'?'FOPOR~0~(~0~':'FOP~0~(~0~';}stringConstruct+=[tmpGroupedCoreFilters[tmpCoreFilterKey].Junction=='OR'?'FOPOR~0~(~0':'FOP~0~(~0',...tmpGroupedCoreFilters[tmpCoreFilterKey].Stanzas,'FCP~0~)~0'].join('~');if(tmpGroupedCoreFilters[tmpCoreFilterKey].GroupClose){stringConstruct+='~FCP~0~)~0';}tmpCoreFilterStrings.push(stringConstruct);}}if(!tmpCoreEntity){tmpCoreEntity=pFilterState.Entity;}const tmpCoreLoadStep={Type:pFilterState.Mode==='Count'?'MeadowEntityCount':'MeadowEntity',Entity:tmpCoreEntity,Filter:tmpCoreFilterStrings.join('~'),AllRecords:typeof pFilterState.PageSize==='undefined',RecordStartCursor:pFilterState.RecordOffset,Postfix:pFilterState.Postfix||'',Scope:pFilterState.Scope||'',Projection:pFilterState.Projection,PageSize:pFilterState.PageSize,Destination:pFilterState.ResultDestinationAddress};if(pFilterState.UserFilters.length>0){let tmpAllSorts='';let tmpFilter='';for(const tmpUserFilter of pFilterState.UserFilters){let tmpSorts;let tmpSanitizedUserFilter=tmpUserFilter;if(pFilterState.Mode==='Count'){tmpSanitizedUserFilter=this._sanitizeFilterForCount(tmpUserFilter);}else{var _this$_extractSortsFr=this._extractSortsFromFilter(tmpUserFilter);var _this$_extractSortsFr2=_slicedToArray(_this$_extractSortsFr,2);tmpSanitizedUserFilter=_this$_extractSortsFr2[0];tmpSorts=_this$_extractSortsFr2[1];if(tmpSorts){if(tmpAllSorts.length>0){tmpAllSorts+='~';}tmpAllSorts+=tmpSorts;}if(!tmpSanitizedUserFilter){continue;}}if(!tmpSanitizedUserFilter){continue;}if(tmpFilter.length>0){tmpFilter+='~';}
|
|
7294
|
+
if(!pFilterState.Filter){pFilterState.Filter=`${pFilterState.Entity||'Unknown'}-${this.pict.getUUID()}`;}tmpBundleConfig.push({Type:'SetStateAddress',StateAddress:`Bundle[${pFilterState.Filter}]`});const tmpGroupedFilters={};const tmpGroupedFilterKeys=[];const tmpGroupedCoreFilters=[];const tmpGroupedCoreFilterKeys=[];let tmpCoreEntity;const tmpCoreFilterStrings=[];for(const tmpFilterGroup of pFilterState.PreparedFilters){for(const tmpFilter of tmpFilterGroup.Filters){if(tmpFilter.CoreEntity){tmpCoreEntity=tmpFilter.Entity;const tmpFilterGUID=`${tmpFilterGroup.GUID}-${tmpFilter.ComputedIndex}`;if(!tmpGroupedCoreFilterKeys.find(v=>v==tmpFilterGUID)){tmpGroupedCoreFilterKeys.push(tmpFilterGUID);}if(!tmpGroupedCoreFilters[tmpFilterGUID]){tmpGroupedCoreFilters[tmpFilterGUID]={Stanzas:[],ComputedIndex:tmpFilter.ComputedIndex,Entity:tmpFilter.Entity,Junction:tmpFilterGroup.Junction||'AND',GroupOpen:tmpFilterGroup.GroupOpen||false,GroupJunction:tmpFilterGroup.GroupJunction||'AND',GroupClose:tmpFilterGroup.GroupClose||false};}tmpGroupedCoreFilters[tmpFilterGUID].Stanzas.push(this._compileSimpleFilterToString(tmpFilter));}else{const tmpFilterGroupGUID=`${tmpFilterGroup.GUID}-${tmpFilter.ComputedIndex}`;if(!tmpGroupedFilterKeys.find(v=>v==tmpFilterGroupGUID)){tmpGroupedFilterKeys.push(tmpFilterGroupGUID);}if(!tmpGroupedFilters[tmpFilterGroupGUID]){tmpGroupedFilters[tmpFilterGroupGUID]={Stanzas:[],ComputedIndex:tmpFilter.ComputedIndex,Entity:tmpFilter.Entity,URLPrefix:tmpFilter.URLPrefix};}tmpGroupedFilters[tmpFilterGroupGUID].Stanzas.push(this._compileSimpleFilterToString(tmpFilter));}}for(const tmpFilterGroupKey of tmpGroupedFilterKeys){tmpGroupedFilters[tmpFilterGroupKey].Stanzas=tmpGroupedFilters[tmpFilterGroupKey].Stanzas.filter(f=>f.length>0);if(tmpGroupedFilters[tmpFilterGroupKey].Stanzas.length>0){tmpBundleConfig.push({Type:'MeadowEntity',AllRecords:true,Entity:tmpGroupedFilters[tmpFilterGroupKey].Entity,URLPrefix:tmpGroupedFilters[tmpFilterGroupKey].URLPrefix,Filter:tmpGroupedFilters[tmpFilterGroupKey].Stanzas.join('~'),Destination:`State[Step${tmpGroupedFilters[tmpFilterGroupKey].ComputedIndex}]`});}}}for(const tmpCoreFilterKey of tmpGroupedCoreFilterKeys){tmpGroupedCoreFilters[tmpCoreFilterKey].Stanzas=tmpGroupedCoreFilters[tmpCoreFilterKey].Stanzas.filter(f=>f.length>0);if(tmpGroupedCoreFilters[tmpCoreFilterKey].Stanzas.length>0){let stringConstruct='';if(tmpGroupedCoreFilters[tmpCoreFilterKey].GroupOpen){stringConstruct+=tmpGroupedCoreFilters[tmpCoreFilterKey].GroupJunction=='OR'?'FOPOR~0~(~0~':'FOP~0~(~0~';}stringConstruct+=[tmpGroupedCoreFilters[tmpCoreFilterKey].Junction=='OR'?'FOPOR~0~(~0':'FOP~0~(~0',...tmpGroupedCoreFilters[tmpCoreFilterKey].Stanzas,'FCP~0~)~0'].join('~');if(tmpGroupedCoreFilters[tmpCoreFilterKey].GroupClose){stringConstruct+='~FCP~0~)~0';}tmpCoreFilterStrings.push(stringConstruct);}}if(!tmpCoreEntity){tmpCoreEntity=pFilterState.Entity;}const tmpCoreLoadStep={Type:pFilterState.Mode==='Count'?'MeadowEntityCount':'MeadowEntity',Entity:tmpCoreEntity,Filter:tmpCoreFilterStrings.join('~'),AllRecords:typeof pFilterState.PageSize==='undefined',RecordStartCursor:pFilterState.RecordOffset,Postfix:pFilterState.Postfix||'',Scope:pFilterState.Scope||'',Projection:pFilterState.Projection,PageSize:pFilterState.PageSize,Destination:pFilterState.ResultDestinationAddress};if(pFilterState.UserFilters.length>0){let tmpAllSorts='';let tmpFilter='';for(const tmpUserFilter of pFilterState.UserFilters){let tmpSorts;let tmpSanitizedUserFilter=tmpUserFilter;if(pFilterState.Mode==='Count'){tmpSanitizedUserFilter=this._sanitizeFilterForCount(tmpUserFilter);}else{var _this$_extractSortsFr=this._extractSortsFromFilter(tmpUserFilter);var _this$_extractSortsFr2=_slicedToArray(_this$_extractSortsFr,2);tmpSanitizedUserFilter=_this$_extractSortsFr2[0];tmpSorts=_this$_extractSortsFr2[1];if(tmpSorts){if(tmpAllSorts.length>0){tmpAllSorts+='~';}tmpAllSorts+=tmpSorts;}if(!tmpSanitizedUserFilter){continue;}}if(!tmpSanitizedUserFilter){continue;}if(tmpFilter.length>0){tmpFilter+='~';}// The user-filter and core-filter strings already carry their
|
|
7295
|
+
// own paren grouping from the per-group serializer above (the
|
|
7296
|
+
// `FOP(stanzas)` wrap at line 822). Wrapping a SECOND time here
|
|
7297
|
+
// produces `FOP(FOP(...))` which meadow-endpoints'
|
|
7298
|
+
// MeadowEndpoints dialect (used by the lake's
|
|
7299
|
+
// /PrivateDataLake/* routes) treats as malformed — the route
|
|
7300
|
+
// 404s instead of filtering. The right shape is one paren per
|
|
7301
|
+
// logical group, concatenated flat at the top level.
|
|
7302
|
+
tmpFilter+=tmpSanitizedUserFilter;}if(tmpCoreLoadStep.Filter){if(tmpFilter.length>0){tmpFilter+='~';}tmpFilter+=tmpCoreLoadStep.Filter;}if(tmpAllSorts){if(tmpFilter.length>0){tmpFilter+='~';}tmpFilter+=tmpAllSorts;}tmpCoreLoadStep.Filter=tmpFilter;}tmpBundleConfig.push(tmpCoreLoadStep);pFilterState.BundleConfig=tmpBundleConfig;}/**
|
|
7280
7303
|
* @param {string} pFilter
|
|
7281
7304
|
*
|
|
7282
7305
|
* @return {string}
|