UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 14.6 kB
import{ArcadeDate as e}from"../../ArcadeDate.js";import{FeatureServiceDatabaseType as r,isDate as t,isArcadeDate as a}from"./shared.js";import{WhereClause as n}from"../../../core/sql/WhereClause.js";import{SqlError as s,SqlErrorCodes as c}from"./errorsupport.js";import{convertTimeReference as o}from"../../arcadeTimeUtils.js";import{DateTime as i}from"luxon";function u(e,r){return y(e?.parseTree,r,e?.parameters)}function l(e,r,t,a){return d(n.create(e,r.fieldsIndex),t,a)}function d(e,t,a){const n=o(t),s=o(a);return y(e.parseTree,r.Standardised,null,null,null,{inputTimeReference:n,outputTimeReference:s})}function f(e,r,t){return y(e,r,t)}function p(e,t,a,s){return n.create(y(e.parseTree,r.Standardised,e.parameters,t,a),s)}function m(e,t,a="AND"){return n.create("(("+u(e,r.Standardised)+")"+a+"("+u(t,r.Standardised)+"))",e.fieldsIndex)}function y(e,n,o,i=null,u=null,l=null){let d,f,p,m;switch(e.type){case"interval":return R(y(e.value,n,o,i,u,l),e.qualifier,e.op);case"case-expression":{let r=" CASE ";"simple"===e.format&&(r+=y(e.operand,n,o,i,u,l));for(let t=0;t<e.clauses.length;t++)r+=" WHEN "+y(e.clauses[t].operand,n,o,i,u,l)+" THEN "+y(e.clauses[t].value,n,o,i,u,l);return null!==e.else&&(r+=" ELSE "+y(e.else,n,o,i,u,l)),r+=" END ",r}case"parameter":{const r=o[e.value.toLowerCase()];if("string"==typeof r){return"'"+o[e.value.toLowerCase()].toString().replace(/'/g,"''")+"'"}if(t(r))return T(r,n,l);if(a(r))return h(r,n,l);if(r instanceof Array){const e=[];for(let s=0;s<r.length;s++)"string"==typeof r[s]?e.push("'"+r[s].toString().replace(/'/g,"''")+"'"):t(r[s])?e.push(T(r[s],n,l)):a(r[s])?e.push(h(r[s],n,l)):e.push(r[s].toString());return e}return r.toString()}case"expression-list":f=[];for(const r of e.value)f.push(y(r,n,o,i,u,l));return f;case"unary-expression":return" ( NOT "+y(e.expr,n,o,i,u,l)+" ) ";case"binary-expression":switch(e.operator){case"AND":return" ("+y(e.left,n,o,i,u,l)+" AND "+y(e.right,n,o,i,u,l)+") ";case"OR":return" ("+y(e.left,n,o,i,u,l)+" OR "+y(e.right,n,o,i,u,l)+") ";case"IS":if("null"!==e.right.type)throw new s(c.UnsupportedIsRhs);return" ("+y(e.left,n,o,i,u,l)+" IS NULL )";case"ISNOT":if("null"!==e.right.type)throw new s(c.UnsupportedIsRhs);return" ("+y(e.left,n,o,i,u,l)+" IS NOT NULL )";case"IN":return d=[],"expression-list"===e.right.type?(d=y(e.right,n,o,i,u)," ("+y(e.left,n,o,i,u,l)+" IN ("+d.join(",")+")) "):(m=y(e.right,n,o,i,u,l),m instanceof Array?" ("+y(e.left,n,o,i,u,l)+" IN ("+m.join(",")+")) ":" ("+y(e.left,n,o,i,u,l)+" IN ("+m+")) ");case"NOT IN":return d=[],"expression-list"===e.right.type?(d=y(e.right,n,o,i,u)," ("+y(e.left,n,o,i,u,l)+" NOT IN ("+d.join(",")+")) "):(m=y(e.right,n,o,i,u,l),m instanceof Array?" ("+y(e.left,n,o,i,u,l)+" NOT IN ("+m.join(",")+")) ":" ("+y(e.left,n,o,i,u,l)+" NOT IN ("+m+")) ");case"BETWEEN":return p=y(e.right,n,o,i,u,l)," ("+y(e.left,n,o,i,u,l)+" BETWEEN "+p[0]+" AND "+p[1]+" ) ";case"NOTBETWEEN":return p=y(e.right,n,o,i,u,l)," ("+y(e.left,n,o,i,u,l)+" NOT BETWEEN "+p[0]+" AND "+p[1]+" ) ";case"LIKE":return""!==e.escape?" ("+y(e.left,n,o,i,u,l)+" LIKE "+y(e.right,n,o,i,u,l)+" ESCAPE '"+e.escape+"') ":" ("+y(e.left,n,o,i,u,l)+" LIKE "+y(e.right,n,o,i,u,l)+") ";case"NOT LIKE":return""!==e.escape?" ("+y(e.left,n,o,i,u,l)+" NOT LIKE "+y(e.right,n,o,i,u,l)+" ESCAPE '"+e.escape+"') ":" ("+y(e.left,n,o,i,u,l)+" NOT LIKE "+y(e.right,n,o,i,u,l)+") ";case"<>":case"<":case">":case">=":case"<=":case"=":case"*":case"-":case"+":case"/":return" ("+y(e.left,n,o,i,u,l)+" "+e.operator+" "+y(e.right,n,o,i,u,l)+") ";case"||":return" ("+y(e.left,n,o,i,u,l)+" "+(n===r.SqlServer?"+":e.operator)+" "+y(e.right,n,o,i,u,l)+") "}throw new s(c.UnsupportedOperator,{operator:e.operator});case"null":return"null";case"boolean":return!0===e.value?"1":"0";case"string":return"'"+e.value.toString().replace(/'/g,"''")+"'";case"timestamp":case"date":return T(e.value,n,l);case"number":return e.value.toString();case"current-time":return L("date"===e.mode,n);case"column-reference":return i&&i.toLowerCase()===e.column.toLowerCase()?"("+u+")":e.column;case"data-type":return e.value;case"function":{const r=y(e.args,n,o,i,u,l);return g(e.name,r,n)}}throw new s(c.UnsupportedSyntax,{node:e.type})}function g(e,t,a){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!==t.length)throw new s(c.InvalidFunctionParameters,{function:e.toLowerCase().trim()});return`${e.toUpperCase().trim()}(${t[0]})`;case"ceiling":case"ceil":if(1!==t.length)throw new s(c.InvalidFunctionParameters,{function:"ceiling"});switch(a){case r.Standardised:case r.StandardisedNoInterval:}return"CEILING("+t[0]+")";case"mod":case"power":case"nullif":if(2!==t.length)throw new s(c.InvalidFunctionParameters,{function:e.toLowerCase().trim()});return`${e.toUpperCase().trim()}(${t[0]},${t[1]})`;case"round":if(2===t.length)return"ROUND("+t[0]+","+t[1]+")";if(1===t.length)return"ROUND("+t[0]+")";throw new s(c.InvalidFunctionParameters,{function:"round"});case"truncate":if(t.length<1||t.length>2)throw new s(c.InvalidFunctionParameters,{function:"truncate"});return a===r.SqlServer?"ROUND("+t[0]+(1===t.length?"0":","+t[1])+",1)":"TRUNCATE("+t[0]+(1===t.length?")":","+t[1]+")");case"char_length":case"len":if(1!==t.length)throw new s(c.InvalidFunctionParameters,{function:"char_length"});switch(a){case r.SqlServer:return"LEN("+t[0]+")";case r.Oracle:return"LENGTH("+t[0]+")";default:return"CHAR_LENGTH("+t[0]+")"}case"coalesce":case"concat":{if(t.length<1)throw new s(c.InvalidFunctionParameters,{function:e.toLowerCase()});let r=e.toUpperCase().trim()+"(";for(let e=0;e<t.length;e++)0!==e&&(r+=","),r+=t[e];return r+=")",r}case"lower":case"lcase":if(1!==t.length)throw new s(c.InvalidFunctionParameters,{function:"lower"});return"LOWER("+t[0]+")";case"upper":case"ucase":if(1!==t.length)throw new s(c.InvalidFunctionParameters,{function:"upper"});return"UPPER("+t[0]+")";case"substring":{let e="";switch(a){case r.Oracle:return e="SUBSTR("+t[0]+","+t[1],3===t.length&&(e+=","+t[2]),e+=")",e;case r.SqlServer:return e=3===t.length?"SUBSTRING("+t[0]+","+t[1]+","+t[2]+")":"SUBSTRING("+t[0]+", "+t[1]+", LEN("+t[0]+") - "+t[1]+")",e;default:return e="SUBSTRING("+t[0]+" FROM "+t[1],3===t.length&&(e+=" FOR "+t[2]),e+=")",e}}case"extract":return"EXTRACT("+t[0].replace(/\'/g,"")+" FROM "+t[1]+")";case"cast":{let e="";switch(a){case r.Oracle:switch(t[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("+t[1].size.toString()+")"}return`CAST(${t[0]} AS ${e})`;case r.Postgres:switch(t[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("+t[1].size.toString()+")"}return`CAST(${t[0]} AS ${e})`;case r.SqlServer:switch(t[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("+t[1].size.toString()+")"}return`CAST(${t[0]} AS ${e})`;default:switch(t[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("+t[1].size.toString()+")"}return`CAST(${t[0]} AS ${e})`}}}throw new s(c.InvalidFunctionParameters,{function:e})}function h(t,a,n,s){n?.outputTimeReference&&(t=e.arcadeDateAndZoneToArcadeDate(t,n?.outputTimeReference));const c=t.toDateTime(),o=0===c.hour&&0===c.minute&&0===c.second&&0===c.millisecond;switch(a){case r.FILEGDB:case r.Standardised:case r.StandardisedNoInterval:return o?`date '${c.toFormat("yyyy-LL-dd")}'`:`date '${c.toFormat("yyyy-LL-dd HH:mm:ss")}'`;case r.Oracle:return o?`TO_DATE('${c.toFormat("yyyy-LL-dd")}','YYYY-MM-DD')`:`TO_DATE('${c.toFormat("yyyy-LL-dd HH:mm:ss")}','YYYY-MM-DD HH24:MI:SS')`;case r.SqlServer:return`'${c.toFormat(o?"yyyy-LL-dd":"yyyy-LL-dd HH:mm:ss")}'`;case r.PGDB:return`#${c.toFormat(o?"LL-dd-yyyy":"LL-dd-yyyy HH:mm:ss")}#`;case r.Postgres:return`TIMESTAMP '${c.toFormat(o?"yyyy-LL-dd":"yyyy-LL-dd HH:mm:ss")}'`;default:return`date '${c.toFormat("yyyy-LL-dd HH:mm:ss")}'`}}function T(e,a,n,s){let c=t(e)?i.fromJSDate(e):i.fromSQL(e);const o=0===c.hour&&0===c.minute&&0===c.second&&0===c.millisecond;switch(n?.inputTimeReference&&(c=i.fromObject({day:c.day,year:c.year,month:c.month,hour:c.hour,minute:c.minute,second:c.second,millisecond:c.millisecond},{zone:n.inputTimeReference})),n?.outputTimeReference&&(c=c.setZone(n.outputTimeReference)),a){case r.FILEGDB:case r.Standardised:case r.StandardisedNoInterval:return o?`date '${c.toFormat("yyyy-LL-dd")}'`:`date '${c.toFormat("yyyy-LL-dd HH:mm:ss")}'`;case r.Oracle:return o?`TO_DATE('${c.toFormat("yyyy-LL-dd")}','YYYY-MM-DD')`:`TO_DATE('${c.toFormat("yyyy-LL-dd HH:mm:ss")}','YYYY-MM-DD HH24:MI:SS')`;case r.SqlServer:return`'${c.toFormat(o?"yyyy-LL-dd":"yyyy-LL-dd HH:mm:ss")}'`;case r.PGDB:return`#${c.toFormat(o?"LL-dd-yyyy":"LL-dd-yyyy HH:mm:ss")}#`;case r.Postgres:return`TIMESTAMP '${c.toFormat(o?"yyyy-LL-dd":"yyyy-LL-dd HH:mm:ss")}'`;default:return`date '${c.toFormat("yyyy-LL-dd HH:mm:ss")}'`}}function L(e,t){switch(t){case r.FILEGDB:case r.Standardised:case r.StandardisedNoInterval:case r.Oracle:return e?"CURRENT_DATE":"CURRENT_TIMESTAMP";case r.SqlServer:return e?"CAST(GETDATE() AS DATE)":"GETDATE()";case r.PGDB:case r.Postgres:default:return e?"CURRENT_DATE":"CURRENT_TIMESTAMP"}}function S(e,r,t={}){const a={},n={},s={esriFieldTypeSmallInteger:"integer",esriFieldTypeInteger:"integer",esriFieldTypeSingle:"double",esriFieldTypeDouble:"double",esriFieldTypeString:"string",esriFieldTypeDate:"date",esriFieldTypeOID:"integer",esriFieldTypeGUID:"guid",esriFieldTypeGlobalID:"guid",oid:"integer",long:"integer","small-integer":"integer",integer:"integer",single:"double",double:"double",date:"date",guid:"guid",globalid:"guid",string:"string"};for(const c of r){const e=c.type?s[c.type]:void 0;a[c.name.toLowerCase()]=void 0===e?"":e}for(const c in t){const e=s[t[c]];n[c.toLowerCase()]=void 0===e?"":e}switch(E(a,e.parseTree,e.parameters,n)){case"double":return"double";case"integer":return"integer";case"date":return"date";case"string":return"string";case"global-id":case"guid":return"guid"}return""}function E(e,r,n,o){let i;switch(r.type){case"interval":return"integer";case"case-expression":{const t=[];if("simple"===r.format){for(let a=0;a<r.clauses.length;a++)t.push(E(e,r.clauses[a].value,n,o));null!==r.else&&t.push(E(e,r.else,n,o))}else{for(let a=0;a<r.clauses.length;a++)t.push(E(e,r.else,n,o));null!==r.else&&t.push(E(e,r.else,n,o))}return w(t)}case"parameter":{const e=o[r.value.toLowerCase()];if(void 0===e&&n){const e=n[r.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(t(e))return"date";if(a(e))return"date";if("number"==typeof e)return e%1==0?"integer":"double"}return void 0===e?"":e}case"expression-list":{const t=[];for(const a of r.value)t.push(E(e,a,n,o));return t}case"unary-expression":return"boolean";case"binary-expression":switch(r.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"!==r.right.type)throw new s(c.UnsupportedIsRhs);return"boolean";case"*":case"-":case"+":case"/":return w([E(e,r.left,n,o),E(e,r.right,n,o)]);case"||":return"string";default:throw new s(c.UnsupportedOperator,{operator:r.operator})}case"null":return"";case"boolean":return"boolean";case"string":return"string";case"number":return null===r.value?"":r.value%1==0?"integer":"double";case"date":case"timestamp":case"current-time":return"date";case"column-reference":{const t=e[r.column.toLowerCase()];return void 0===t?"":t}case"function":switch(r.name.toLowerCase()){case"cast":switch(r.args?.value[1]?.value.type??""){case"integer":case"smallint":return"integer";case"real":case"float":return"double";case"date":case"timestamp":return"date";case"varchar":return"string";default:return""}case"position":case"extract":case"char_length":case"mod":return"integer";case"round":if(i=E(e,r.args,n,o),i instanceof Array){if(i.length<=0)return"double";i=i[0]}return i;case"sign":return"integer";case"ceiling":case"floor":case"abs":return i=E(e,r.args,n,o),i instanceof Array&&(i=w(i)),"integer"===i||"double"===i?i:"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 i=E(e,r.args,n,o),i instanceof Array?i.length>0?i[0]:"":i}return""}throw new s(c.UnsupportedSyntax,{node:r.type})}const I={boolean:1,string:2,integer:3,double:4,date:5};function w(e){if(e){let r="";for(const t of e)""!==t&&(r=""===r||I[r]<I[t]?t:r);return r}return""}function N(e,r){return b(e.parseTree,r)}function A(e){return"column-reference"===e?.parseTree.type}function b(e,r){if(null==e)return!1;switch(e.type){case"when-clause":return b(e.operand,r)||b(e.value,r);case"case-expression":for(const t of e.clauses)if(b(t,r))return!0;return!("simple"!==e.format||!b(e.operand,r))||!(null===e.else||!b(e.else,r));case"parameter":case"null":case"boolean":case"date":case"timestamp":case"string":case"number":return!1;case"expression-list":for(const t of e.value)if(b(t,r))return!0;return!1;case"unary-expression":return b(e.expr,r);case"binary-expression":return b(e.left,r)||b(e.right,r);case"column-reference":return r.toLowerCase()===e.column.toLowerCase();case"function":return b(e.args,r)}return!1}function v(e){let r="";return r+=e.period.toUpperCase(),r}function R(e,r,t){let a="";return a="interval-period"===r.type?v(r):v(r.start)+" TO "+v(r.end),"INTERVAL "+t+" "+e+" "+a}export{h as arcadeDateToSqlString,l as changeSqlTimeZones,d as changeWhereClauseTimeZone,m as combine,R as convertIntervalToSql,A as isSingleField,T as makeDateString,L as makeToday,S as predictType,p as reformulateWithoutField,N as scanForField,u as toWhereClause,f as toWhereClauseFromTree,g as translateFunctionToDatabaseSpecific};