UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

3 lines (2 loc) • 14.8 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import{ArcadeDate as e}from"../../ArcadeDate.js";import{isDate as r,isLuxonDate as t,isArcadeTime as a,isArcadeDate as s,isArcadeDateOnly as n}from"./shared.js";import{SqlError as c}from"../../../core/sql/errorSupport.js";import{TimeOnly as i}from"../../../core/sql/TimeOnly.js";import o from"../../../core/sql/WhereClause.js";import{DateTime as u}from"luxon";function l(e,r){return g(e?.parseTree,r,e?.parameters)}function f(e,r,t){return g(e,r,t)}function m(e,r,t,a){const s=g(e.parseTree,0,e.parameters,r,t);return o.create(s,{fieldsIndex:a,timeZone:e.timeZone,currentUser:e.currentUser})}function p(e,r,t="AND"){return o.create("(("+l(e,0)+")"+t+"("+l(r,0)+"))",{fieldsIndex:e.fieldsIndex,timeZone:e.timeZone,currentUser:e.currentUser})}function d(e){return!0===e.delimited?`"${e.column.split('"').join('""')}"`:e.column}function g(e,i,o,u=null,l=null){let f,m,p,L;switch(e.type){case"interval":return C(g(e.value,i,o,u,l),e.qualifier,e.op);case"case-expression":{let r=" CASE ";"simple"===e.format&&(r+=g(e.operand,i,o,u,l));for(let t=0;t<e.clauses.length;t++)r+=" WHEN "+g(e.clauses[t].operand,i,o,u,l)+" THEN "+g(e.clauses[t].value,i,o,u,l);return null!==e.else&&(r+=" ELSE "+g(e.else,i,o,u,l)),r+=" END ",r}case"parameter":{const c=o[e.value.toLowerCase()];if("string"==typeof c){return"'"+o[e.value.toLowerCase()].toString().replaceAll("'","''")+"'"}if(r(c))return A(c,i);if(t(c))return A(c,i);if(a(c))return E(c,i);if(s(c))return y(c,i);if(n(c))return T(c,i);if(Array.isArray(c)){const e=[];for(let o=0;o<c.length;o++)"string"==typeof c[o]?e.push("'"+c[o].toString().replaceAll("'","''")+"'"):r(c[o])||t(c[o])?e.push(A(c[o],i)):a(c[o])?e.push(E(c[o],i)):s(c[o])?e.push(y(c[o],i)):n(c[o])?e.push(T(c[o],i)):e.push(c[o].toString());return e}return c.toString()}case"expression-list":m=[];for(const r of e.value)m.push(g(r,i,o,u,l));return m;case"unary-expression":return" ( NOT "+g(e.expr,i,o,u,l)+" ) ";case"binary-expression":switch(e.operator){case"AND":return" ("+g(e.left,i,o,u,l)+" AND "+g(e.right,i,o,u,l)+") ";case"OR":return" ("+g(e.left,i,o,u,l)+" OR "+g(e.right,i,o,u,l)+") ";case"IS":if("null"!==e.right.type)throw new c("UnsupportedIsRhs");return" ("+g(e.left,i,o,u,l)+" IS NULL )";case"ISNOT":if("null"!==e.right.type)throw new c("UnsupportedIsRhs");return" ("+g(e.left,i,o,u,l)+" IS NOT NULL )";case"IN":return f=[],"expression-list"===e.right.type?(f=g(e.right,i,o,u,l)," ("+g(e.left,i,o,u,l)+" IN ("+f.join(",")+")) "):(L=g(e.right,i,o,u,l),Array.isArray(L)?" ("+g(e.left,i,o,u,l)+" IN ("+L.join(",")+")) ":" ("+g(e.left,i,o,u,l)+" IN ("+L+")) ");case"NOT IN":return f=[],"expression-list"===e.right.type?(f=g(e.right,i,o,u,l)," ("+g(e.left,i,o,u,l)+" NOT IN ("+f.join(",")+")) "):(L=g(e.right,i,o,u,l),Array.isArray(L)?" ("+g(e.left,i,o,u,l)+" NOT IN ("+L.join(",")+")) ":" ("+g(e.left,i,o,u,l)+" NOT IN ("+L+")) ");case"BETWEEN":return p=g(e.right,i,o,u,l)," ("+g(e.left,i,o,u,l)+" BETWEEN "+p[0]+" AND "+p[1]+" ) ";case"NOTBETWEEN":return p=g(e.right,i,o,u,l)," ("+g(e.left,i,o,u,l)+" NOT BETWEEN "+p[0]+" AND "+p[1]+" ) ";case"LIKE":return""!==e.escape?" ("+g(e.left,i,o,u,l)+" LIKE "+g(e.right,i,o,u,l)+" ESCAPE '"+e.escape+"') ":" ("+g(e.left,i,o,u,l)+" LIKE "+g(e.right,i,o,u,l)+") ";case"NOT LIKE":return""!==e.escape?" ("+g(e.left,i,o,u,l)+" NOT LIKE "+g(e.right,i,o,u,l)+" ESCAPE '"+e.escape+"') ":" ("+g(e.left,i,o,u,l)+" NOT LIKE "+g(e.right,i,o,u,l)+") ";case"<>":case"<":case">":case">=":case"<=":case"=":case"*":case"-":case"+":case"/":return" ("+g(e.left,i,o,u,l)+" "+e.operator+" "+g(e.right,i,o,u,l)+") ";case"||":return" ("+g(e.left,i,o,u,l)+" "+(2===i?"+":e.operator)+" "+g(e.right,i,o,u,l)+") "}throw new c("UnsupportedOperator",{operator:e.operator});case"null":return"null";case"boolean":return!0===e.value?"1":"0";case"string":return"'"+e.value.toString().replaceAll("'","''")+"'";case"timestamp":return`timestamp '${e.value}'`;case"date":return`date '${e.value}'`;case"time":return`time '${e.value}'`;case"number":return e.value.toString();case"current-time":return w(e.mode,i);case"current-user":return"CURRENT_USER";case"column-reference":return u&&u.toLowerCase()===e.column.toLowerCase()?"("+l+")":d(e);case"data-type":return e.value;case"function":{const r=g(e.args,i,o,u,l);return h(e.name,r,i)}}throw new c("UnsupportedSyntax",{node:e.type})}function h(e,r,t){switch(e.toLowerCase().trim()){case"cos":case"sin":case"tan":case"cosh":case"tanh":case"sinh":case"acos":case"asin":case"atan":case"floor":case"log10":case"log":case"abs":if(1!==r.length)throw new c("InvalidFunctionParameters",{function:e.toLowerCase().trim()});return`${e.toUpperCase().trim()}(${r[0]})`;case"ceiling":case"ceil":if(1!==r.length)throw new c("InvalidFunctionParameters",{function:"ceiling"});return"CEILING("+r[0]+")";case"mod":case"power":case"nullif":if(2!==r.length)throw new c("InvalidFunctionParameters",{function:e.toLowerCase().trim()});return`${e.toUpperCase().trim()}(${r[0]},${r[1]})`;case"round":if(2===r.length)return"ROUND("+r[0]+","+r[1]+")";if(1===r.length)return"ROUND("+r[0]+")";throw new c("InvalidFunctionParameters",{function:"round"});case"truncate":if(r.length<1||r.length>2)throw new c("InvalidFunctionParameters",{function:"truncate"});return 2===t?"ROUND("+r[0]+(1===r.length?"0":","+r[1])+",1)":"TRUNCATE("+r[0]+(1===r.length?")":","+r[1]+")");case"char_length":case"len":if(1!==r.length)throw new c("InvalidFunctionParameters",{function:"char_length"});switch(t){case 2:return"LEN("+r[0]+")";case 3:return"LENGTH("+r[0]+")";default:return"CHAR_LENGTH("+r[0]+")"}case"coalesce":case"concat":{if(r.length<1)throw new c("InvalidFunctionParameters",{function:e.toLowerCase()});let t=e.toUpperCase().trim()+"(";for(let e=0;e<r.length;e++)0!==e&&(t+=","),t+=r[e];return t+=")",t}case"lower":case"lcase":if(1!==r.length)throw new c("InvalidFunctionParameters",{function:"lower"});return"LOWER("+r[0]+")";case"upper":case"ucase":if(1!==r.length)throw new c("InvalidFunctionParameters",{function:"upper"});return"UPPER("+r[0]+")";case"substring":{let e="";switch(t){case 3:return e="SUBSTR("+r[0]+","+r[1],3===r.length&&(e+=","+r[2]),e+=")",e;case 2:return e=3===r.length?"SUBSTRING("+r[0]+","+r[1]+","+r[2]+")":"SUBSTRING("+r[0]+", "+r[1]+", LEN("+r[0]+") - "+r[1]+")",e;default:return e="SUBSTRING("+r[0]+" FROM "+r[1],3===r.length&&(e+=" FOR "+r[2]),e+=")",e}}case"extract":return"EXTRACT("+r[0].replaceAll("'","")+" FROM "+r[1]+")";case"cast":{let e="";switch(t){case 3:switch(r[1].type){case"date":e="DATE";break;case"float":e="DOUBLE";break;case"integer":e="INTEGER";break;case"real":e="REAL";break;case"smallint":e="SMALLINT";break;case"timestamp":e="TIMESTAMP";break;case"varchar":e="VARCHAR("+r[1].size.toString()+")"}return`CAST(${r[0]} AS ${e})`;case 4:switch(r[1].type){case"date":e="DATE";break;case"float":e="DOUBLE PRECISION";break;case"integer":e="INT";break;case"real":e="REAL";break;case"smallint":e="SMALLINT";break;case"timestamp":e="TIMESTAMP";break;case"varchar":e="VARCHAR("+r[1].size.toString()+")"}return`CAST(${r[0]} AS ${e})`;case 2:switch(r[1].type){case"date":e="DATE";break;case"float":e="FLOAT";break;case"integer":e="INT";break;case"real":e="REAL";break;case"smallint":e="SMALLINT";break;case"timestamp":e="DATETIME";break;case"varchar":e="VARCHAR("+r[1].size.toString()+")"}return`CAST(${r[0]} AS ${e})`;default:switch(r[1].type){case"date":e="DATE";break;case"float":e="FLOAT";break;case"integer":e="INTEGER";break;case"real":e="REAL";break;case"smallint":e="SMALLINT";break;case"timestamp":e="TIMESTAMP";break;case"varchar":e="VARCHAR("+r[1].size.toString()+")"}return`CAST(${r[0]} AS ${e})`}}}throw new c("InvalidFunctionParameters",{function:e})}function y(e,r){const t=e.toDateTime(),a=0===t.hour&&0===t.minute&&0===t.second&&0===t.millisecond;switch(r){case 6:case 0:case 1:return a?`date '${t.toFormat("yyyy-LL-dd")}'`:`timestamp '${t.toFormat("yyyy-LL-dd HH:mm:ss")}'`;case 3:return a?`TO_DATE('${t.toFormat("yyyy-LL-dd")}','YYYY-MM-DD')`:`TO_DATE('${t.toFormat("yyyy-LL-dd HH:mm:ss")}','YYYY-MM-DD HH24:MI:SS')`;case 2:return`'${t.toFormat(a?"yyyy-LL-dd":"yyyy-LL-dd HH:mm:ss")}'`;case 5:return`#${t.toFormat(a?"LL-dd-yyyy":"LL-dd-yyyy HH:mm:ss")}#`;case 4:return`TIMESTAMP '${t.toFormat(a?"yyyy-LL-dd":"yyyy-LL-dd HH:mm:ss")}'`;default:return`timestamp '${t.toFormat("yyyy-LL-dd HH:mm:ss")}'`}}function T(e,r){switch(r){case 6:case 0:case 1:default:return e.toSQLWithKeyword();case 3:return`TO_DATE('${e.toFormat("Y-MM-DD")}'`;case 2:return`'${e.toFormat("Y-MM-DD")}'`;case 5:return`#${e.toFormat("Y-MM-DD")}#`;case 4:return`TIMESTAMP '${e.toFormat("Y-MM-DD")}'`}}function E(e,r){switch(e instanceof i&&(e=e.toStorageString()),r){case 3:return`TO_DATE('${e}', 'HH24:MI:SS')`;case 2:return`'${e}'`;default:return`time '${e}'`}}function A(r,a){return y(e.dateTimeToArcadeDate(t(r)?r:u.fromJSDate(r)),a)}function w(e,r){switch(r){case 6:case 0:case 1:case 3:case 5:default:return"date"===e?"CURRENT_DATE":"time"===e?"CURRENT_TIME":"CURRENT_TIMESTAMP";case 2:return"date"===e?"CAST(GETDATE() AS DATE)":"time"===e?"CAST(GETDATE() AS TIME)":"GETDATE()";case 4:return"date"===e?"CURRENT_DATE":"time"===e?"LOCALTIME":"CURRENT_TIMESTAMP"}}function L(e,r,t={}){const a={},s={},n={esriFieldTypeSmallInteger:"integer",esriFieldTypeInteger:"integer",esriFieldTypeBigInteger:"integer",esriFieldTypeSingle:"double",esriFieldTypeDouble:"double",esriFieldTypeString:"string",esriFieldTypeTimeOnly:"time-only",esriFieldTypeDateOnly:"date-only",esriFieldTypeTimestampOffset:"timestamp-offset",esriFieldTypeDate:"date",esriFieldTypeOID:"integer",esriFieldTypeGUID:"guid",esriFieldTypeGlobalID:"guid",oid:"integer",long:"integer","small-integer":"integer",integer:"integer","big-integer":"integer",single:"double","time-only":"time-only","date-only":"date-only","timestamp-offset":"timestemp-offset",double:"double",date:"date",guid:"guid","global-id":"guid",string:"string"};for(const c of r){const e=c.type?n[c.type]:void 0;a[c.name.toLowerCase()]=void 0===e?"":e}for(const c in t){const e=n[t[c]];s[c.toLowerCase()]=void 0===e?"":e}switch(I(a,e.parseTree,e.parameters,s)){case"double":return"double";case"integer":return"integer";case"date":return"date";case"date-only":return"date-only";case"time-only":return"time-only";case"timestamp-offset":return"timestamp-offset";case"string":return"string";case"global-id":case"guid":return"guid"}return""}function I(e,t,i,o){let u;switch(t.type){case"interval":return"integer";case"case-expression":{const r=[];if("simple"===t.format){for(let a=0;a<t.clauses.length;a++)r.push(I(e,t.clauses[a].value,i,o));null!==t.else&&r.push(I(e,t.else,i,o))}else{for(let a=0;a<t.clauses.length;a++)r.push(I(e,t.clauses[a].value,i,o));null!==t.else&&r.push(I(e,t.else,i,o))}return S(r)}case"parameter":{const e=o[t.value.toLowerCase()];if(void 0===e&&i){const e=i[t.value.toLowerCase()];if(void 0===e)return"";if(null===e)return"";if("string"==typeof e||e instanceof String)return"string";if("boolean"==typeof e)return"boolean";if(r(e))return"date";if(s(e))return"date";if(n(e))return"date-only";if(a(e))return"time-only";if("number"==typeof e)return e%1==0?"integer":"double"}return void 0===e?"":e}case"expression-list":{const r=[];for(const a of t.value)r.push(I(e,a,i,o));return r}case"unary-expression":return"boolean";case"binary-expression":switch(t.operator){case"AND":case"OR":case"IN":case"NOT IN":case"BETWEEN":case"NOTBETWEEN":case"LIKE":case"NOT LIKE":case"<>":case"<":case">":case">=":case"<=":case"=":return"boolean";case"IS":case"ISNOT":if("null"!==t.right.type)throw new c("UnsupportedIsRhs");return"boolean";case"*":case"-":case"+":case"/":return S([I(e,t.left,i,o),I(e,t.right,i,o)]);case"||":return"string";default:throw new c("UnsupportedOperator",{operator:t.operator})}case"null":return"";case"boolean":return"boolean";case"string":return"string";case"number":return null===t.value?"":t.value%1==0?"integer":"double";case"date":return"date";case"timestamp":return t.withtimezone?"timestamp-offset":"date";case"time":return"time-only";case"current-time":return"time"===t.mode?"time-only":"date";case"current-user":return"string";case"column-reference":{const r=e[t.column.toLowerCase()];return void 0===r?"":r}case"function":switch(t.name.toLowerCase()){case"cast":switch(t.args?.value[1]?.value.type??""){case"integer":case"smallint":return"integer";case"real":case"float":return"double";case"date":case"timestamp":return!0===t.args?.value[1]?.value?.withtimezone?"timestamp-offset":"date";case"time":return"time-only";case"varchar":return"string";default:return""}case"position":case"extract":case"char_length":case"mod":return"integer";case"round":if(u=I(e,t.args,i,o),Array.isArray(u)){if(u.length<=0)return"double";u=u[0]}return u;case"sign":return"integer";case"ceiling":case"floor":case"abs":return u=I(e,t.args,i,o),Array.isArray(u)&&(u=S(u)),"integer"===u||"double"===u?u:"double";case"area":case"length":case"log":case"log10":case"sin":case"cos":case"tan":case"asin":case"acos":case"atan":case"cosh":case"sinh":case"tanh":case"power":return"double";case"substring":case"trim":case"concat":case"lower":case"upper":return"string";case"truncate":return"double";case"nullif":case"coalesce":return u=I(e,t.args,i,o),Array.isArray(u)?u.length>0?u[0]:"":u}return""}throw new c("UnsupportedSyntax",{node:t.type})}const N={boolean:1,string:2,integer:3,double:4,date:5};function S(e){if(e){let r="";for(const t of e)""!==t&&(r=""===r||N[r]<N[t]?t:r);return r}return""}function b(e,r){return R(e.parseTree,r)}function v(e){return"column-reference"===e?.parseTree.type}function R(e,r){if(null==e)return!1;switch(e.type){case"when-clause":return R(e.operand,r)||R(e.value,r);case"case-expression":for(const t of e.clauses)if(R(t,r))return!0;return!("simple"!==e.format||!R(e.operand,r))||!(null===e.else||!R(e.else,r));case"parameter":case"null":case"boolean":case"date":case"timestamp":case"time":case"string":case"number":return!1;case"expression-list":for(const t of e.value)if(R(t,r))return!0;return!1;case"unary-expression":return R(e.expr,r);case"binary-expression":return R(e.left,r)||R(e.right,r);case"column-reference":return r.toLowerCase()===e.column.toLowerCase();case"function":return R(e.args,r)}return!1}function D(e){let r="";return r+=e.period.toUpperCase(),r}function C(e,r,t){let a="";return a="interval-period"===r.type?D(r):D(r.start)+" TO "+D(r.end),"INTERVAL "+t+" "+e+" "+a}export{T as arcadeDateOnlyToSqlString,y as arcadeDateToSqlString,p as combine,d as convertColumnReferenceToSql,C as convertIntervalToSql,v as isSingleField,A as makeSqlFromDateTimeParameter,E as makeTimeString,w as makeToday,L as predictType,m as reformulateWithoutField,b as scanForField,l as toWhereClause,f as toWhereClauseFromTree,h as translateFunctionToDatabaseSpecific};