/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.24/esri/copyright.txt for details. */ import e from"../ArcadePortal.js";import t from"../Dictionary.js";import n from"../Feature.js";import r from"../featureSetCollection.js";import{getPortal as i,lookupUser as a,convertToFeatureSet as s,constructFeatureSetFromPortalItem as o,constructFeatureSet as l,constructFeatureSetFromRelationship as f,constructFeatureSetFromUrl as u,constructAssociationMetaDataFeatureSetFromUrl as c}from"../featureSetUtils.js";import d from"../FunctionWrapper.js";import m from"../ImmutableArray.js";import{p,C as y,h as g,y as w,g as h,l as E,s as F,b as I,n as D,N as b,S as A,f as N,Y as x,M as S}from"../../chunks/languageUtils.js";import{SqlExpressionAdapted as $,StringToCodeAdapted as L,FieldRename as T,AdaptedFeatureSet as v,OriginalField as j}from"../featureset/actions/Adapted.js";import O from"../featureset/actions/AttributeFilter.js";import C from"../featureset/actions/OrderBy.js";import R from"../featureset/actions/Top.js";import M from"../featureset/sources/Empty.js";import P from"../featureset/sources/FeatureLayerMemory.js";import k from"../featureset/support/OrderbyClause.js";import{cloneField as G}from"../featureset/support/shared.js";import{isSingleField as B}from"../featureset/support/sqlUtils.js";import{calculateStat as V}from"./fieldStats.js";import{isPromiseLike as H}from"../../core/promiseUtils.js";import{WhereClause as z}from"../../core/sql/WhereClause.js";import W from"../../layers/FeatureLayer.js";import U from"../../layers/support/Field.js";function _(e,t,n,r){if(1===r.length){if(E(r[0]))return V(e,r[0],-1);if(D(r[0]))return V(e,r[0].toArray(),-1)}return V(e,r,-1)}async function J(e,t,n){const r=e.getVariables();if(r.length>0){const i=[];for(let e=0;e{p(o,1,2);let l=y(o[1],""),f=!0===l;if(l=!0===l||!1===l?"":g(l),o[0]instanceof e){let e=null;n.services&&n.services.portal&&(e=n.services.portal),e=i(o[0],e);const r=await a(e,l,f);if(r){const e=JSON.parse(JSON.stringify(r));for(const t of["lastLogin","created","modified"])void 0!==e[t]&&null!==e[t]&&(e[t]=new Date(e[t]));return t.convertObjectToArcadeDictionary(e)}return null}let u=null;if(w(o[0])&&(u=o[0]),u){if(f=!1,l)return null;await u.load();const r=await u.getOwningSystemUrl();if(!r){if(!l){const e=await u.getIdentityUser();return e?t.convertObjectToArcadeDictionary({username:e}):null}return null}let s=null;n.services&&n.services.portal&&(s=n.services.portal),s=i(new e(r),s);const o=await a(s,l,f);if(o){const e=JSON.parse(JSON.stringify(o));for(const t of["lastLogin","created","modified"])void 0!==e[t]&&null!==e[t]&&(e[t]=new Date(e[t]));return t.convertObjectToArcadeDictionary(e)}return null}throw new Error("Invalid Parameter")}))},V.signatures.push({name:"getuser",min:"1",max:"2"}),V.functions.featuresetbyid=function(e,t){return V.standardFunctionAsync(e,t,((e,t,n)=>{if(p(n,2,4),n[0]instanceof r){const e=g(n[1]);let t=y(n[2],null);const r=h(y(n[3],!0));if(null===t&&(t=["*"]),!1===E(t))throw new Error("Invalid Parameter");return n[0].featureSetById(e,r,t)}throw new Error("Invalid Parameter")}))},V.signatures.push({name:"featuresetbyid",min:"2",max:"4"}),V.functions.getfeatureset=function(e,t){return V.standardFunctionAsync(e,t,((t,n,r)=>{if(p(r,1,2),F(r[0])){let t=y(r[1],"datasource");return null===t&&(t="datasource"),t=g(t).toLowerCase(),s(r[0].fullSchema(),t,e.lrucache,e.interceptor,e.spatialReference)}throw new Error("Invalid Parameter")}))},V.signatures.push({name:"getfeatureset",min:"1",max:"2"}),V.functions.featuresetbyportalitem=function(t,n){return V.standardFunctionAsync(t,n,((n,r,a)=>{if(p(a,2,5),null===a[0])throw new Error("Portal is required");if(a[0]instanceof e){const e=g(a[1]),n=g(a[2]);let r=y(a[3],null);const s=h(y(a[4],!0));if(null===r&&(r=["*"]),!1===E(r))throw new Error("Invalid Parameter");let l=null;return t.services&&t.services.portal&&(l=t.services.portal),l=i(a[0],l),o(e,n,t.spatialReference,r,s,l,t.lrucache,t.interceptor)}if(!1===I(a[0]))throw new Error("Portal is required");const s=g(a[0]),l=g(a[1]);let f=y(a[2],null);const u=h(y(a[3],!0));if(null===f&&(f=["*"]),!1===E(f))throw new Error("Invalid Parameter");if(t.services&&t.services.portal)return o(s,l,t.spatialReference,f,u,t.services.portal,t.lrucache,t.interceptor);throw new Error("Portal is required")}))},V.signatures.push({name:"featuresetbyportalitem",min:"2",max:"5"}),V.functions.featuresetbyname=function(e,t){return V.standardFunctionAsync(e,t,((e,t,n)=>{if(p(n,2,4),n[0]instanceof r){const e=g(n[1]);let t=y(n[2],null);const r=h(y(n[3],!0));if(null===t&&(t=["*"]),!1===E(t))throw new Error("Invalid Parameter");return n[0].featureSetByName(e,r,t)}throw new Error("Invalid Parameter")}))},V.signatures.push({name:"featuresetbyname",min:"2",max:"4"}),V.functions.featureset=function(e,n){return V.standardFunction(e,n,((n,r,i)=>{p(i,1,1);let a=i[0];const s={layerDefinition:{geometryType:"",objectIdField:"",globalIdField:"",typeIdField:"",fields:[]},featureSet:{geometryType:"",features:[]}};if(I(a))a=JSON.parse(a),void 0!==a.layerDefinition?(s.layerDefinition=a.layerDefinition,s.featureSet=a.featureSet,a.layerDefinition.spatialReference&&(s.layerDefinition.spatialReference=a.layerDefinition.spatialReference)):(s.featureSet.features=a.features,s.featureSet.geometryType=a.geometryType,s.layerDefinition.geometryType=s.featureSet.geometryType,s.layerDefinition.objectIdField=a.objectIdFieldName,s.layerDefinition.typeIdField=a.typeIdFieldName,s.layerDefinition.globalIdField=a.globalIdFieldName,s.layerDefinition.fields=a.fields,a.spatialReference&&(s.layerDefinition.spatialReference=a.spatialReference));else{if(!(i[0]instanceof t))throw new Error("Invalid Parameter");{a=JSON.parse(i[0].castToText());const e=q(a,"layerdefinition");if(null!==e){s.layerDefinition.geometryType=q(e,"geometrytype",""),s.featureSet.geometryType=s.layerDefinition.geometryType,s.layerDefinition.globalIdField=q(e,"globalidfield",""),s.layerDefinition.objectIdField=q(e,"objectidfield",""),s.layerDefinition.typeIdField=q(e,"typeidfield","");const t=q(e,"spatialreference",null);t&&(s.layerDefinition.spatialReference=Y(t));for(const r of q(e,"fields",[])){const e={name:q(r,"name",""),alias:q(r,"alias",""),type:q(r,"type",""),nullable:q(r,"nullable",!0),editable:q(r,"editable",!0),length:q(r,"length",null),domain:K(q(r,"domain"))};s.layerDefinition.fields.push(e)}const n=q(a,"featureset",null);if(n){const e={};for(const t of s.layerDefinition.fields)e[t.name.toLowerCase()]=t.name;for(const t of q(n,"features",[])){const n={},r=q(t,"attributes",{});for(const t in r)n[e[t.toLowerCase()]]=r[t];s.featureSet.features.push({attributes:n,geometry:Z(q(t,"geometry",null))})}}}else{s.layerDefinition.geometryType=q(a,"geometrytype",""),s.featureSet.geometryType=s.layerDefinition.geometryType,s.layerDefinition.objectIdField=q(a,"objectidfieldname",""),s.layerDefinition.typeIdField=q(a,"typeidfieldname","");const e=q(a,"spatialreference",null);e&&(s.layerDefinition.spatialReference=Y(e));for(const n of q(a,"fields",[])){const e={name:q(n,"name",""),alias:q(n,"alias",""),type:q(n,"type",""),nullable:q(n,"nullable",!0),editable:q(n,"editable",!0),length:q(n,"length",null),domain:K(q(n,"domain"))};s.layerDefinition.fields.push(e)}const t={};for(const n of s.layerDefinition.fields)t[n.name.toLowerCase()]=n.name;for(const n of q(a,"features",[])){const e={},r=q(n,"attributes",{});for(const n in r)e[t[n.toLowerCase()]]=r[n];s.featureSet.features.push({attributes:e,geometry:Z(q(n,"geometry",null))})}}}}if(!1===X(s))throw new Error("Invalid Parameter");return P.create(s,e.spatialReference)}))},V.signatures.push({name:"featureset",min:"1",max:"1"}),V.functions.filter=function(e,t){return V.standardFunctionAsync(e,t,(async(t,n,r)=>{if(p(r,2,2),E(r[0])||D(r[0])){const t=[];let n=r[0];n instanceof m&&(n=n.toArray());let i=null;if(r[1]instanceof d)i=V.arcadeCustomFunctionHandler(r[1]);else if(r[1]instanceof b)i=(...t)=>r[1].fn(e,{preparsed:!0,arguments:t});else{if(!(r[1]instanceof A))throw new Error("Invalid Parameter");i=(...e)=>{if(e.length!==r[1].paramCount)throw new Error("Invalid parameters");return r[1].fn(...e)}}for(const e of n){const n=i(e);H(n)?!0===await n&&t.push(e):!0===n&&t.push(e)}return t}if(w(r[0])){const t=await r[0].load(),n=z.create(r[1],t.getFieldsIndex()),i=n.getVariables();if(i.length>0){const t=[];for(let n=0;n{if(p(n,2,2),w(n[0])){const e=new k(n[1]);return new C({parentfeatureset:n[0],orderbyclause:e})}throw new Error("Order cannot accept this parameter type")}))},V.signatures.push({name:"orderby",min:"2",max:"2"}),V.functions.top=function(e,t){return V.standardFunctionAsync(e,t,(async(e,t,n)=>{if(p(n,2,2),w(n[0]))return new R({parentfeatureset:n[0],topnum:n[1]});if(E(n[0]))return N(n[1])>=n[0].length?n[0].slice(0):n[0].slice(0,N(n[1]));if(D(n[0]))return N(n[1])>=n[0].length()?n[0].slice(0):n[0].slice(0,N(n[1]));throw new Error("Top cannot accept this parameter type")}))},V.signatures.push({name:"top",min:"2",max:"2"}),V.functions.first=function(e,t){return V.standardFunctionAsync(e,t,(async(e,t,r)=>{if(p(r,1,1),w(r[0])){const t=await r[0].first(e.abortSignal);if(null!==t){const e=n.createFromGraphicLikeObject(t.geometry,t.attributes,r[0]);return e._underlyingGraphic=t,e}return t}return E(r[0])?0===r[0].length?null:r[0][0]:D(r[0])?0===r[0].length()?null:r[0].get(0):null}))},V.signatures.push({name:"first",min:"1",max:"1"}),V.functions.attachments=function(e,n){return V.standardFunctionAsync(e,n,(async(n,r,i)=>{p(i,1,2);const a={minsize:-1,maxsize:-1,types:null,returnMetadata:!1};if(i.length>1)if(i[1]instanceof t){if(i[1].hasField("minsize")&&(a.minsize=N(i[1].field("minsize"))),i[1].hasField("metadata")&&(a.returnMetadata=h(i[1].field("metadata"))),i[1].hasField("maxsize")&&(a.maxsize=N(i[1].field("maxsize"))),i[1].hasField("types")){const e=x(i[1].field("types"),!1);e.length>0&&(a.types=e)}}else if(null!==i[1])throw new Error("Invalid Parameter");if(F(i[0])){let t=i[0]._layer;return t instanceof W&&(t=l(t,e.spatialReference,["*"],!0,e.lrucache,e.interceptor)),null===t?[]:!1===w(t)?[]:(await t.load(),t.queryAttachments(i[0].field(t.objectIdField),a.minsize,a.maxsize,a.types,a.returnMetadata))}if(null===i[0])return[];throw new Error("Invalid Parameter")}))},V.signatures.push({name:"attachments",min:"1",max:"2"}),V.functions.featuresetbyrelationshipname=function(e,t){return V.standardFunctionAsync(e,t,(async(t,n,r)=>{p(r,2,4);const i=r[0],a=g(r[1]);let s=y(r[2],null);const o=h(y(r[3],!0));if(null===s&&(s=["*"]),!1===E(s))throw new Error("Invalid Parameter");if(null===r[0])return null;if(!F(r[0]))throw new Error("Invalid Parameter");let c=i._layer;if(c instanceof W&&(c=l(c,e.spatialReference,["*"],!0,e.lrucache,e.interceptor)),null===c)return null;if(!1===w(c))return null;c=await c.load();const d=c.relationshipMetaData().filter((e=>e.name===a));if(0===d.length)return null;if(void 0!==d[0].relationshipTableId&&null!==d[0].relationshipTableId&&d[0].relationshipTableId>-1)return f(c,d[0],i.field(c.objectIdField),c.spatialReference,s,o,e.lrucache,e.interceptor);let m=c.serviceUrl();if(!m)return null;m="/"===m.charAt(m.length-1)?m+d[0].relatedTableId.toString():m+"/"+d[0].relatedTableId.toString();const I=await u(m,c.spatialReference,s,o,e.lrucache,e.interceptor);await I.load();let D=I.relationshipMetaData();if(D=D.filter((e=>e.id===d[0].id)),!1===i.hasField(d[0].keyField)||null===i.field(d[0].keyField)){const e=await c.getFeatureByObjectId(i.field(c.objectIdField),[d[0].keyField]);if(e){const t=z.create(D[0].keyField+"= @id",I.getFieldsIndex());return t.parameters={id:e.attributes[d[0].keyField]},I.filter(t)}return new M({parentfeatureset:I})}const b=z.create(D[0].keyField+"= @id",I.getFieldsIndex());return b.parameters={id:i.field(d[0].keyField)},I.filter(b)}))},V.signatures.push({name:"featuresetbyrelationshipname",min:"2",max:"4"}),V.functions.featuresetbyassociation=function(e,t){return V.standardFunctionAsync(e,t,(async(t,n,r)=>{p(r,2,3);const i=r[0],a=g(y(r[1],"")).toLowerCase(),s=I(r[2])?g(r[2]):null;if(null===r[0])return null;if(!F(r[0]))throw new Error("Invalid Parameter");let o=i._layer;if(o instanceof W&&(o=l(o,e.spatialReference,["*"],!0,e.lrucache,e.interceptor)),null===o)return null;if(!1===w(o))return null;await o.load();const f=o.serviceUrl(),u=await c(f,e.spatialReference);let d=null,m=null,h=!1;if(null!==s&&""!==s&&void 0!==s){for(const e of u.terminals)e.terminalName===s&&(m=e.terminalId);null===m&&(h=!0)}const E=u.associations.getFieldsIndex(),D=E.get("TOGLOBALID").name,b=E.get("FROMGLOBALID").name,A=E.get("TOTERMINALID").name,N=E.get("FROMTERMINALID").name,x=E.get("FROMNETWORKSOURCEID").name,O=E.get("TONETWORKSOURCEID").name,C=E.get("ASSOCIATIONTYPE").name,R=E.get("ISCONTENTVISIBLE").name,M=E.get("OBJECTID").name;for(const e of o.fields)if("global-id"===e.type){d=i.field(e.name);break}let P=null,k=new $(new U({name:"percentalong",alias:"percentalong",type:"double"}),z.create("0",u.associations.getFieldsIndex())),B=new $(new U({name:"side",alias:"side",type:"string"}),z.create("''",u.associations.getFieldsIndex()));const V="globalid",H="globalId",_={};for(const e in u.lkp)_[e]=u.lkp[e].sourceId;const J=new L(new U({name:"classname",alias:"classname",type:"string"}),null,_);let q="";switch(a){case"midspan":{q=`((${D}='${d}') OR ( ${b}='${d}')) AND (${C} IN (5))`,J.codefield=z.create(`CASE WHEN (${D}='${d}') THEN ${x} ELSE ${O} END`,u.associations.getFieldsIndex());const e=G(v.findField(u.associations.fields,b));e.name=V,e.alias=V,P=new $(e,z.create(`CASE WHEN (${b}='${d}') THEN ${D} ELSE ${b} END`,u.associations.getFieldsIndex())),k=u.unVersion>=4?new j(v.findField(u.associations.fields,E.get("PERCENTALONG").name)):new $(new U({name:"percentalong",alias:"percentalong",type:"double"}),z.create("0",u.associations.getFieldsIndex()));break}case"junctionedge":{q=`((${D}='${d}') OR ( ${b}='${d}')) AND (${C} IN (4,6))`,J.codefield=z.create(`CASE WHEN (${D}='${d}') THEN ${x} ELSE ${O} END`,u.associations.getFieldsIndex());const e=G(v.findField(u.associations.fields,b));e.name=V,e.alias=V,P=new $(e,z.create(`CASE WHEN (${b}='${d}') THEN ${D} ELSE ${b} END`,u.associations.getFieldsIndex())),B=new $(new U({name:"side",alias:"side",type:"string"}),z.create(`CASE WHEN (${C}=4) THEN 'from' ELSE 'to' END`,u.associations.getFieldsIndex()));break}case"connected":{let e=`${D}='@T'`,t=`${b}='@T'`;null!==m&&(e+=` AND ${A}=@A`,t+=` AND ${N}=@A`),q="(("+e+") OR ("+t+"))",q=S(q,"@T",d),e=S(e,"@T",d),null!==m&&(e=S(e,"@A",m.toString()),q=S(q,"@A",m.toString())),J.codefield=z.create("CASE WHEN "+e+` THEN ${x} ELSE ${O} END`,u.associations.getFieldsIndex());const n=G(v.findField(u.associations.fields,b));n.name=V,n.alias=V,P=new $(n,z.create("CASE WHEN "+e+` THEN ${b} ELSE ${D} END`,u.associations.getFieldsIndex()));break}case"container":q=`${D}='${d}' AND ${C} = 2`,null!==m&&(q+=` AND ${A} = `+m.toString()),J.codefield=x,q="( "+q+" )",P=new T(v.findField(u.associations.fields,b),V,V);case"content":q=`(${b}='${d}' AND ${C} = 2)`,null!==m&&(q+=` AND ${N} = `+m.toString()),J.codefield=O,q="( "+q+" )",P=new T(v.findField(u.associations.fields,D),V,V);break;case"structure":q=`(${D}='${d}' AND ${C} = 3)`,null!==m&&(q+=` AND ${A} = `+m.toString()),J.codefield=x,q="( "+q+" )",P=new T(v.findField(u.associations.fields,b),V,H);break;case"attached":q=`(${b}='${d}' AND ${C} = 3)`,null!==m&&(q+=` AND ${N} = `+m.toString()),J.codefield=O,q="( "+q+" )",P=new T(v.findField(u.associations.fields,D),V,H);break;default:throw new Error("Invalid Parameter")}h&&(q="1 <> 1");return new v({parentfeatureset:u.associations,adaptedFields:[new j(v.findField(u.associations.fields,M)),new j(v.findField(u.associations.fields,R)),P,B,J,k],extraFilter:q?z.create(q,u.associations.getFieldsIndex()):null})}))},V.signatures.push({name:"featuresetbyassociation",min:"2",max:"6"}),V.functions.groupby=function(e,n){return V.standardFunctionAsync(e,n,(async(n,r,i)=>{if(p(i,3,3),!w(i[0]))throw new Error("Illegal Value: GroupBy");const a=await i[0].load(),s=[],o=[];let l=!1,f=[];if(I(i[1]))f.push(i[1]);else if(i[1]instanceof t)f.push(i[1]);else if(E(i[1]))f=i[1];else{if(!D(i[1]))throw new Error("Illegal Value: GroupBy");f=i[1].toArray()}for(const e of f)if(I(e)){const t=z.create(g(e),a.getFieldsIndex()),n=!0===B(t)?g(e):"%%%%FIELDNAME";s.push({name:n,expression:t}),"%%%%FIELDNAME"===n&&(l=!0)}else{if(!(e instanceof t))throw new Error("Illegal Value: GroupBy");{const t=e.hasField("name")?e.field("name"):"%%%%FIELDNAME",n=e.hasField("expression")?e.field("expression"):"";if("%%%%FIELDNAME"===t&&(l=!0),!t)throw new Error("Illegal Value: GroupBy");s.push({name:t,expression:z.create(n||t,a.getFieldsIndex())})}}if(f=[],I(i[2]))f.push(i[2]);else if(E(i[2]))f=i[2];else if(D(i[2]))f=i[2].toArray();else{if(!(i[2]instanceof t))throw new Error("Illegal Value: GroupBy");f.push(i[2])}for(const e of f){if(!(e instanceof t))throw new Error("Illegal Value: GroupBy");{const t=e.hasField("name")?e.field("name"):"",n=e.hasField("statistic")?e.field("statistic"):"",r=e.hasField("expression")?e.field("expression"):"";if(!t||!n||!r)throw new Error("Illegal Value: GroupBy");o.push({name:t,statistic:n.toLowerCase(),expression:z.create(r,a.getFieldsIndex())})}}if(l){const e={};for(const n of a.fields)e[n.name.toLowerCase()]=1;for(const n of s)"%%%%FIELDNAME"!==n.name&&(e[n.name.toLowerCase()]=1);for(const n of o)"%%%%FIELDNAME"!==n.name&&(e[n.name.toLowerCase()]=1);let t=0;for(const n of s)if("%%%%FIELDNAME"===n.name){for(;1===e["field_"+t.toString()];)t++;e["field_"+t.toString()]=1,n.name="FIELD_"+t.toString()}}for(const t of s)await J(t.expression,V,e);for(const t of o)await J(t.expression,V,e);return i[0].groupby(s,o)}))},V.signatures.push({name:"groupby",min:"3",max:"3"}),V.functions.distinct=function(e,n){return V.standardFunctionAsync(e,n,(async(n,r,i)=>{if(w(i[0])){p(i,2,2);const n=await i[0].load(),r=[];let a=[];if(I(i[1]))a.push(i[1]);else if(i[1]instanceof t)a.push(i[1]);else if(E(i[1]))a=i[1];else{if(!D(i[1]))throw new Error("Illegal Value: GroupBy");a=i[1].toArray()}let s=!1;for(const e of a)if(I(e)){const t=z.create(g(e),n.getFieldsIndex()),i=!0===B(t)?g(e):"%%%%FIELDNAME";r.push({name:i,expression:t}),"%%%%FIELDNAME"===i&&(s=!0)}else{if(!(e instanceof t))throw new Error("Illegal Value: GroupBy");{const t=e.hasField("name")?e.field("name"):"%%%%FIELDNAME",i=e.hasField("expression")?e.field("expression"):"";if("%%%%FIELDNAME"===t&&(s=!0),!t)throw new Error("Illegal Value: GroupBy");r.push({name:t,expression:z.create(i||t,n.getFieldsIndex())})}}if(s){const e={};for(const r of n.fields)e[r.name.toLowerCase()]=1;for(const n of r)"%%%%FIELDNAME"!==n.name&&(e[n.name.toLowerCase()]=1);let t=0;for(const n of r)if("%%%%FIELDNAME"===n.name){for(;1===e["field_"+t.toString()];)t++;e["field_"+t.toString()]=1,n.name="FIELD_"+t.toString()}}for(const t of r)await J(t.expression,V,e);return i[0].groupby(r,[])}return _("distinct",n,r,i)}))})}export{ee as registerFunctions};