semanticdb-v2 2.0.0-alpha.4 → 2.0.0-alpha.5

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.
Files changed (44) hide show
  1. package/README.md +26 -10
  2. package/dist/compiler/compile-cte.d.ts +1 -1
  3. package/dist/errors.d.ts +2 -1
  4. package/dist/executor/components.d.ts +8 -3
  5. package/dist/executor/fetch-entities.d.ts +2 -0
  6. package/dist/executor/types.d.ts +9 -3
  7. package/dist/i18n/index.d.ts +4 -0
  8. package/dist/i18n/locales/en-US.d.ts +2 -0
  9. package/dist/i18n/locales/zh-CN.d.ts +2 -0
  10. package/dist/i18n/registry.d.ts +13 -0
  11. package/dist/i18n/types.d.ts +9 -0
  12. package/dist/index.d.ts +4 -2
  13. package/dist/normalizer/core.d.ts +5 -0
  14. package/dist/normalizer/default-pred-name.d.ts +2 -0
  15. package/dist/normalizer/index.d.ts +1 -0
  16. package/dist/normalizer/property-resolve.d.ts +1 -0
  17. package/dist/operators/builtins/period-name.d.ts +2 -1
  18. package/dist/operators/index.d.ts +1 -0
  19. package/dist/operators/registry.d.ts +1 -1
  20. package/dist/operators/resolve.d.ts +3 -0
  21. package/dist/operators/types.d.ts +17 -8
  22. package/dist/physical/clickhouse-provider.d.ts +8 -0
  23. package/dist/physical/provider.d.ts +4 -0
  24. package/dist/planner/index.d.ts +1 -1
  25. package/dist/planner/semantics/annual-periods.d.ts +11 -0
  26. package/dist/planner/semantics/index.d.ts +1 -0
  27. package/dist/planner/semantics/lifecycle/classification.d.ts +5 -7
  28. package/dist/planner/semantics/lifecycle/query-policy.d.ts +2 -3
  29. package/dist/planner/semantics/lifecycle/rule.d.ts +2 -2
  30. package/dist/planner/semantics/observation/index.d.ts +2 -0
  31. package/dist/planner/semantics/observation/periods.d.ts +19 -0
  32. package/dist/planner/semantics/validity/classification.d.ts +14 -0
  33. package/dist/planner/semantics/validity/index.d.ts +6 -0
  34. package/dist/planner/semantics/validity/periods.d.ts +16 -0
  35. package/dist/planner/semantics/validity/query-policy.d.ts +4 -0
  36. package/dist/planner/semantics/validity/rule.d.ts +2 -0
  37. package/dist/planner/types.d.ts +31 -0
  38. package/dist/schema/dependent-projection.d.ts +8 -0
  39. package/dist/schema/index.d.ts +1 -0
  40. package/dist/semantic-types/index.d.ts +1 -1
  41. package/dist/semantic-types/types.d.ts +8 -1
  42. package/dist/semanticdb.esm.js +3 -3
  43. package/dist/semanticdb.js +3 -3
  44. package/package.json +2 -1
@@ -1,3 +1,3 @@
1
- import{performance as mr}from"node:perf_hooks";import W from"dayjs";import We from"dayjs/plugin/isoWeek.js";import ze from"dayjs/plugin/quarterOfYear.js";import{randomUUID as Zn}from"node:crypto";import Xn from"dayjs/plugin/customParseFormat.js";import{isDeepStrictEqual as eo}from"node:util";import{createClient as to}from"@clickhouse/client";import{createPool as ro}from"mysql2/promise";import no from"mysql2";import yr from"oracledb";import{Pool as oo}from"pg";import io from"snowflake-sdk";class d extends Error{code;details;constructor(t,r,n){super(r),this.code=t,this.details=n,this.name="SemanticDBError"}localizedMessage(t="zh-CN"){if(this.code==="PROPERTY_NOT_FOUND"&&t.toLowerCase().startsWith("en")){const r=this.details?.schemaId,n=this.details?.schemaName,o=this.details?.property,i=this.details?.propertyName;if(typeof r=="string"&&typeof n=="string"&&typeof o=="string"&&typeof i=="string")return`Property not found in Schema: ${n}(${r}): ${i}`}return this.message}}W.extend(We),W.extend(ze);const so=new Set(["year","quarter","month","week"]),$t=e=>e.format("YYYY-MM-DD HH:mm:ss"),wt=(e,t)=>e.operator&&t(e.operator).kind==="aggregate"?!0:(e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred)?wt(e.pred,t):!1)||Array.isArray(e.pred)&&e.pred.some(r=>typeof r!="string"&&wt(r,t)),ve=(e,t,r)=>{if(e.kind==="window"||e.kind==="cumulative")throw new d("ACCUMULATE_WINDOW_UNSUPPORTED","$accumulate cannot contain another window expression");if(e.kind==="ordinal-decode")return{...e,input:ve(e.input,t,r)};if(e.kind==="ordinal-encode")return{kind:"cumulative",function:"sum",input:e,...r};if(e.kind!=="operator")return{kind:"cumulative",function:"sum",input:e,...r};const n=t.getOperator(e.operator);if(n.kind==="component")throw new d("ACCUMULATE_OPERATOR_UNSUPPORTED",`$accumulate cannot contain component operator ${e.operator}`);if(n.kind==="aggregate"){if(e.operator==="$avg"){const s={...e,operator:"$sum"},a={...e,operator:"$count"};return{kind:"operator",operator:"$divide",args:{},inputs:[{kind:"cumulative",function:"sum",input:s,...r},{kind:"cumulative",function:"sum",input:a,...r}]}}const i={$sum:"sum",$count:"sum",$min:"min",$max:"max"}[e.operator];if(!i)throw new d("ACCUMULATE_OPERATOR_UNSUPPORTED",`Aggregate operator ${e.operator} does not declare cumulative semantics`);return{kind:"cumulative",function:i,input:e,...r}}if(n.kind!=="scalar")throw new d("ACCUMULATE_OPERATOR_UNSUPPORTED",`$accumulate cannot contain ${e.operator}`);return{...e,...e.input?{input:ve(e.input,t,r)}:{},...e.inputs?{inputs:e.inputs.map(o=>ve(o,t,r))}:{}}},ao=e=>{if(!e.input||e.inputs.length>0||e.pred.query)throw new d("INVALID_ACCUMULATE_INPUT","$accumulate requires exactly one nested pred and does not accept pred.query");if(e.inputProperty?.comparable&&e.input.kind!=="ordinal-decode")throw new d("ACCUMULATE_COMPARABLE_OPERATOR_REQUIRED","$accumulate over a comparable category requires an explicit $min or $max metric");const t=e.args.partitionBy??[],r=e.args.orderBy;if(!Array.isArray(t)||t.some(o=>typeof o!="string"))throw new d("INVALID_ACCUMULATE_ARGS","$accumulate partitionBy must be an array of groupby names");if(!Array.isArray(r)||r.length===0)throw new d("INVALID_ACCUMULATE_ARGS","$accumulate requires a non-empty args.orderBy array");const n=r.map(o=>{if(typeof o!="object"||o===null||Array.isArray(o))throw new d("INVALID_ACCUMULATE_ARGS","$accumulate orderBy items require pred and optional direction");const{pred:i,direction:s="asc",...a}=o;if(typeof i!="string"||s!=="asc"&&s!=="desc"||Object.keys(a).length>0)throw new d("INVALID_ACCUMULATE_ARGS","$accumulate orderBy items require only a string pred and asc/desc direction");return{expression:e.resolveKey(i),direction:s==="asc"?"ASC":"DESC"}});return ve(e.input,e,{partitionBy:t.map(o=>e.resolveKey(String(o))),orderBy:n})},co=e=>{if(e.groupByNames.length===0)return;if(typeof e.pred.pred!="object"||Array.isArray(e.pred.pred)||!wt(e.pred.pred,e.getOperator))throw new d("ACCUMULATE_AGGREGATE_REQUIRED","$accumulate over a grouped physical relation requires an aggregate expression");const t=e.pred.args?.partitionBy,r=e.pred.args?.orderBy;if(t!==void 0&&!Array.isArray(t)||!Array.isArray(r)||r.length===0||r.some(i=>typeof i!="object"||i===null||Array.isArray(i)||typeof i.pred!="string"||Object.keys(i).some(s=>s!=="pred"&&s!=="direction")||i.direction!==void 0&&i.direction!=="asc"&&i.direction!=="desc"))return;const n=[...t??[],...r.map(i=>i.pred)];if(n.some(i=>typeof i!="string"))return;const o=n.map(i=>e.resolveGroupName(String(i)));if(o.length!==e.groupByNames.length||new Set(o).size!==e.groupByNames.length||e.groupByNames.some(i=>!o.includes(i)))throw new d("INCOMPLETE_ACCUMULATE_DIMENSIONS","$accumulate partitionBy and orderBy must cover every groupby item exactly once",{expected:e.groupByNames,received:o})},uo=(e,t,r)=>{if(e.from||e.having)throw new d("ACCUMULATE_PERIOD_UNSUPPORTED","$accumulate args.period currently requires a physical LogicForm without from or having");if((e.preds?.length??0)!==t.length)throw new d("ACCUMULATE_PERIOD_UNSUPPORTED","$accumulate args.period cannot currently be mixed with non-period projections");const n=e.query&&Object.entries(e.query).find(([,m])=>{if(typeof m!="object"||m===null||Array.isArray(m))return!1;const I=m;return typeof I.$gte=="string"&&typeof I.$lte=="string"});if(!n)throw new d("ACCUMULATE_PERIOD_QUERY_REQUIRED","$accumulate args.period requires one bounded date query identifying the target period");const[o,i]=n,s=i,a=W(String(s.$gte)),c=W(String(s.$lte));if(!a.isValid()||!c.isValid())throw new d("ACCUMULATE_PERIOD_QUERY_REQUIRED","Target date range is invalid");const u=t.map(m=>{if(!m.name)throw new d("MISSING_PRED_NAME","$accumulate args.period requires normalized names");return m.name}),p=r==="week"?a.startOf("isoWeek"):a.startOf(r),l={...e.query,[o]:{...s,$gte:$t(p)}},f=new Set([...(e.groupby??[]).map(({name:m})=>m),...(e.preds??[]).map(({name:m})=>m)]),h=m=>{let I=m;for(;f.has(I);)I=`_${I}`;return f.add(I),I},y=h("__accumulate_period"),A=t.map((m,I)=>h(`__accumulate_metric_${I}`)),R=(e.groupby??[]).map(({name:m})=>String(m)),b=r==="year"||r==="quarter"?"month":"day",g={version:e.version,...e.schema?{schema:e.schema}:{},query:l,groupby:[...e.groupby??[],{operator:"$dateBucket",pred:o,args:{granularity:b},name:y}],preds:t.map((m,I)=>({...m.pred,name:A[I]??`__accumulate_metric_${I}`}))},S={version:e.version,from:g,preds:[...R.map(m=>({pred:m,name:m})),{pred:y,name:y},...t.map((m,I)=>({operator:"$accumulate",pred:A[I]??`__accumulate_metric_${I}`,args:{partitionBy:R,orderBy:[{pred:y,direction:"asc"}]},name:u[I]??`accumulate_${I}`}))]};return{version:e.version,from:S,query:{[y]:{$gte:$t(a),$lte:$t(c)}},preds:[...R.map(m=>({pred:m,name:m})),...u.map(m=>({pred:m,name:m}))],...e.sort?{sort:e.sort}:{},...e.limit!==void 0?{limit:e.limit}:{},...e.page!==void 0?{page:e.page}:{},...e.output?{output:e.output}:{},...e.representation?{representation:e.representation}:{}}},po={name:"$accumulate",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`Cumulative ${e}`:`${e}\u7D2F\u8BA1\u503C`,kind:"logical",normalizePred({pred:e}){const t=e.args?.period;if(t!==void 0&&(typeof t!="string"||!so.has(t)))throw new d("INVALID_ACCUMULATE_ARGS","$accumulate args.period must be year, quarter, month, or week");if(t!==void 0&&(e.args?.partitionBy!==void 0||e.args?.orderBy!==void 0))throw new d("INVALID_ACCUMULATE_ARGS","$accumulate args.period cannot be combined with partitionBy or orderBy");return e},planExpression:ao,validatePlan:co,rewriteLogicform({logicform:e,schema:t}){const r=(e.preds??[]).filter(s=>s.operator==="$accumulate"&&s.args?.period!==void 0);if(r.length===0)return;const n=r[0]?.args?.period;if(r.some(s=>s.args?.period!==n))throw new d("ACCUMULATE_PERIOD_UNSUPPORTED","All $accumulate args.period projections in one LogicForm must use the same period");const o=new Set(Object.keys(e.query??{}));if(t.properties.filter(s=>s.primal_type==="date"&&o.has(s.name)).length!==1)throw new d("ACCUMULATE_PERIOD_QUERY_REQUIRED","$accumulate args.period requires exactly one queried date property");return uo(e,r,n)},getOutputProperty({name:e,inputProperty:t}){return t?{...t,name:e,isArray:!1}:{name:e,type:"number",primal_type:"number",isArray:!1}}},fo={name:"$abs",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`Absolute ${e}`:`${e}\u7EDD\u5BF9\u503C`,kind:"scalar",toSQL({expression:e}){if(!e)throw new d("PRED_PROPERTY_REQUIRED","$abs requires a pred");return`ABS(${e})`},getOutputProperty({name:e,inputProperty:t}){if(!t)throw new d("PRED_PROPERTY_REQUIRED","$abs requires a pred");return{...t,name:e,isArray:!1}}},Re=(e,t,r,n=r)=>{const o=t.expressions??[];if(o.length<r||o.length>n)throw new d("INVALID_OPERATOR_COMPONENTS",`${e} requires ${r===n?String(r):`${r}-${n}`} pred inputs`);return o},xe=e=>({name:e,type:"number",primal_type:"number",isArray:!1}),lo={name:"$add",defaultName:({operandName:e,inputNames:t,locale:r})=>r.toLowerCase().startsWith("en")?t.length>0?t.join(" plus "):`Sum of ${e}`:t.length>0?t.join("\u52A0"):`${e}\u6C42\u548C`,kind:"scalar",requiresProperty:!1,toSQL(e){return`(${Re("$add",e,2,Number.POSITIVE_INFINITY).join(" + ")})`},getOutputProperty({name:e,inputProperties:t}){const r=t?.[0];return r?{...r,name:e,isArray:!1}:xe(e)}},B=e=>structuredClone(e),mo=(e,t)=>{const r=t[e];if(!r)throw new d("SCHEMA_NOT_FOUND",`Schema not found: ${e}`,{schemaId:e});if("_id"in r||"_sid"in r)throw new d("LEGACY_SCHEMA_ID_NOT_ALLOWED","Schema must use id instead of _id; _sid is not supported",{schemaId:e});if("sid"in r)throw new d("SCHEMA_SID_NOT_ALLOWED","Schema must not declare sid",{schemaId:e});if(r.id!==e)throw new d("SCHEMA_ID_MISMATCH",`Schema registry key ${e} does not match schema.id ${r.id}`,{registryKey:e,schemaId:r.id});return r},yo=(e,t)=>{const r=e.properties.find(n=>n.id===t)??e.properties.find(n=>n.name===t);if(!r)throw new d("PROPERTY_NOT_FOUND",`Property not found in ${e.id}: ${t}`,{schemaId:e.id,property:t});return r},ho=e=>{const t=e.properties.flatMap(r=>[[r.name,r.id],[r.id,r.id]]);return Object.freeze(Object.fromEntries(t))},hr=(e,t)=>e.properties.some(r=>r!==t&&r.id===t.name)?t.id:t.name,go=(e,t)=>e.properties.flatMap(r=>[...t.startsWith(`${r.id}_`)?[{property:r,prefix:r.id}]:[],...r.name!==r.id&&t.startsWith(`${r.name}_`)?[{property:r,prefix:r.name}]:[]]).sort((r,n)=>n.prefix.length-r.prefix.length||(n.prefix===n.property.id?1:0)-(r.prefix===r.property.id?1:0)),G=(e,t,r)=>{const n=e.properties.find(o=>o.id===t)??e.properties.find(o=>o.name===t);if(n)return{canonicalName:hr(e,n),canonicalId:n.id,schema:e,property:n,relations:[]};for(const{property:o,prefix:i}of go(e,t)){if(o.primal_type!=="entity"&&o.primal_type!=="object"||!o.ref)continue;if(!r)throw new d("SCHEMA_RESOLVER_REQUIRED",`Resolving property path ${t} requires a Schema resolver`);const s=r(o.ref),a=G(s,t.slice(i.length+1),r);return{canonicalName:`${hr(e,o)}_${a.canonicalName}`,canonicalId:`${o.id}_${a.canonicalId}`,schema:a.schema,property:a.property,relations:[{sourceSchema:e,property:o,targetSchema:s},...a.relations]}}throw new d("PROPERTY_NOT_FOUND",`\u5728 Schema\uFF1A${e.name}(${e.id})\u4E2D\u672A\u627E\u5230\u5C5E\u6027: ${t}`,{schemaId:e.id,schemaName:e.name,property:t,propertyName:t})},$o=({source:e,properties:t})=>{const r=e.hierarchy;if(!Array.isArray(r))return r===void 0?{}:{hierarchy:r};let n=e.hierarchy_property;if(typeof n!="string"||n.length===0){const s=t.filter(({type:c})=>c==="ID");if(s.length!==1)throw new d("LEGACY_HIERARCHY_ID_PROPERTY_REQUIRED","Legacy Schema hierarchy without hierarchy_property must contain exactly one ID property",{idPropertyCount:s.length});const a=s[0];n=a?.id??a?.name}const o=r.map(s=>{if(typeof s!="object"||s===null||Array.isArray(s))return;const a=s;if(!(typeof a.name!="string"||!Number.isInteger(a.code_length)))return{name:a.name,...Array.isArray(a.syno)?{syno:a.syno}:{},codeLength:a.code_length}});if(o.some(s=>s===void 0))return{};const i=r[0];return{hierarchy:{property:n,storage:i?.use_full_length===!0?"zero-padded":"compact",levels:o}}},wo=e=>{if(!e.hierarchy)return;const t=e.properties.find(({name:r})=>r===e.hierarchy?.property);if(!t)throw new d("HIERARCHY_PROPERTY_NOT_FOUND",`Schema hierarchy.property does not exist: ${e.hierarchy.property}`,{schemaId:e.id,property:e.hierarchy.property});return t},Ao=(e,t,r)=>{const n=G(e,t,r);if(n.property.primal_type!=="entity"&&n.property.primal_type!=="object")return{schema:n.schema,reference:n.canonicalName,relation:!1};if(n.property.isArray)throw new d("ARRAY_HIERARCHY_RELATION_UNSUPPORTED",`$hierarchyLevel cannot group an array relation: ${n.canonicalName}`);if(!n.property.ref||!r)throw new d("SCHEMA_RESOLVER_REQUIRED",`$hierarchyLevel requires a Schema resolver for relation ${n.canonicalName}`);return{schema:r(n.property.ref),reference:n.canonicalName,relation:!0}},_o={name:"$hierarchyLevel",defaultName:({operandName:e,args:t,locale:r})=>{const n=typeof t.level=="string"?t.level:"";return r.toLowerCase().startsWith("en")?`${e}${n?` ${n}`:""} level`:`${e}${n}\u5C42\u7EA7`},kind:"scalar",planInput({reference:e,args:t,schema:r,resolveSchema:n}){const o=Object.keys(t).filter(h=>h!=="level");if(o.length>0||typeof t.level!="string"||t.level.length===0)throw new d("INVALID_HIERARCHY_LEVEL_ARGS","$hierarchyLevel args must contain exactly one non-empty level string",{unsupportedArgs:o});const i=Ao(r,e,n),s=i.schema.hierarchy;if(!s)throw new d("SCHEMA_HIERARCHY_REQUIRED",`Schema ${i.schema.id} does not declare hierarchy`,{schemaId:i.schema.id});const a=i.schema.properties.find(({name:h})=>h===s.property);if(!a)throw new d("HIERARCHY_PROPERTY_NOT_FOUND",`Schema hierarchy.property does not exist: ${s.property}`);if(!i.relation&&a.name!==G(r,e,n).property.name)throw new d("HIERARCHY_PROPERTY_REQUIRED",`$hierarchyLevel pred must be an object relation or hierarchy property ${a.name}`);let c=0;const u=s.levels.find(h=>(c+=h.codeLength,h.name===t.level||h.syno?.includes(t.level)));if(!u)throw new d("HIERARCHY_LEVEL_NOT_FOUND",`Schema ${i.schema.id} does not declare hierarchy level: ${t.level}`,{schemaId:i.schema.id,level:t.level});const p=s.levels.reduce((h,y)=>h+y.codeLength,0),l=i.schema.properties.filter(({type:h})=>h==="ID");return{reference:i.relation&&l.length===1&&l[0]?.name===a.name?i.reference:i.relation?`${i.reference}_${a.name}`:i.reference,args:{level:u.name,codeLength:c,totalLength:p,storage:s.storage}}},toSQL({expression:e,args:t,sql:r}){if(!e)throw new Error("$hierarchyLevel requires a hierarchy pred");const n=t.codeLength,o=t.totalLength,i=t.storage;if(!Number.isInteger(n)||!Number.isInteger(o)||Number(n)<=0||Number(o)<Number(n)||i!=="compact"&&i!=="zero-padded")throw new d("INVALID_HIERARCHY_LEVEL_PLAN","$hierarchyLevel must be resolved by the planner before SQL compilation");const s=r.substring(e,1,Number(n)),a=Number(o)-Number(n);return i==="zero-padded"&&a>0?r.concat([s,r.value("0".repeat(a))]):s},getOutputProperty({name:e}){return{name:e,type:"string",primal_type:"string",isArray:!1}}},Eo={keys:["hierarchy"],resolve(e,t){if("hierarchy_property"in e)throw new d("LEGACY_HIERARCHY_PROPERTY_NOT_ALLOWED","Schema hierarchy must declare hierarchy.property instead of hierarchy_property");const r=e.hierarchy;if(r===void 0)return{};if(typeof r!="object"||r===null||Array.isArray(r))throw new d("INVALID_HIERARCHY","Schema hierarchy must be an object containing property, levels, and optional storage");const n=r,o=Object.keys(n).filter(f=>f!=="property"&&f!=="storage"&&f!=="levels");if(o.length>0)throw new d("UNSUPPORTED_HIERARCHY_FIELD","Schema hierarchy only supports property, storage, and levels",{unsupportedKeys:o});const i=n.property===void 0?(()=>{const f=t.filter(h=>h.type==="ID");if(f.length!==1)throw new d("HIERARCHY_ID_PROPERTY_REQUIRED","Schema hierarchy.property may be omitted only when the Schema has exactly one ID Property",{idPropertyCount:f.length});return f[0]})():void 0;if(n.property!==void 0&&(typeof n.property!="string"||n.property.length===0))throw new d("HIERARCHY_PROPERTY_REQUIRED","Schema hierarchy.property must be a non-empty property name or id when provided");const s=i??t.find(f=>f.name===n.property||f.id===n.property);if(!s)throw new d("HIERARCHY_PROPERTY_NOT_FOUND",`Schema hierarchy.property does not exist: ${n.property}`,{property:n.property});if(s.primal_type!=="string")throw new d("INVALID_HIERARCHY_PROPERTY",`Hierarchy property ${s.name} must have primal_type string`,{property:s.name,primal_type:s.primal_type});const a=n.storage??"compact";if(a!=="compact"&&a!=="zero-padded")throw new d("INVALID_HIERARCHY_STORAGE","Schema hierarchy.storage must be compact or zero-padded");if(!Array.isArray(n.levels)||n.levels.length===0)throw new d("HIERARCHY_LEVELS_REQUIRED","Schema hierarchy.levels must be a non-empty array");const c=new Set,u=new Set,p=n.levels.map((f,h)=>{if(typeof f!="object"||f===null||Array.isArray(f))throw new d("INVALID_HIERARCHY_LEVEL",`Hierarchy level ${h} must be an object`);const y=f,A=Object.keys(y).filter(b=>b!=="name"&&b!=="syno"&&b!=="codeLength");if(A.length>0)throw new d("UNSUPPORTED_HIERARCHY_LEVEL_FIELD",`Hierarchy level ${h} only supports name, syno, and codeLength`,{unsupportedKeys:A});if(typeof y.name!="string"||y.name.length===0)throw new d("INVALID_HIERARCHY_LEVEL",`Hierarchy level ${h} name must not be empty`);if(c.has(y.name)||u.has(y.name))throw new d("DUPLICATE_HIERARCHY_LEVEL",`Duplicate hierarchy level name: ${y.name}`);if(!Number.isInteger(y.codeLength)||Number(y.codeLength)<=0)throw new d("INVALID_HIERARCHY_CODE_LENGTH",`Hierarchy level ${y.name} codeLength must be a positive integer`);if(y.syno!==void 0&&(!Array.isArray(y.syno)||y.syno.some(b=>typeof b!="string"||b.length===0)))throw new d("INVALID_HIERARCHY_SYNONYMS",`Hierarchy level ${y.name} syno must contain only non-empty strings`);const R=y.syno??[];for(const b of R){if(b===y.name||c.has(b)||u.has(b))throw new d("DUPLICATE_HIERARCHY_LEVEL",`Duplicate hierarchy level alias: ${b}`);u.add(b)}return c.add(y.name),{name:y.name,...R.length>0?{syno:[...R]}:{},codeLength:Number(y.codeLength)}});return{hierarchy:{property:s.name,storage:a,levels:p}}}},Io=Object.freeze({name:"hierarchy",schemaMetadata:Eo,legacySchemaKeys:["hierarchy_property"],normalizeLegacySchema:$o,resolveEntityFilterProperty:wo,operators:[_o]}),gr=Object.freeze([Io]),Ke=(e=[])=>{const t=[...gr,...e],r=new Set,n=new Set,o=new Set;for(const i of t){if(!i.name)throw new d("INVALID_PLUGIN","Plugin name must not be empty");if(r.has(i.name))throw new d("PLUGIN_ALREADY_REGISTERED",`Plugin is already registered: ${i.name}`,{plugin:i.name});r.add(i.name);for(const s of[...i.schemaMetadata?.keys??[],...i.legacySchemaKeys??[]]){if(!s)throw new d("INVALID_PLUGIN_METADATA_KEY","Plugin metadata key must not be empty");if(n.has(s))throw new d("PLUGIN_METADATA_KEY_ALREADY_REGISTERED",`Plugin Schema metadata key is already registered: ${s}`,{key:s,plugin:i.name});n.add(s)}for(const s of i.operators??[]){if(o.has(s.name))throw new d("PLUGIN_OPERATOR_ALREADY_REGISTERED",`Plugin Operator is already registered: ${s.name}`,{operator:s.name,plugin:i.name});o.add(s.name)}}return Object.freeze(t)},At=e=>typeof e=="string"&&e.length>0&&e!=="placeholder"||typeof e=="number"&&Number.isSafeInteger(e),Ro=e=>{const t=e.properties.filter(({type:r})=>r==="ID");if(t.length!==1)throw new d("ENTITY_ID_PROPERTY_REQUIRED",`Schema ${e.id} must contain exactly one ID property to use entity_id`,{schemaId:e.id,idPropertyCount:t.length});return t[0]},_t=(e,t=[])=>{for(const r of Ke(t)){const n=r.resolveEntityFilterProperty?.(e);if(n)return n}return Ro(e)},Se=e=>{if(e.name)return e.name;throw new d("MISSING_PRED_NAME","A normalized groupby PredItem must have a name")},Et=e=>typeof e.pred=="string"?e.pred:void 0,So=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Oo={second:"\u79D2",minute:"\u5206\u949F",hour:"\u5C0F\u65F6",day:"\u65E5",week:"\u5468",month:"\u6708",quarter:"\u5B63\u5EA6",year:"\u5E74"},bo={year:"\u5E74",quarter:"\u5B63\u5EA6",month:"\u6708",week:"\u5468",day:"\u65E5",hour:"\u65F6",minute:"\u5206",second:"\u79D2"},Oe=(e,t)=>{const r=t.toLowerCase().startsWith("en"),n=e.time;if(!So(n))return r?"period-over-period":"\u540C\u671F";if(typeof n.granularity=="string"&&typeof n.offset=="number"){if(n.offset===-1&&n.granularity==="year")return r?"year-over-year":"\u540C\u6BD4";if(n.offset===-1&&n.granularity==="month")return r?"month-over-month":"\u73AF\u6BD4";if(n.offset===-1&&n.granularity==="week")return r?"week-over-week":"\u5468\u73AF\u6BD4";if(n.offset===0)return r?"current-period":"\u672C\u671F";const i=Math.abs(n.offset),s=n.offset<0?"before":"after";return r?`${i} ${n.granularity}${i===1?"":"s"} ${s}`:`\u8F83${s==="before"?"\u524D":"\u540E"}${i}${Oo[n.granularity]??"\u671F"}`}const o=Object.entries(n).map(([i,s])=>r?`${i} ${String(s)}`:`${String(s)}${bo[i]??i}`).join(r?", ":"");return r?`compared with ${o}`:`\u5BF9\u6BD4${o}`};W.extend(We),W.extend(ze);const Po=["second","minute","hour","day","week","month","quarter","year"],No=new Set(Po),It=["year","quarter","month","week","day","hour","minute","second"],$r=e=>Object.prototype.toString.call(e)==="[object Object]",le=e=>{throw new d("INVALID_PERIOD_SHIFT_ARGS",e)},To=e=>{const t=e.time;$r(t)||le("$periodShift requires args.time");const r=t;if("granularity"in r||"offset"in r)return(typeof r.granularity!="string"||!No.has(r.granularity)||!Number.isInteger(r.offset)||Object.keys(r).some(a=>a!=="granularity"&&a!=="offset"))&&le("Relative period shift time requires only granularity and an integer offset"),r;const o=Object.entries(r);(o.length===0||o.some(([a,c])=>!It.includes(a)||!Number.isInteger(c)))&&le("Absolute period shift time requires integer calendar components"),typeof r.year!="number"&&le("Absolute period shift time requires year");const i={quarter:[1,4],month:[1,12],week:[1,53],day:[1,31],hour:[0,23],minute:[0,59],second:[0,59]};for(const[a,[c,u]]of Object.entries(i)){const p=r[a];p!==void 0&&(Number(p)<c||Number(p)>u)&&le(`Invalid absolute period shift ${a}: ${JSON.stringify(p)}`)}return["quarter","month","week"].filter(a=>a in r).length>1&&le("Absolute period shift time cannot mix quarter, month, and week"),"day"in r&&!("month"in r)&&le("Absolute period shift day requires month"),r},wr=(e,t,r)=>t==="month"?e.month(r-1):t==="day"?e.date(r):t==="week"?e.isoWeek(r):t==="quarter"?e.quarter(r):e.set(t,r),Lo=(e,t)=>{if("granularity"in t){const n=t.granularity==="week"?"week":t.granularity;return e.add(t.offset,n)}let r=e;for(const n of It){const o=t[n];typeof o=="number"&&(r=wr(r,n,o))}return r},Rt=(e,t)=>e instanceof Date?t.toDate():typeof e!="string"?e:t.format(e.includes(":")?"YYYY-MM-DD HH:mm:ss":"YYYY-MM-DD"),Do=(e,t,r,n,o)=>(e.groupby??[]).filter(i=>{const s=Et(i);return s?G(t,s,r).property.primal_type==="date":!1}).map(i=>{const s=i.operator==="$dateBucket"?i.args?.granularity:void 0,a="granularity"in n?n.granularity:s??"day",c="granularity"in n?-n.offset:o.originalAnchor&&o.shiftedAnchor?o.originalAnchor.diff(o.shiftedAnchor,a):0;return{name:Se(i),granularity:a,offset:c}}),St=(e,t,r)=>{if(Array.isArray(e))return e.map(i=>St(i,t,r));if($r(e))return Object.fromEntries(Object.entries(e).map(([i,s])=>[i,St(s,t,r)]));if(!(e instanceof Date)&&typeof e!="string")return e;const n=W(e);if(!n.isValid())return e;const o=Lo(n,t);return r.originalAnchor??=n,r.shiftedAnchor??=o,r.shiftedValues+=1,Rt(e,o)},qo=(e,t,r,n,o)=>{const i=new Set,s=c=>Object.fromEntries(Object.entries(c).map(([u,p])=>{if((u==="$and"||u==="$or")&&Array.isArray(p))return[u,p.map(f=>s(f))];const l=G(t,u,r);return l.property.primal_type!=="date"?[u,p]:(i.add(l.canonicalName),[u,St(p,n,o)])})),a=s(e);if(i.size===0||o.shiftedValues===0)throw new d("PERIOD_SHIFT_TIME_QUERY_REQUIRED","$periodShift requires a concrete date condition in the LogicForm query");if(i.size>1)throw new d("AMBIGUOUS_PERIOD_SHIFT_TIME","$periodShift query contains more than one date property",{properties:[...i]});return a},$e=e=>{const t=e.filter(r=>r!==void 0);if(t.length!==0)return t.length===1?t[0]:{$and:t}},me=e=>[...e.query?[e.query]:[],...e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred)?me(e.pred):[],...Array.isArray(e.pred)?e.pred.flatMap(r=>typeof r=="string"?[]:me(r)):[]],Co=(e,t,r)=>{if(!(e instanceof Date)&&typeof e!="string")return e;const n=W(e);if(!n.isValid())return e;if("granularity"in t)return Rt(e,n.add(-t.offset,t.granularity));if(!r.originalAnchor)return e;let o=n;for(const i of It)if(t[i]!==void 0){const s=i==="month"?r.originalAnchor.month()+1:i==="day"?r.originalAnchor.date():i==="week"?r.originalAnchor.isoWeek():i==="quarter"?r.originalAnchor.quarter():r.originalAnchor.get(i);o=wr(o,i,s)}return Rt(e,o)},Ot=({logicform:e,pred:t,outputName:r,schema:n,resolveSchema:o})=>{const i=t.pred;(!i||typeof i!="object"||Array.isArray(i))&&le("$periodShift pred must be a nested metric");const s=To(t.args??{}),a={shiftedValues:0},c=$e([e.query,...me(t)]);if(!c)throw new d("PERIOD_SHIFT_TIME_QUERY_REQUIRED","$periodShift requires a date condition in the LogicForm query");const u=qo(c,n,o,s,a),p=B(i);p.name=r,delete p.query;const l=B(e);l.query=u,l.preds=[p],delete l.having,delete l.sort,delete l.limit,delete l.page;const f=new Set((e.groupby??[]).filter(h=>{const y=Et(h);return y?G(n,y,o).property.primal_type==="date":!1}).map(Se));return{kind:"query",logicform:l,groupKeyShifts:Do(e,n,o,s,a),mapResult:h=>h.map(y=>{const A={...y};for(const R of f)A[R]=Co(A[R],s,a);return A})}},Uo={name:"$periodShift",defaultName:({operandName:e,args:t,locale:r})=>r.toLowerCase().startsWith("en")?`${e} ${Oe(t,r)} baseline`:`${e}${Oe(t,r)}\u57FA\u671F\u503C`,kind:"component",createComponent:Ot,getOutputProperty({name:e,inputProperty:t}){if(!t)throw new Error("$periodShift requires a nested metric");return{...t,name:e,isArray:!1}}},jo=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&!(e instanceof Date),Je=e=>typeof e=="string"||typeof e=="number"||e instanceof Date,Ar=(e,t)=>{const r=e.properties.find(({type:n})=>n==="timestamp");if(!r)throw new d("TIMESTAMP_PROPERTY_REQUIRED",`${t} requires a timestamp property in the Schema`);return r},_r=(e,t)=>{if(Je(e)){t.start??=e,t.end??=e;return}if(!jo(e))return;const r=e.$eq;Je(r)&&(t.start??=r,t.end??=r);const n=e.$gte??e.$gt,o=e.$lte??e.$lt;Je(n)&&(t.start??=n),Je(o)&&(t.end??=o);for(const i of["$and","$or"]){const s=e[i];if(Array.isArray(s))for(const a of s)_r(a,t)}},ko=(e,t,r,n)=>{const o=Ar(t,n),i=new Set,s={},a=(l,f)=>{for(const[h,y]of Object.entries(l)){if((h==="$and"||h==="$or")&&Array.isArray(y)){for(const R of y)a(R,f||h==="$or");continue}if(h.startsWith("$"))continue;const A=G(t,h,r);if(A.property.type==="timestamp"){if(f)throw new d("AMBIGUOUS_TIME_QUERY",`${n} does not support timestamp conditions inside $or`);i.add(A.canonicalName),_r(y,s)}}};if(a(e,!1),i.size!==1)throw new d(i.size===0?"TIME_QUERY_REQUIRED":"AMBIGUOUS_TIME_QUERY",`${n} requires a concrete condition on the Schema timestamp property`);const c=[...i][0];if(!c||c!==o.name)throw new d("AMBIGUOUS_TIME_QUERY",`${n} requires the Schema timestamp property: ${o.name}`);const u=l=>{const f=[];for(const[h,y]of Object.entries(l)){if((h==="$and"||h==="$or")&&Array.isArray(y)){const A=y.map(R=>u(R)).filter(R=>R!==void 0);A.length>0&&f.push([h,A]);continue}!h.startsWith("$")&&G(t,h,r).property.type==="timestamp"||f.push([h,y])}return f.length>0?Object.fromEntries(f):void 0},p=u(e);return{property:o,propertyName:c,...s.start!==void 0?{start:s.start}:{},...s.end!==void 0?{end:s.end}:{},...p?{queryWithoutTime:p}:{}}},Er=(e,t,r,n,o)=>{const i=$e([e,...me(t)]);if(!i)throw new d("TIME_QUERY_REQUIRED",`${o} requires a timestamp query`);return ko(i,r,n,o)},Ir=(e,t,r)=>$e([e,{[t]:r}]),Mo=new Set(["day","week","month","quarter","year"]),Qo={day:"\u65E5",week:"\u5468",month:"\u6708",quarter:"\u5B63\u5EA6",year:"\u5E74"},Bo=e=>{if(typeof e!="string"||!Mo.has(e))throw new d("INVALID_AVERAGE_PER_PERIOD_ARGS","$averagePerPeriod args.granularity must be day, week, month, quarter, or year");return e},Rr=e=>{const t=B(e);return delete t.having,delete t.sort,delete t.limit,delete t.page,t},bt=e=>{const t=B(e);return delete t.query,t.pred&&typeof t.pred=="object"&&!Array.isArray(t.pred)&&(t.pred=bt(t.pred)),Array.isArray(t.pred)&&(t.pred=t.pred.map(r=>typeof r=="string"?r:bt(r))),t},Yo={name:"$averagePerPeriod",defaultName:({operandName:e,args:t,locale:r})=>r.toLowerCase().startsWith("en")?`Average ${e} per ${typeof t.granularity=="string"?t.granularity:"period"}`:`${e}${Qo[String(t.granularity)]??"\u5468\u671F"}\u5747\u503C`,kind:"component",createComponent({logicform:e,pred:t,schema:r}){if(!t.pred||typeof t.pred!="object"||Array.isArray(t.pred))throw new d("INVALID_AVERAGE_PER_PERIOD_INPUT","$averagePerPeriod pred must be a nested metric");const n=Bo(t.args?.granularity),o=Ar(r,"$averagePerPeriod"),i=bt(t.pred),s=$e([e.query,...me(t)]),a=Rr(e);a.preds=[{...i,name:"__avg_period_num__"}],s&&(a.query=s);const c=Rr(e);c.preds=[{operator:"$countDistinct",pred:{operator:"$dateBucket",pred:o.name,args:{granularity:n},name:"__avg_period_bucket__"},name:"__avg_period_den__"}],s&&(c.query=s);const u=(e.groupby??[]).map(Se);return{components:[{name:"num",logicform:a},{name:"den",logicform:c,joinKeys:u}],expression:"num / NULLIF(den, 0)"}},getOutputProperty({name:e,inputProperty:t}){if(!t)throw new Error("$averagePerPeriod requires a nested metric");return{...t,name:e,isArray:!1}}},Vo={name:"$avg",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`Average ${e}`:`${e}\u5E73\u5747\u503C`,kind:"aggregate",toSQL(e){const{column:t,sql:r}=e;if(!t)throw new Error("$avg requires a column");return r.aggregateFunction("avg",t)},getOutputProperty({name:e,property:t,inputProperty:r}){const n=t??r;if(!n)throw new Error("$avg requires a property");return{name:e,type:n.type,primal_type:n.primal_type,isArray:!1}}},Fo=e=>{if(e.mode!=="auto")return;const t=e.buckets;if(!Number.isInteger(t)||t<2||t>100)throw new d("INVALID_CASE_ARGS","$case auto mode requires args.buckets to be an integer between 2 and 100");if(Object.hasOwn(e,"cases"))throw new d("INVALID_CASE_ARGS","$case auto mode cannot define args.cases");for(const r of["min","max"])if(e[r]!==void 0&&typeof e[r]!="number"||e[r]!==void 0&&!Number.isFinite(e[r]))throw new d("INVALID_CASE_ARGS",`$case auto mode ${r} must be finite number`);if(e.min===void 0!=(e.max===void 0))throw new d("INVALID_CASE_ARGS","$case auto mode requires both min and max");return t},Ho=e=>{if(!Array.isArray(e)||e.length===0)throw new d("INVALID_CASE_ARGS","$case requires a non-empty args.cases array");return e.map(t=>{if(typeof t!="object"||t===null||!("when"in t)||!("then"in t))throw new d("INVALID_CASE_ARGS","Each $case item requires when and then");const r=t;return{when:r.when,then:r.then}})},Go={name:"$case",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`${e} category`:`${e}\u5206\u7C7B`,kind:"scalar",toSQL({expression:e,args:t,sql:r}){if(!e)throw new d("PRED_PROPERTY_REQUIRED","$case requires a pred");const n=Fo(t);if(n!==void 0){const s=t.min===void 0?`MIN(${e}) OVER ()`:r.value(t.min),a=t.max===void 0?`MAX(${e}) OVER ()`:r.value(t.max),c=`(${a} - ${s})`,u=Array.from({length:n-1},(p,l)=>{const f=`${s} + ${c} * ${l+1} / ${n}`;return`WHEN ${e} < ${f} THEN ${r.value(l)}`});return`CASE WHEN ${s} = ${a} THEN ${r.value(0)} ${u.join(" ")} ELSE ${r.value(n-1)} END`}const o=Ho(t.cases).map(({when:s,then:a})=>`WHEN ${r.condition(e,s)} THEN ${r.value(a)}`),i=Object.hasOwn(t,"default")?` ELSE ${r.value(t.default)}`:"";return`CASE ${o.join(" ")}${i} END`},getOutputProperty({name:e}){return{name:e,type:"category",primal_type:"string",isArray:!1}}},Wo={name:"$concat",defaultName:({operandName:e,inputNames:t,locale:r})=>r.toLowerCase().startsWith("en")?t.length>0?`Combined ${t.join(" and ")}`:`Combined ${e}`:t.length>0?`${t.join("\u4E0E")}\u62FC\u63A5\u503C`:`${e}\u62FC\u63A5\u503C`,kind:"scalar",requiresProperty:!1,toSQL(e){return e.sql.concat(Re("$concat",e,1,Number.POSITIVE_INFINITY))},getOutputProperty({name:e}){return{name:e,type:"string",primal_type:"string",isArray:!1}}},zo={name:"$count",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?e==="rows"?"Row count":`${e} count`:e==="\u6570\u636E\u884C"?"\u884C\u6570":`${e}\u6570\u91CF`,kind:"aggregate",requiresProperty:!1,toSQL(e){const{column:t,sql:r}=e;return r.aggregateFunction("count",t)},getOutputProperty({name:e}){return{name:e,type:"int",primal_type:"number",isArray:!1}}},vo={name:"$countDistinct",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`Distinct ${e} count`:`${e}\u53BB\u91CD\u8BA1\u6570`,kind:"aggregate",toSQL(e){const{column:t,sql:r}=e;if(!t)throw new Error("$countDistinct requires a column");return r.aggregateFunction("count",`DISTINCT ${t}`)},getOutputProperty({name:e}){return{name:e,type:"int",primal_type:"number",isArray:!1}}},xo=new Set(["hour","day","week","month","quarter","year"]),Ko={hour:"\u5C0F\u65F6",day:"\u65E5",week:"\u5468",month:"\u6708",quarter:"\u5B63\u5EA6",year:"\u5E74"},Sr=e=>{if(typeof e!="string"||!xo.has(e))throw new d("INVALID_DATE_BUCKET_ARGS","$dateBucket args.granularity must be hour, day, week, month, quarter, or year");return e},Jo={name:"$dateBucket",defaultName:({operandName:e,args:t,locale:r})=>r.toLowerCase().startsWith("en")?`${e} by ${typeof t.granularity=="string"?t.granularity:"time"}`:`${e}\uFF08\u6309${Ko[String(t.granularity)]??"\u65F6\u95F4"}\uFF09`,kind:"scalar",toSQL({expression:e,args:t,sql:r}){if(!e)throw new Error("$dateBucket requires a date pred");return r.dateBucket(e,Sr(t.granularity))},getOutputProperty({name:e,inputProperty:t,args:r}){if(!t||t.primal_type!=="date")throw new d("DATE_BUCKET_DATE_REQUIRED","$dateBucket requires a date-valued pred");const n=Sr(r.granularity);return{...t,name:e,type:"date",primal_type:"date",isArray:!1,granularity:n}}},Zo={name:"$divide",defaultName:({operandName:e,inputNames:t,locale:r})=>r.toLowerCase().startsWith("en")?t.length>=2?`${t[0]} divided by ${t[1]}`:`${e} ratio`:t.length>=2?`${t[0]}\u9664\u4EE5${t[1]}`:`${e}\u6BD4\u503C`,kind:"scalar",requiresProperty:!1,toSQL(e){const[t,r]=Re("$divide",e,2);return`(${t} / NULLIF(${r}, 0))`},getOutputProperty({name:e}){return xe(e)}},Xo=e=>{if(!(!e.inputProperty?.comparable||!e.input))return{kind:"ordinal-decode",comparable:e.inputProperty.comparable,input:{kind:"operator",operator:"$max",args:e.args,...e.pred.query?{query:e.planQuery(e.pred.query)}:{},input:{kind:"ordinal-encode",input:e.input,comparable:e.inputProperty.comparable}}}},ei={name:"$max",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`Maximum ${e}`:`${e}\u6700\u5927\u503C`,kind:"aggregate",planExpression:Xo,toSQL(e){const{column:t,sql:r}=e;if(!t)throw new Error("$max requires a column");return r.aggregateFunction("max",t)},getOutputProperty({name:e,property:t,inputProperty:r}){const n=t??r;if(!n)throw new Error("$max requires a property");return{name:e,type:n.type,primal_type:n.primal_type,isArray:!1,...n.granularity?{granularity:n.granularity}:{},...n.comparable?{comparable:n.comparable}:{}}}},ti=e=>{if(!(!e.inputProperty?.comparable||!e.input))return{kind:"ordinal-decode",comparable:e.inputProperty.comparable,input:{kind:"operator",operator:"$min",args:e.args,...e.pred.query?{query:e.planQuery(e.pred.query)}:{},input:{kind:"ordinal-encode",input:e.input,comparable:e.inputProperty.comparable}}}},ri={name:"$min",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`Minimum ${e}`:`${e}\u6700\u5C0F\u503C`,kind:"aggregate",planExpression:ti,toSQL(e){const{column:t,sql:r}=e;if(!t)throw new Error("$min requires a column");return r.aggregateFunction("min",t)},getOutputProperty({name:e,property:t,inputProperty:r}){const n=t??r;if(!n)throw new Error("$min requires a property");return{name:e,type:n.type,primal_type:n.primal_type,isArray:!1,...n.granularity?{granularity:n.granularity}:{},...n.comparable?{comparable:n.comparable}:{}}}},ni={name:"$multiply",defaultName:({operandName:e,inputNames:t,locale:r})=>r.toLowerCase().startsWith("en")?t.length>0?t.join(" times "):`Product of ${e}`:t.length>0?t.join("\u4E58\u4EE5"):`${e}\u4E58\u79EF`,kind:"scalar",requiresProperty:!1,toSQL(e){return`(${Re("$multiply",e,2,Number.POSITIVE_INFINITY).join(" * ")})`},getOutputProperty({name:e}){return xe(e)}},oi=e=>{const t=B(e);return delete t.having,delete t.sort,delete t.limit,delete t.page,t},Pt=e=>{const t=B(e);return delete t.query,t.pred&&typeof t.pred=="object"&&!Array.isArray(t.pred)&&(t.pred=Pt(t.pred)),Array.isArray(t.pred)&&(t.pred=t.pred.map(r=>typeof r=="string"?r:Pt(r))),t},ii={name:"$newly",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`New ${e}`:`\u65B0\u589E${e}`,kind:"component",createComponent({logicform:e,pred:t,schema:r,resolveSchema:n}){if(!t.pred||typeof t.pred!="object"||Array.isArray(t.pred))throw new d("INVALID_NEWLY_INPUT","$newly pred must be a nested metric");if((e.groupby??[]).some(c=>{const u=Et(c);return u?G(r,u,n).property.type==="timestamp":!1}))throw new d("NEWLY_TIME_GROUPBY_UNSUPPORTED","$newly does not support grouping by the timestamp property");const o=Er(e.query,t,r,n,"$newly");if(o.start===void 0||o.end===void 0)throw new d("NEWLY_RANGE_REQUIRED","$newly requires both start and end timestamp bounds");const i=Pt(t.pred),s=(c,u)=>{const p=oi(e);return p.query=Ir(o.queryWithoutTime,o.propertyName,{$lte:c}),p.preds=[{...i,name:u}],p},a=(e.groupby??[]).map(Se);return{components:[{name:"end",logicform:s(o.end,"__newly_end__")},{name:"start",logicform:s(o.start,"__newly_start__"),joinKeys:a}],expression:"end - COALESCE(start, 0)"}},getOutputProperty({name:e,inputProperty:t}){if(!t)throw new Error("$newly requires a nested metric");return{...t,name:e,isArray:!1}}},si=e=>{const t=B(e);return delete t.having,delete t.sort,delete t.limit,delete t.page,t},Nt=e=>{const t=B(e);return delete t.query,t.pred&&typeof t.pred=="object"&&!Array.isArray(t.pred)&&(t.pred=Nt(t.pred)),Array.isArray(t.pred)&&(t.pred=t.pred.map(r=>typeof r=="string"?r:Nt(r))),t},ai={name:"$periodValue",defaultName:({operandName:e,args:t,locale:r})=>r.toLowerCase().startsWith("en")?`${e} at period ${t.boundary==="start"?"start":"end"}`:`${e}${t.boundary==="start"?"\u671F\u521D\u503C":"\u671F\u672B\u503C"}`,kind:"component",observationPolicy({pred:e}){const t=e.args?.boundary;if(t!=="start"&&t!=="end")throw new d("INVALID_PERIOD_BOUNDARY_ARGS","$periodValue args.boundary must be start or end",{boundary:t});return{boundary:t,implicit:!1}},createComponent({logicform:e,pred:t,outputName:r,schema:n,resolveSchema:o}){if(!t.pred||typeof t.pred!="object"||Array.isArray(t.pred))throw new d("INVALID_PERIOD_BOUNDARY_INPUT","$periodValue pred must be a nested metric");const i=t.args?.boundary;if(i!=="start"&&i!=="end")throw new d("INVALID_PERIOD_BOUNDARY_ARGS","$periodValue args.boundary must be start or end");const s=Er(e.query,t,n,o,"$periodValue"),a=i==="start"?s.start:s.end;if(a===void 0)throw new d("PERIOD_BOUNDARY_RANGE_REQUIRED",`$periodValue cannot resolve the ${i} of the timestamp query`);const c={version:e.version,schema:n.id,query:{[s.propertyName]:{$lte:a}},preds:[{operator:"$max",pred:s.propertyName,name:"__period_boundary_date__"}]},u=si(e);return u.query=Ir(s.queryWithoutTime,s.propertyName,c),u.preds=[{...Nt(t.pred),name:r}],{kind:"query",logicform:u}},getOutputProperty({name:e,inputProperty:t}){if(!t)throw new Error("$periodValue requires a nested metric");return{...t,name:e,isArray:!1}}},ci=e=>{const t=B(e);return delete t.having,delete t.sort,delete t.limit,delete t.page,t},ui=({logicform:e,pred:t,schema:r,resolveSchema:n})=>{if(!t.pred||typeof t.pred!="object"||Array.isArray(t.pred))throw new Error("$periodDifference pred must be a nested metric");const o=B(t.pred);o.name="__period_diff_current__";const i=ci(e);i.preds=[o];const s=$e([e.query,...me(t)]);s&&(i.query=s);const a={pred:B(t.pred),...t.args?{args:t.args}:{}},c=Ot({logicform:e,pred:a,outputName:"__period_diff_prev__",schema:r,resolveSchema:n});if(!("logicform"in c))throw new Error("$periodDifference period shift must produce a query component");return{components:[{name:"current",logicform:i},{name:"prev",logicform:c.logicform,...c.groupKeyShifts?{groupKeyShifts:c.groupKeyShifts}:{}}],expression:"current - prev"}},di={name:"$periodDifference",defaultName:({operandName:e,args:t,locale:r})=>r.toLowerCase().startsWith("en")?`${e} ${Oe(t,r)} difference`:`${e}${Oe(t,r)}\u5DEE\u503C`,kind:"component",createComponent:ui,getOutputProperty({name:e,inputProperty:t}){if(!t)throw new Error("$periodDifference requires a nested metric");return{...t,name:e,isArray:!1}}},pi=e=>{const t=B(e);return delete t.having,delete t.sort,delete t.limit,delete t.page,t},fi=({logicform:e,pred:t,schema:r,resolveSchema:n})=>{if(!t.pred||typeof t.pred!="object"||Array.isArray(t.pred))throw new Error("$periodGrowth pred must be a nested metric");const o=B(t.pred);o.name="__period_growth_current__";const i=pi(e);i.preds=[o];const s=$e([e.query,...me(t)]);s&&(i.query=s);const a={pred:B(t.pred),...t.args?{args:t.args}:{}},c=Ot({logicform:e,pred:a,outputName:"__period_growth_prev__",schema:r,resolveSchema:n});if(!("logicform"in c))throw new Error("$periodGrowth period shift must produce a query component");return{components:[{name:"current",logicform:i},{name:"prev",logicform:c.logicform,...c.groupKeyShifts?{groupKeyShifts:c.groupKeyShifts}:{}}],expression:"current / NULLIF(ABS(prev), 0) - 1"}},li={name:"$periodGrowth",defaultName:({operandName:e,args:t,locale:r})=>r.toLowerCase().startsWith("en")?`${e} ${Oe(t,r)} growth`:`${e}${Oe(t,r)}\u589E\u957F\u7387`,kind:"component",createComponent:fi,getOutputProperty({name:e}){return{name:e,type:"percentage",primal_type:"number",isArray:!1}}},mi={name:"$sum",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`Total ${e}`:`${e}\u5408\u8BA1`,kind:"aggregate",toSQL(e){const{column:t,sql:r}=e;if(!t)throw new Error("$sum requires a column");return r.aggregateFunction("sum",t)},getOutputProperty({name:e,property:t,inputProperty:r}){const n=t??r;if(!n)throw new Error("$sum requires a property");return{name:e,type:n.type,primal_type:n.primal_type,isArray:!1}}},yi={name:"$subtract",defaultName:({operandName:e,inputNames:t,locale:r})=>r.toLowerCase().startsWith("en")?t.length>=2?`${t[0]} minus ${t[1]}`:`${e} difference`:t.length>=2?`${t[0]}\u51CF\u53BB${t[1]}`:`${e}\u5DEE\u503C`,kind:"scalar",requiresProperty:!1,toSQL(e){const[t,r]=Re("$subtract",e,2);return`(${t} - ${r})`},getOutputProperty({name:e,inputProperties:t}){const r=t?.[0];return r?{...r,name:e,isArray:!1}:xe(e)}},Or=e=>{const t=B(e);return delete t.having,delete t.sort,delete t.limit,delete t.page,t},Tt=e=>{const t=B(e);return delete t.query,t.pred&&typeof t.pred=="object"&&!Array.isArray(t.pred)&&(t.pred=Tt(t.pred)),Array.isArray(t.pred)&&(t.pred=t.pred.map(r=>typeof r=="string"?r:Tt(r))),t},hi={name:"$shareOfTotal",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`${e} share of total`:`${e}\u5360\u6BD4`,kind:"component",createComponent({logicform:e,pred:t}){if(!t.pred||typeof t.pred!="object"||Array.isArray(t.pred))throw new d("INVALID_SHARE_OF_TOTAL_INPUT","$shareOfTotal pred must be a nested metric");const r=t.args?.dimension;if(r!==void 0&&typeof r!="string")throw new d("INVALID_SHARE_OF_TOTAL_ARGS","$shareOfTotal args.dimension must be a groupby pred or output name");const n=e.groupby??[],o=r===void 0?n.length-1:n.findIndex(l=>typeof l.pred=="string"&&l.pred===r||Se(l)===r);if(r!==void 0&&o<0)throw new d("SHARE_OF_TOTAL_DIMENSION_NOT_FOUND",`$shareOfTotal dimension is not grouped: ${r}`);const i=n.filter((l,f)=>f!==o),s=i.map(Se),a=Tt(t.pred),c=Or(e);c.preds=[{...a,name:"__share_numerator__"}];const u=$e([e.query,...me(t)]);u&&(c.query=u);const p=Or(e);return p.groupby=i,p.preds=[{...a,name:"__share_denominator__"}],{components:[{name:"numerator",logicform:c},{name:"denominator",logicform:p,joinKeys:s}],expression:"numerator / NULLIF(denominator, 0)"}},getOutputProperty({name:e}){return{name:e,type:"percentage",primal_type:"number",isArray:!1}}},gi={name:"$substring",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`${e} substring`:`${e}\u5B50\u4E32`,kind:"scalar",toSQL({expression:e,args:t,sql:r}){if(!e)throw new d("PRED_PROPERTY_REQUIRED","$substring requires a pred");const{start:n,length:o}=t;if(!Number.isInteger(n)||Number(n)<0||!Number.isInteger(o)||Number(o)<1)throw new d("INVALID_SUBSTRING_ARGS","$substring requires a non-negative integer start and a positive integer length");return r.substring(e,Number(n)+1,Number(o))},getOutputProperty({name:e}){return{name:e,type:"string",primal_type:"string",isArray:!1}}},br=(e,t,r,n="$sql")=>{if(typeof e!="string"||e.trim().length===0)throw new d("INVALID_SQL_ARGS",`${n} requires a non-empty args.sql expression`);let o="",i=0,s;for(let a=0;a<e.length;a+=1){const c=e[a];if(!c)continue;if(s){o+=c,c===s&&(e[a+1]===s?(o+=s,a+=1):s=void 0);continue}if(c==="'"||c==='"'||c==="`"){s=c,o+=c;continue}const u=e.slice(a,a+2);if(c===";"||u==="--"||u==="/*")throw new d("INVALID_SQL_EXPRESSION",`${n} accepts one expression and does not allow statements or SQL comments`);if(c==="?"){if(i>=t.length)throw new d("INVALID_SQL_PARAMETERS",`${n} contains more placeholders than args.parameters values`);o+=r(t[i]),i+=1;continue}o+=c}if(s)throw new d("INVALID_SQL_EXPRESSION",`${n} contains an unterminated quote`);if(i!==t.length)throw new d("INVALID_SQL_PARAMETERS",`${n} args.parameters contains more values than SQL placeholders`);return o},$i=new Set(["boolean","date","number","entity","object","string"]),wi=e=>{if(e===void 0)return[];if(!Array.isArray(e))throw new d("INVALID_SQL_ARGS","$sql args.parameters must be an array");return e},Ai=(e,t)=>{const r=t.type,n=t.primal_type;if(typeof r!="string"||r.length===0||!$i.has(n))throw new d("INVALID_SQL_OUTPUT","$sql requires args.type and a valid args.primal_type");if(t.isArray!==void 0&&typeof t.isArray!="boolean")throw new d("INVALID_SQL_OUTPUT","$sql args.isArray must be boolean");if(t.ref!==void 0&&typeof t.ref!="string")throw new d("INVALID_SQL_OUTPUT","$sql args.ref must be a Schema id");return{name:e,type:r,primal_type:n==="object"?"entity":n,isArray:t.isArray===!0,...typeof t.ref=="string"?{ref:t.ref}:{}}},_i={name:"$sql",defaultName:({locale:e})=>e.toLowerCase().startsWith("en")?"Calculated value":"\u8BA1\u7B97\u503C",kind:"scalar",requiresProperty:!1,toSQL({args:e,expression:t,expressions:r,sql:n}){if(t||r&&r.length>0)throw new d("INVALID_SQL_INPUT","$sql does not accept pred; put the expression in args.sql");return br(e.sql,wi(e.parameters),o=>n.value(o))},getOutputProperty({name:e,args:t,inputProperty:r,inputProperties:n}){if(r||n&&n.length>0)throw new d("INVALID_SQL_INPUT","$sql does not accept pred; put the expression in args.sql");return Ai(e,t)}},Ei=e=>{const t=new Set,r=n=>{for(const[o,i]of Object.entries(n)){if(o==="$and"||o==="$or"){for(const s of i)r(s);continue}t.add(o)}};return r(e),[...t]},Ii=e=>typeof e.pred!="string"?e:{...e,pred:{operator:"$sum",pred:e.pred,name:`${e.pred}\u5408\u8BA1`}},Ze=(e,t)=>{if(e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred))return e.pred.operator&&t?.(e.pred.operator).kind==="component"?e.pred:Ze(e.pred,t);if(Array.isArray(e.pred)){for(const r of e.pred)if(typeof r!="string"){const n=Ze(r,t);if(n)return n}}},Ri=(e,t,r)=>{const n=`__rank_component_${t.name??"value"}__`,o=c=>c===r?n:Array.isArray(c)?c.map(o):!c||typeof c!="object"?c:Object.fromEntries(Object.entries(c).map(([u,p])=>[u,o(p)])),i=B(e);i.preds=[{...B(r),name:n}],delete i.having,delete i.sort,delete i.limit,delete i.limitBy,delete i.page,delete i.output,delete i.representation;const s=B(e);s.from=i;const a=[];for(const c of e.groupby??[]){const u=c.name??(typeof c.pred=="string"?c.pred:void 0);u&&a.push({pred:u,name:u})}return s.preds=[...a,...(e.preds??[]).map(c=>o(c))],delete s.groupby,s},Si=(e,t,r)=>{const n=e.preds;if(n.filter(p=>p.operator==="$rank"&&p.query).length!==1)throw new d("AMBIGUOUS_RANK_TARGET","A LogicForm without groupby must contain exactly one $rank pred.query target");const i=Ei(r),[s]=i;if(i.length!==1||!s)throw new d("AMBIGUOUS_RANK_DIMENSION","$rank pred.query must reference exactly one property when groupby is omitted",{properties:i});const a=B(e);a.groupby=[{pred:s,name:s}],a.preds=n.map(p=>{if(p.name!==t.name)return p;const l={...p};return delete l.query,Ii(l)}),delete a.sort,delete a.limit,delete a.limitBy,delete a.page,delete a.output,delete a.representation;const c=n.map(({name:p})=>p).filter(p=>!!p),u=B(e);return u.from=a,u.query=r,u.preds=[{pred:s,name:s},...c.map(p=>({pred:p,name:p}))],delete u.groupby,delete u.having,delete u.entity_id,delete u.propertyResolve,u},Oi={name:"$rank",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`${e} rank`:`${e}\u6392\u540D`,kind:"window",windowFunction:"rank",rewriteLogicform({logicform:e,getOperator:t}){const r=e.groupby?.length?e.preds?.map(o=>Ze(o,t)).find(Boolean):void 0;if(r){const o=e.preds?.find(i=>Ze(i,t)===r);if(o)return Ri(e,o,r)}if(e.groupby?.length)return;const n=e.preds?.find(o=>o.operator==="$rank"&&o.query);return n?.query?Si(e,n,n.query):void 0},validatePlan({pred:e,groupByNames:t}){if(!e.pred||Array.isArray(e.pred))throw new d("INVALID_WINDOW_OPERATOR_INPUT","$rank requires exactly one pred");if(t.length===0&&!e.query&&typeof e.pred!="string")throw new d("RANK_GROUPBY_OR_TARGET_REQUIRED","$rank requires groupby or a pred.query target used to infer the ranking dimension")},getOutputProperty({name:e}){return{name:e,type:"int",primal_type:"number",isArray:!1}}},bi={name:"$rowNumber",defaultName:({locale:e})=>e.toLowerCase().startsWith("en")?"Row number":"\u884C\u53F7",kind:"window",windowFunction:"rowNumber",getOutputProperty({name:e}){return{name:e,type:"int",primal_type:"number",isArray:!1}}},Pi=new Set(["string","number","boolean","date","entity","object"]),Lt=e=>{if(e==="timestamp"||e==="date")return{type:e,primal_type:"date"};if(typeof e=="string"&&Pi.has(e))return{type:e,primal_type:e};throw new d("INVALID_CONSTANT_TYPE","$constant args.type must be timestamp, date, string, number, boolean, entity, or object")},Ni={name:"$constant",defaultName:({locale:e})=>e.toLowerCase().startsWith("en")?"Constant":"\u5E38\u91CF",kind:"scalar",requiresProperty:!1,normalizePred({pred:e}){if(e.pred!==void 0)throw new d("INVALID_CONSTANT_INPUT","$constant does not accept pred");return Lt(e.args?.type),e},toSQL({args:e,sql:t}){return Lt(e.type),t.value(e.value)},getOutputProperty({name:e,args:t}){return{name:e,...Lt(t.type),isArray:!1}}},Ti={name:"$periodBoundary",defaultName:({operandName:e,args:t,locale:r})=>r.toLowerCase().startsWith("en")?`${e} at period ${t.boundary==="start"?"start":"end"}`:`${e}${t.boundary==="start"?"\u671F\u521D":"\u671F\u672B"}`,kind:"scalar",toSQL({expression:e,args:t,sql:r}){if(!e)throw new d("PRED_PROPERTY_REQUIRED","$periodBoundary requires pred");const n=t.boundary;if(n!=="start"&&n!=="end")throw new d("INVALID_PERIOD_BOUNDARY_ARGS","$periodBoundary args.boundary must be start or end");const o=t.granularity;if(typeof o!="string")throw new d("END_OF_PERIOD_GRANULARITY_REQUIRED","$periodBoundary requires the input Property granularity");const i=r.dateBucket(e,o);return r.datePeriodBoundary?r.datePeriodBoundary(e,o,n):n==="start"?i:r.dateShift(r.dateShift(i,o,1),"second",-1)},planExpression({input:e,inputProperty:t,args:r}){if(!e)return;const n=t?.granularity??r.granularity;return{kind:"operator",operator:"$periodBoundary",input:e,args:{...r,granularity:n}}},normalizePred({pred:e,schema:t}){if(!e.pred||Array.isArray(e.pred))throw new d("INVALID_PERIOD_BOUNDARY_INPUT","$periodBoundary requires one pred");if(typeof e.pred=="string"){const r=t.properties.find(({id:n,name:o})=>n===e.pred||o===e.pred);return{...e,args:{...e.args,granularity:r?.granularity}}}return e},getOutputProperty({name:e,inputProperty:t,args:r}){if(!t||t.primal_type!=="date")throw new d("PERIOD_BOUNDARY_DATE_REQUIRED","$periodBoundary requires a date-valued pred");const n=t.granularity??r.granularity;if(typeof n!="string")throw new d("END_OF_PERIOD_GRANULARITY_REQUIRED","$periodBoundary requires the input Property granularity");return{...t,name:e,granularity:n,isArray:!1}}},Pr="__scalarExtremumInputs",Dt=e=>{if(e.schema)return e.schema;if(e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred))return Dt(e.pred);if(Array.isArray(e.pred)){const t=[...new Set(e.pred.flatMap(r=>typeof r=="string"?[]:Dt(r)??[]))];if(t.length===1)return t[0]}},Li=e=>{const t=B(e);return delete t.from,delete t.having,delete t.sort,delete t.limit,delete t.limitBy,delete t.page,delete t.representation,delete t.output,t},Di=(e,t)=>{if(t.args?.[Pr]===!0||!Array.isArray(t.pred))return;if(e.preds?.length!==1)throw new d("SCALAR_EXTREMUM_SINGLE_PROJECTION_REQUIRED",`${t.operator} with multiple pred inputs must be the only LogicForm projection`);const r=t.pred.map((o,i)=>{const s=typeof o=="string"?{pred:o}:B(o),a=s.name??`__scalar_extremum_input_${i}__`,c=s.schema??Dt(s);return{...s,name:a,...c?{schema:c}:{}}}),n=Li(e);return n.preds=r,{version:e.version,from:n,preds:[{operator:t.operator,pred:r.map(({name:o})=>o),...t.name?{name:t.name}:{},args:{...t.args,[Pr]:!0}}],...e.having?{having:e.having}:{},...e.sort?{sort:e.sort}:{},...e.limit!==void 0?{limit:e.limit}:{},...e.page!==void 0?{page:e.page}:{},...e.output?{output:e.output}:{},...e.representation?{representation:e.representation}:{}}},qi=(e,t)=>{const r=e==="$least"?"MIN":"MAX",n=t.map(o=>`SELECT ${o} AS value`).join(" UNION ALL ");return`(SELECT ${r}(value) FROM (${n}) AS __scalar_extremum_values)`},Ci=(e,t,r)=>{const[n,...o]=r??[];if(!n)throw new d("INVALID_OPERATOR_INPUTS",`${e} requires pred inputs`);if(o.some(({primal_type:i})=>i!==n.primal_type))throw new d("INCOMPATIBLE_OPERATOR_INPUTS",`${e} pred inputs must have the same primal type`);return{...n,name:t,isArray:!1}},Nr=e=>({name:e,defaultName:({inputNames:t,locale:r})=>r.toLowerCase().startsWith("en")?`${e==="$least"?"Least":"Greatest"} of ${t.join(", ")}`:`${t.join("\u3001")}\u4E2D\u7684${e==="$least"?"\u6700\u65E9\u503C":"\u6700\u665A\u503C"}`,kind:"scalar",requiresProperty:!1,normalizePred({pred:t}){if(!Array.isArray(t.pred)||t.pred.length<2)throw new d("INVALID_OPERATOR_INPUTS",`${e} requires at least two pred inputs`);return t},rewriteLogicform({logicform:t}){const r=t.preds?.[0];return r?.operator===e?Di(t,r):void 0},toSQL(t){return qi(e,Re(e,t,2,Number.POSITIVE_INFINITY))},getOutputProperty({name:t,inputProperties:r}){return Ci(e,t,r)}}),Ui=Nr("$least"),ji=Nr("$greatest"),Tr=Object.freeze([po,mi,zo,vo,Vo,ri,ei,Uo,li,di,Yo,ai,ii,lo,yi,ni,Zo,fo,hi,Go,Wo,gi,Jo,_i,Oi,bi,Ni,Ti,Ui,ji]);class qt{#e=new Map;constructor(t=[]){for(const r of t)this.register(r)}register(t){if(!t.name)throw new d("INVALID_OPERATOR","Operator name must not be empty");if(typeof t.defaultName!="function")throw new d("INVALID_OPERATOR",`Operator must implement defaultName: ${t.name}`);if(this.#e.has(t.name))throw new d("OPERATOR_ALREADY_REGISTERED",`Operator is already registered: ${t.name}`,{operator:t.name});const r=t;if(!(r.kind==="scalar"&&(typeof r.toSQL=="function"||typeof r.evaluate=="function")||r.kind==="aggregate"&&typeof r.toSQL=="function"||r.kind==="component"&&typeof r.createComponent=="function"||r.kind==="window"&&typeof r.windowFunction=="string"||r.kind==="logical"&&typeof r.planExpression=="function"))throw new d("INVALID_OPERATOR",`Operator kind and implementation do not match: ${t.name}`);return this.#e.set(t.name,t),this}get(t){const r=this.#e.get(t);if(!r)throw new d("OPERATOR_NOT_FOUND",`Operator is not registered: ${t}`,{operator:t});return r}requiresPerPeriodEvaluation(t,r){return this.get(t).requiresPerPeriodEvaluation?.(r)??!1}has(t){return this.#e.has(t)}definitions(){return[...this.#e.values()]}}const ki=Object.freeze([...Tr,...gr.flatMap(({operators:e})=>e??[])]),we=(e=[])=>new qt([...Tr,...Ke(e).flatMap(({operators:t})=>t??[])]),Mi=(e,t)=>{const r=yo(e,t);return{schemaId:e.id,propertyId:r.id,propertyName:r.name,physicalColumn:r.udf?.sql??r.id}},Lr=(e,t,r)=>{const n=e.fieldReferences?.[r];return n?{schemaId:n.schemaId,propertyId:n.propertyId??n.column,propertyName:n.property,physicalColumn:n.sql??n.column}:Mi(t,r)},Me=(e,t,r,n)=>{if(e.kind==="column")return{sources:[{schemaId:e.schemaId??r.id,propertyId:e.propertyId??e.column,propertyName:e.property,physicalColumn:e.column}],transformations:["projection"]};if(e.kind==="property-sql")return{sources:[{schemaId:e.schemaId,propertyId:e.propertyId,propertyName:e.property,physicalColumn:e.sql}],transformations:["property-sql"]};if(e.kind==="array-element")return{sources:[{schemaId:e.schemaId,propertyId:e.property,propertyName:e.property,physicalColumn:e.property}],transformations:["array-expand"]};if(e.kind==="window"){const c=[e.input,...e.partitionBy].map(u=>Me(u,t,r,n));return{sources:c.flatMap(({sources:u})=>u),transformations:[...c.flatMap(({transformations:u})=>u).filter(u=>u!=="projection"),`window:${e.function}`]}}if(e.kind==="cumulative"){const c=[e.input,...e.partitionBy,...e.orderBy.map(({expression:u})=>u)].map(u=>Me(u,t,r,n));return{sources:c.flatMap(({sources:u})=>u),transformations:[...c.flatMap(({transformations:u})=>u).filter(u=>u!=="projection"),`window:cumulative:${e.function}`]}}if(e.kind==="ordinal-encode"||e.kind==="ordinal-decode"){const c=Me(e.input,t,r,n);return{sources:c.sources,transformations:[...c.transformations.filter(u=>u!=="projection"),`ordinal:${e.kind==="ordinal-encode"?"encode":"decode"}`]}}const o=[...e.input?[e.input]:[],...e.inputs??[]].map(c=>Me(c,t,r,n)),i={sources:o.flatMap(({sources:c})=>c),transformations:o.flatMap(({transformations:c})=>c)},s=n.get(e.operator),a=new Set([...e.property?[e.property]:[],...s.dependencies??[],...Xe(e.query)]);return{sources:[...i.sources,...[...a].filter(c=>!i.sources.some(u=>u.propertyName===c)).map(c=>Lr(t,r,c))],transformations:[...i.transformations.filter(c=>c!=="projection"),`operator:${e.operator}`]}};function Xe(e){if(!e)return[];const t=[];for(const[r,n]of Object.entries(e))if((r==="$and"||r==="$or")&&Array.isArray(n))for(const o of n)typeof o=="object"&&o!==null&&!Array.isArray(o)&&t.push(...Xe(o));else r.startsWith("$")||t.push(r);return t}const ue=e=>e.kind==="window"?[...ue(e.input),...e.partitionBy.flatMap(ue)]:e.kind==="cumulative"?[...ue(e.input),...e.partitionBy.flatMap(ue),...e.orderBy.flatMap(({expression:t})=>ue(t))]:e.kind==="ordinal-encode"||e.kind==="ordinal-decode"?ue(e.input):e.kind==="operator"?[...Xe(e.query),...e.input?ue(e.input):[],...(e.inputs??[]).flatMap(ue)]:[],Dr=(e,t,r,n=we())=>{if(e.subplans){const o=e.subplans.map(i=>Dr(i,t,r,n));return{source:{schemaId:t.id,schemaName:t.name,physicalTable:o.map(({source:i})=>i.physicalTable).join(", "),provider:r.kind},outputs:e.projections.map(({name:i})=>{const s=o.flatMap(({outputs:a})=>a.filter(c=>c.name===i));return{name:i,sources:s.flatMap(({sources:a})=>a),transformations:[...new Set([...s.flatMap(({transformations:a})=>a),"compose"])]}}),filters:o.flatMap(({filters:i})=>i)}}return{source:{schemaId:t.id,schemaName:t.name,physicalTable:e.source,provider:r.kind},outputs:e.projections.map(o=>({name:o.name,...Me(o.expression,e,t,n)})),filters:[...new Set([...Xe(e.query),...e.projections.flatMap(({expression:o})=>ue(o))])].map(o=>Lr(e,t,o))}},ie=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&typeof e.version=="string"&&(typeof e.schema=="string"||typeof e.from=="object"),Qi=/^(\d{2}):(\d{2})(?::(\d{2}))?$/,qr=e=>{const t=Qi.exec(e);if(!t)return;const r=Number(t[1]),n=Number(t[2]),o=Number(t[3]??0);if(!(r>23||n>59||o>59))return{hour:r,minute:n,second:o}},Bi=e=>{const t=e.freshness;if(t){if(t.mode==="ttl"){if(!Number.isInteger(t.ttlSeconds)||t.ttlSeconds<=0)throw new d("INVALID_SOURCE_FRESHNESS","TTL freshness requires a positive integer ttlSeconds");return}if(t.mode==="daily"){if(!qr(t.expireAt))throw new d("INVALID_SOURCE_FRESHNESS","Daily freshness expireAt must use HH:mm or HH:mm:ss");if(t.timeZone)try{new Intl.DateTimeFormat("en-US",{timeZone:t.timeZone}).format()}catch{throw new d("INVALID_SOURCE_FRESHNESS",`Invalid freshness timeZone: ${t.timeZone}`)}}}};class Ct{#e=new Map;constructor(t=[]){for(const r of t)this.register(r)}register(t){if(!t.schemaId)throw new d("INVALID_SCHEMA_MAPPING","Schema mapping schemaId must not be empty");if(!t.source)throw new d("INVALID_SCHEMA_MAPPING","Schema mapping source must not be empty");if(t.sourceSql!==void 0&&t.sourceSql.trim().length===0)throw new d("INVALID_SCHEMA_MAPPING","Schema mapping sourceSql must not be empty");if(t.id!==void 0&&!t.id)throw new d("INVALID_SCHEMA_MAPPING","Schema mapping id must not be empty");if(t.connectionId.trim().length===0)throw new d("INVALID_SCHEMA_MAPPING","Schema mapping connectionId must not be empty");if(t.priority!==void 0&&!Number.isFinite(t.priority))throw new d("INVALID_SCHEMA_MAPPING","Schema mapping priority must be finite");for(const o of t.mappings??[]){if(o.mappingType==="property"&&(!o.sourceColumn||!o.propertyTarget?.length))throw new d("INVALID_SCHEMA_MAPPING","Schema mapping property items require sourceColumn and propertyTarget");if(o.mappingType==="predItem"&&(!o.sourceColumn||!o.predItem?.operator||typeof o.predItem.pred!="string"))throw new d("INVALID_SCHEMA_MAPPING","Schema mapping PredItem items require sourceColumn and predItem operator/pred")}Bi(t);const r=this.#e.get(t.schemaId)??[],n=t.id??t.source;if(r.some(o=>(o.id??o.source)===n||o.source===t.source))throw new d("SCHEMA_MAPPING_ALREADY_REGISTERED",`Schema mapping is already registered: ${t.schemaId}:${n}`,{schemaId:t.schemaId,mappingId:n});return this.#e.set(t.schemaId,[...r,t]),this}get(t){const r=this.list(t);if(r.length===1)return r[0];const n=r.filter(o=>(o.mappings??[]).length===0);if(n.length===1)return n[0];throw new d("SCHEMA_MAPPING_AMBIGUOUS",`Schema ${t} has multiple mappings and requires LogicForm-based selection`,{schemaId:t,mappingIds:r.map(o=>o.id??o.source)})}list(t){const r=this.#e.get(t);if(!r||r.length===0)throw new d("SCHEMA_MAPPING_NOT_FOUND",`Schema mapping is not registered: ${t}`,{schemaId:t});return r}findSource(t,r){return this.#e.get(t)?.find(n=>n.source===r)}}const Yi=e=>{if(e.tablePath?.trim())return e.tablePath;const t=[e.physicalDatabase,e.physicalSchema,e.physicalTable].filter(r=>!!r?.trim());if(t.length>0)return t.join(".");if(e.sourceSql?.trim())return e.sourceSql;throw new d("INVALID_SCHEMA_MAPPING",`YiAsk Schema mapping ${e.id} has no physical source`)},Vi=e=>{if(!e.schemaSid||!e.datasourceSid)throw new d("INVALID_SCHEMA_MAPPING","YiAsk Schema mapping requires schemaSid and datasourceSid");if(e.enabled===!1)throw new d("INVALID_SCHEMA_MAPPING",`YiAsk Schema mapping is disabled: ${e.id}`);const t=[];for(const r of e.mappings){if(r.mappingType==="property"){if(!r.sourceColumn||!r.propertyTarget?.length)continue;t.push(r);continue}r.mappingType==="predItem"&&(!r.sourceColumn||!r.predItem?.operator||typeof r.predItem.pred!="string"||t.push(r))}return{id:String(e.id),schemaId:e.schemaSid,connectionId:e.datasourceSid,source:Yi(e),...e.sourceSql?{sourceSql:e.sourceSql}:{},mappings:t}},Fi=(e,t)=>!!(e&&t?.temporalSemantics==="snapshot"&&e.type!=="timestamp"),Ut="$periodValue",Hi=(e,t)=>{const r=t?.observationPolicy?.({pred:e});if(r)return{operator:Ut,...r};if(t?.kind==="aggregate")throw new d("OBSERVATION_REQUIRES_PERIOD_BOUNDARY",`Observation metrics must use ${Ut}; ${t.name} describes a time range`,{operator:t.name});return{operator:Ut,boundary:"end",implicit:!0}},Gi={name:"observation",resolveProjection({pred:e,schema:t,sourceProperty:r,outputProperty:n,operator:o}){if(!r||!Fi(r,t))return;const i=r,s=Hi(e,o);return{outputProperty:{...n,temporal:{kind:"period-boundary",boundary:s.boundary,sourceProperty:i.name}}}}},Cr=e=>{if(e.type!=="entity")return;const t=e.properties.find(o=>o.type==="timestamp"),r=e.properties.find(o=>o.type==="start_date"),n=e.properties.find(o=>o.type==="end_date");return t&&r&&n?{timestamp:t,start:r,end:n}:void 0},Wi=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),zi=e=>Wi(e)?e.$lte??e.$lt??e.$eq:e,vi=(e,t)=>{if(!e)return e;const r=Object.entries(e).find(([s])=>s===t.timestamp.name);if(!r)return e;const[,n]=r,o=zi(n);return o===void 0?e:{...Object.fromEntries(Object.entries(e).filter(([s])=>s!==t.timestamp.name)),[t.start.name]:e[t.start.name]??{$lte:o},[t.end.name]:e[t.end.name]??{$or:[{$exists:!1},{$gte:o}]}}},xi={name:"lifecycle",resolveQuery({logicform:e,schema:t,query:r}){const n=Cr(t);return!n||e.groupby?.some(o=>typeof o.pred=="string"&&o.pred===n.timestamp.name)?r:vi(r,n)},resolveProjection({schema:e,outputProperty:t}){if(Cr(e))return{outputProperty:{...t,temporal:{kind:"lifecycle"}}}}};class Ur{#e=new Map;constructor(t=[]){for(const r of t)this.register(r)}register(t){if(!t.name)throw new d("INVALID_SEMANTIC_RULE","Semantic rule name must not be empty");if(this.#e.has(t.name))throw new d("SEMANTIC_RULE_ALREADY_REGISTERED",`Semantic rule is already registered: ${t.name}`,{rule:t.name});return this.#e.set(t.name,t),this}resolveProjection(t){return[...this.#e.values()].reduce((r,n)=>n.resolveProjection?.({...t,outputProperty:r})?.outputProperty??r,t.outputProperty)}resolveQuery(t){return[...this.#e.values()].reduce((r,n)=>n.resolveQuery?.({...t,...r?{query:r}:{}})??r,t.query)}rules(){return[...this.#e.values()]}}const jr=()=>new Ur([Gi,xi]),kr=e=>e.id??e.source,et=(e,t)=>{if(e===t)return!0;if(e instanceof Date||t instanceof Date)return e instanceof Date&&t instanceof Date&&e.getTime()===t.getTime();if(Array.isArray(e)||Array.isArray(t))return Array.isArray(e)&&Array.isArray(t)&&e.length===t.length&&e.every((o,i)=>et(o,t[i]));if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;const r=Object.entries(e),n=t;return r.length===Object.keys(n).length&&r.every(([o,i])=>Object.prototype.hasOwnProperty.call(n,o)&&et(i,n[o]))},be=e=>{if(!e)return[];const t=[];for(const[r,n]of Object.entries(e))if(n!==void 0){if(r==="$or")return;if(r==="$and"){if(!Array.isArray(n))return;for(const o of n){const i=be(o);if(!i)return;t.push(...i)}continue}if(r.startsWith("$"))return;t.push({property:r,condition:n})}return t},jt=(e,t,r)=>{if(!e)return;const n={};for(const[o,i]of Object.entries(e))if(i!==void 0){if(o==="$and"&&Array.isArray(i)){const s=i.map(a=>jt(a,t,r)).filter(a=>a!==void 0);s.length>0&&(n[o]=s);continue}o!=="$or"&&t.some(s=>tt(r,s.property,o)&&et(s.condition,i))||(n[o]=i)}return Object.keys(n).length>0?n:void 0},Ae=(e,t)=>e.properties.find(({id:r,name:n})=>r===t||n===t),tt=(e,t,r)=>t===r||Ae(e,t)?.id===Ae(e,r)?.id&&Ae(e,t)!==void 0&&Ae(e,r)!==void 0,kt=(e,t,r)=>{const n=Ae(t,r);return n?(e.mappings??[]).find(i=>i.mappingType==="property"&&i.propertyTarget?.some(s=>tt(t,s,r)))?.sourceColumn??((e.mappings??[]).some(i=>i.mappingType==="property")?void 0:n.id):void 0},Mt=(e,t,r)=>!(e.mappings??[]).some(n=>n.mappingType==="property")||kt(e,t,r)!==void 0,Mr=(e,t,r)=>{if(!e||!(t.mappings??[]).some(i=>i.mappingType==="property"))return;const n=be(e);if(!n)return"query contains an unsupported logical expression";const o=n.find(({property:i})=>!Mt(t,r,i));return o?`query property is not available: ${o.property}`:void 0},rt=e=>[...typeof e.pred=="string"?[e.pred]:e.pred&&!Array.isArray(e.pred)?rt(e.pred):[],...Array.isArray(e.pred)?e.pred.flatMap(t=>typeof t=="string"?[t]:rt(t)):[]],Ki=(e,t,r,n,o)=>{if(e.match.schema!==void 0&&e.match.schema!==n)return!1;const i=typeof t.pred=="string"?Ae(r,t.pred):void 0,s=Ae(r,e.match.pred),a=typeof t.pred=="string"&&tt(r,t.pred,e.match.pred)&&!!(i&&s);if(t.operator!==e.match.operator||!a||Array.isArray(t.pred)||t.args&&Object.keys(t.args).length>0)return!1;const c=be(e.match.query);return c!==void 0&&c.every(u=>o.some(p=>tt(r,p.property,u.property)&&et(p.condition,u.condition)))},Ji=(e,t,r)=>{const n=(r.mappings??[]).flatMap(l=>{if(l.mappingType!=="predItem"||!l.sourceColumn||!l.predItem||!l.predItem.operator||typeof l.predItem.pred!="string")return[];const f=l.predItem,h=f.operator,y=f.pred;return!h||typeof y!="string"?[]:[{match:{operator:h,pred:y,...f.schema?{schema:f.schema}:{},...f.query?{query:f.query}:{}},column:l.sourceColumn}]}),o=(r.mappings??[]).some(l=>l.mappingType==="property");if(n.length===0&&!o)return{mapping:r,logicform:e,predRewrites:[],priority:r.priority??0,specificity:0};const i=be(e.query);if(!i&&n.length>0)return"query contains $or or another unsupported logical expression";const s=B(e),a=[],c=[];for(const[l,f]of(e.preds??[]).entries()){const h=be(f.query);if(!h&&n.length>0)return`PredItem ${l} query contains an unsupported logical expression`;if(n.length>0){const A=[...i??[],...h??[]],R=n.filter(m=>Ki(m,f,t,f.schema??t.id,A));if(R.length===0)return`PredItem ${l} is not mapped`;if(R.length>1)return`PredItem ${l} matches multiple mapping rules`;const b=R[0],g=be(b.match.query)??[];c.push(...g);const S=s.preds?.[l];if(S){const m=jt(S.query,g,t);m?S.query=m:delete S.query}a.push({predIndex:l,column:b.column});continue}const y=rt(f).find(A=>!Mt(r,t,A));if(y)return`PredItem ${l} property is not available: ${y}`}const u=jt(s.query,c,t);u?s.query=u:delete s.query;const p=Mr(s.query,r,t);if(p)return p;for(const[l,f]of(s.preds??[]).entries()){const h=Mr(f.query,r,t);if(h)return`PredItem ${l} ${h}`}for(const l of s.groupby??[]){const h=rt(l).find(y=>!Mt(r,t,y));if(h)return`groupby property is not available: ${h}`}return{mapping:r,logicform:s,predRewrites:a,priority:r.priority??0,specificity:a.length}},Zi=(e,t,r)=>{const n=[],o=[];for(const a of r.list(t.id)){const c=Ji(e,t,a);typeof c=="string"?o.push({mappingId:kr(a),reason:c}):n.push(c)}if(n.length===0){const a=t.name&&t.name!==t.id?`${t.name}(${t.id})`:t.id;throw new d("QUERY_NOT_COVERED_BY_DATA_SOURCE",`Schema\u300C${a}\u300D\u5F53\u524D\u63A5\u5165\u7684\u6570\u636E\u4E0D\u652F\u6301\u6B64\u95EE\u9898\u3002\u5982\u9700\u652F\u6301\uFF0C\u9700\u8981\u63A5\u5165\u660E\u7EC6\u5C42\u6570\u636E\uFF0C\u8BF7\u8054\u7CFB\u6570\u636E\u7BA1\u7406\u5458\u3002`,{schemaId:t.id,requiredDataLayer:"detail",rejectedMappings:o})}n.sort((a,c)=>c.priority-a.priority||c.specificity-a.specificity);const i=n[0],s=n.filter(({priority:a,specificity:c})=>a===i.priority&&c===i.specificity);if(s.length>1)throw new d("SCHEMA_MAPPING_AMBIGUOUS",`Multiple Schema mappings cover the LogicForm for ${t.id}`,{schemaId:t.id,mappingIds:s.map(({mapping:a})=>kr(a))});return i},Xi=(e,t)=>`result:${e}:${t.map(({name:r,type:n,primal_type:o})=>`${r}:${n}:${o}`).join("|")}`,Qr=(e,t)=>{const r=(e.columnProperties??[]).map(n=>({...n,id:n.name}));return{id:Xi(e.schemaId,e.columnProperties??[]),name:`${t.name} result`,type:t.type,temporalSemantics:"normal",properties:r}},Br=(e,t)=>({...Qr(e,t),id:t.id,name:t.name,type:t.type}),Qt=e=>{if(!e.name)throw new d("MISSING_PRED_NAME","Planner requires every normalized PredItem to have a name");return e.name},es=(e,t,r)=>{const n=new Set(r),o=(i,s)=>{if(!(ie(i)||i===null)){if(Array.isArray(i)){i.forEach(a=>o(a,s));return}if(typeof i=="object"){Object.entries(i).forEach(([a,c])=>{["args","$exists","$regex","$contains"].includes(a)||o(c,a)});return}if(!(s&&["args","$exists","$regex","$contains"].includes(s))&&(typeof i!="string"||!n.has(i)))throw new d("COMPARABLE_VALUE_NOT_FOUND",`Comparable category ${t} does not contain value: ${JSON.stringify(i)}`,{property:t,value:i})}};o(e)},ts=(e,t,r)=>{if(!t.udf)return{};const o=t.udf.sql.includes("$TS")?e.properties.find(({type:i})=>i==="timestamp")?.id:void 0;return{sql:t.udf.sql,...o?{timestampColumn:o}:{},...o&&r?{timestampQualifier:r}:{}}},Yr=e=>e.sql?{kind:"property-sql",schemaId:e.schemaId,property:e.property,propertyId:e.column,sql:e.sql,qualifier:e.qualifier,...e.timestampColumn?{timestampColumn:e.timestampColumn}:{},...e.timestampQualifier?{timestampQualifier:e.timestampQualifier}:{}}:{kind:"column",...e},Vr=(e,t,r={})=>({name:e,type:t.type,primal_type:t.primal_type,isArray:t.isArray,...t.ref?{ref:t.ref}:{},...t.comparable?{comparable:t.comparable}:{},...r}),Qe=(e,t,r,n,o,i,s,a,c="projection")=>{const u=Qt(e);if(c==="groupby"&&e.query)throw new d("GROUPBY_QUERY_NOT_ALLOWED","A groupby expression cannot define pred.query");if(!e.operator){if(typeof e.pred!="string")throw new d("PRED_PROPERTY_REQUIRED","A projection must reference a property");const g=r(e.pred);return{expression:Yr(g.field),outputProperty:Vr(g.reference,g.property),sourceProperty:g.property,sourceField:g.field}}const p=t.get(e.operator);if(c==="groupby"&&p.kind!=="scalar")throw new d("OPERATOR_NOT_ALLOWED_IN_GROUPBY",`Operator ${e.operator} cannot be used in groupby`,{operator:e.operator});if(c==="groupby"&&!p.toSQL)throw new d("JAVASCRIPT_OPERATOR_NOT_ALLOWED_IN_GROUPBY",`JavaScript-only operator ${e.operator} cannot be used in groupby`,{operator:e.operator});if(p.planInput&&typeof e.pred!="string")throw new d("OPERATOR_DIRECT_PROPERTY_REQUIRED",`${e.operator} requires a direct property pred`);const l=p.planInput&&typeof e.pred=="string"?p.planInput({reference:e.pred,args:e.args??{},schema:s,...a?{resolveSchema:a}:{}}):void 0,f=l?.reference??e.pred,h=l?.args??e.args??{},y=f&&typeof f=="object"&&!Array.isArray(f)?Qe(f,t,r,n,o,i,s,a,c):typeof f=="string"?Qe({pred:f,name:f},t,r,n,o,i,s,a,c):void 0,A=Array.isArray(f)?f.map(g=>Qe(typeof g=="string"?{pred:g,name:g}:g,t,r,n,o,i,s,a,c)):[];if(p.requiresProperty!==!1&&!y&&A.length===0)throw new d("PRED_PROPERTY_REQUIRED",`${e.operator} requires a property`);const R=u,b=p.getOutputProperty?.({name:R,...y?.sourceProperty?{property:y.sourceProperty}:{},...y?{inputProperty:{...y.outputProperty,name:R}}:{},...A.length>0?{inputProperties:A.map(({outputProperty:g})=>g)}:{},args:h})??(y?Vr(R,y.outputProperty,{isArray:!1}):{name:R,type:"number",primal_type:"number",isArray:!1});if(p.planExpression){const g=p.planExpression({pred:e,...y?{input:y.expression,inputProperty:y.outputProperty}:{},inputs:A.map(({expression:S})=>S),args:h,resolveKey:o,getOperator:S=>t.get(S),planQuery:i});if(g)return{expression:g,outputProperty:b,...y?.sourceProperty?{sourceProperty:y.sourceProperty}:{},...y?.sourceField?{sourceField:y.sourceField}:{}}}if(p.kind==="window"){if(!y||A.length>0||e.query)throw new d("INVALID_WINDOW_OPERATOR_INPUT",`${e.operator} requires exactly one nested pred and does not accept pred.query`);const g=e.args?.direction??"desc";if(g!=="asc"&&g!=="desc")throw new d("INVALID_WINDOW_ARGS",`${e.operator} direction must be asc or desc`);const S=e.args?.partitionBy??[];if(!Array.isArray(S)||S.some(m=>typeof m!="string"))throw new d("INVALID_WINDOW_ARGS",`${e.operator} partitionBy must be an array of groupby names`);return{expression:{kind:"window",function:p.windowFunction,input:y.expression,partitionBy:S.map(m=>n(String(m))),direction:g==="asc"?"ASC":"DESC"},outputProperty:b}}return{expression:{kind:"operator",operator:e.operator,args:h,...e.query?{query:i(e.query)}:{},...y?{input:y.expression}:{},...A.length>0?{inputs:A.map(({expression:g})=>g)}:{},...y?.sourceProperty?{property:y.sourceProperty.name,column:y.sourceProperty.id}:{},...y?.sourceField?{qualifier:y.sourceField.qualifier,schemaId:y.sourceField.schemaId}:{}},outputProperty:b,...y?.sourceProperty?{sourceProperty:y.sourceProperty}:{},...y?.sourceField?{sourceField:y.sourceField}:{}}},rs=(e,t,r,n,o,i,s,a,c,u)=>{const p=Qt(e),l=typeof e.pred=="string"?e.pred:void 0,h=Qe(e,t,!u||!l?r:A=>{const R=r(A);return A===l?{...R,field:{...R.field,column:u}}:R},n,o,i,s,a),y=c?.resolveProjection({pred:e,schema:s,...h.sourceProperty?{sourceProperty:h.sourceProperty}:{},outputProperty:{...h.outputProperty,name:p},...e.operator?{operator:t.get(e.operator)}:{}})??{...h.outputProperty,name:p};return{name:p,expression:h.expression,outputProperty:y}},ns=e=>{const t=new Set;for(const r of e){if(r.name==="_id")throw new d("RESERVED_OUTPUT_NAME","Output name _id is reserved for executor-owned row identity");if(t.has(r.name))throw new d("DUPLICATE_OUTPUT_NAME",`Duplicate output name: ${r.name}`);t.add(r.name)}},Bt=(e,t,r)=>{if(!e.schema||e.schema===t.id)return t;const n=r.resolveSchema?.(e.schema);if(!n)throw new d("SCHEMA_RESOLVER_REQUIRED",`Cannot plan nested LogicForm schema without a schema resolver: ${e.schema}`,{schemaId:e.schema});return n},os=(e,t,r,n,o,i)=>{if(t.length<2)throw new d("COMPOSITION_REQUIRES_MULTIPLE_BRANCHES","A cross-Schema plan requires at least two branches");const s=t.map(A=>se(A,Bt(A,r,i),n,o,i)),a=s[0]?.groupBy.map(({name:A})=>A)??[];for(const A of s){const R=A.groupBy.map(({name:b})=>b);if(R.length!==a.length||R.some((b,g)=>b!==a[g]))throw new d("INCOMPATIBLE_COMPOSITION_GROUPBY","All composed LogicForm objects must have the same groupby output names in the same order",{expected:a,received:R});if(A.rowIdentity.kind!==(a.length>0?"group":"singleton"))throw new d("UNSTABLE_COMPOSITION_IDENTITY","Composed LogicForm objects must be grouped or aggregate to a singleton row")}const c=[],u=[],p=new Map;s.forEach((A,R)=>{A.projections.forEach((b,g)=>{const S=a.includes(b.name),m=p.get(b.name);if(m!==void 0&&!S)throw new d("DUPLICATE_COMPOSITION_OUTPUT",`Composed LogicForm objects produce the same output: ${b.name}`,{name:b.name,childIndexes:[m,R]});if(m!==void 0)return;p.set(b.name,R),c.push({name:b.name,expression:{kind:"column",property:b.name,column:b.name}});const I=A.columnProperties?.[g];I&&u.push(I)})});const l=new Set(c.map(({name:A})=>A)),f=Object.entries(e.sort??{}).map(([A,R])=>{if(!l.has(A))throw new d("INVALID_SORT",`Sort field is not an output: ${A}`);const b=u.find(g=>g.name===A);return{name:A,direction:R===1?"ASC":"DESC",...b?.comparable?{comparable:b.comparable}:{},...b?.comparable?{expression:{kind:"column",property:A,column:A}}:{}}}),h=e.limitBy===void 0||a.length<2?void 0:{count:e.limitBy,partitionBy:a.slice(0,-1),orderBy:f.length>0?f:(()=>{const A=a.at(-1)??"",R=u.find(b=>b.name===A);return[{name:A,direction:"ASC",...R?.comparable?{comparable:R.comparable}:{}}]})()},y=e.limitBy!==void 0&&a.length<2?{kind:"rows",page:1,pageSize:e.limitBy}:void 0;return{schemaId:r.id,source:"",subplans:s,fields:Object.fromEntries(c.map(({name:A})=>[A,A])),projections:c,columnProperties:u,groupBy:c.filter(({name:A})=>a.includes(A)),orderBy:f,rowIdentity:a.length>0?{kind:"group",names:a,separator:"_",nullLabel:"\u7A7A\u503C"}:{kind:"singleton"},...h?{groupLimit:h}:{},...y?{pagination:y}:{}}},se=(e,t,r=we(),n=new Ct,o={})=>{const i=[...new Set((e.preds??[]).map($=>$.schema).filter($=>!!($&&$!==t.id)))];if(i.length>0){const $=e.propertyResolve??{},w=[t.id,...i].map(_=>({...e,schema:_,preds:(e.preds??[]).filter(O=>(O.schema??t.id)===_).map(({schema:O,...D})=>D),..._===t.id||!e.query?{}:{query:Object.fromEntries(Object.entries(e.query).map(([O,D])=>{let T=O;try{T=G(t,O,o.resolveSchema).canonicalName}catch{}return[$[_]?.[O]??$[_]?.[T]??O,D]}))},..._!==t.id&&e.groupby?{groupby:e.groupby.map(O=>({...O,...typeof O.pred=="string"?{pred:$[_]?.[O.pred]??(()=>{try{return $[_]?.[G(t,O.pred,o.resolveSchema).canonicalName]??O.pred}catch{return O.pred}})()}:{}}))}:{}}));return os(e,w,t,r,n,o)}for(const $ of e.preds??[]){if(!$.operator)continue;const w=r.get($.operator).rewriteLogicform?.({logicform:e,schema:t,getOperator:_=>r.get(_)});if(w)return se(w,t,r,n,o)}const s=o.semanticRegistry??jr();if(e.from){const $=Bt(e.from,t,o),w=se(e.from,$,r,n,o),_=Br(w,t),O={...e};delete O.from,O.schema??=_.id;const D=se(O,_,r,n,o),T=new Set(D.projections.map(({name:Z})=>Z)),H=w.rowIdentity.kind==="group"&&w.rowIdentity.names.every(Z=>T.has(Z))||w.rowIdentity.kind==="singleton"?w.rowIdentity:{kind:"generated"};return{...D,source:w.source,sourcePlan:w,sourceLogicform:e.from,rowIdentity:H}}if(!e.schema)throw new d("LOGICFORM_SCHEMA_REQUIRED","A physical LogicForm must define schema");const a=Zi(e,t,n);e=a.logicform;const c=new Map(a.predRewrites.map(({predIndex:$,column:w})=>[$,w])),u=s.resolveQuery({logicform:e,schema:t,...e.query?{query:e.query}:{}}),p=t.id,l=new Map,f=new Map,h=new Map,y=$=>{const w=G(t,$,o.resolveSchema);let _=p;const O=[];for(const T of w.relations){O.push(T.property.name);const H=O.join("_"),Z=H;if(!l.has(H)){const E=T.targetSchema.properties.filter(({type:Q})=>Q==="ID"),[N]=E;if(E.length!==1||!N)throw new d(T.targetSchema.temporalSemantics==="snapshot"?"SNAPSHOT_JOIN_REQUIRES_ID_AND_TIMESTAMP":"RELATION_TARGET_ID_REQUIRED",T.targetSchema.temporalSemantics==="snapshot"?`Snapshot Schema ${T.targetSchema.id} requires an ID Property when joined`:`Relation target ${T.targetSchema.id} must contain exactly one ID property`,{schemaId:T.targetSchema.id,count:E.length});const j=T.sourceSchema.properties.find(({type:Q})=>Q==="timestamp"),L=T.targetSchema.properties.find(({type:Q})=>Q==="timestamp"),Y=j?.id,C=L?.id;if(T.targetSchema.temporalSemantics==="snapshot"){if(!L)throw new d("SNAPSHOT_JOIN_REQUIRES_ID_AND_TIMESTAMP",`Snapshot Schema ${T.targetSchema.id} requires an ID and timestamp Property when joined`,{schemaId:T.targetSchema.id});if(!j)throw new d("SNAPSHOT_JOIN_SOURCE_TIMESTAMP_REQUIRED",`Snapshot Schema ${T.targetSchema.id} cannot join from a Schema without a timestamp Property`,{schemaId:T.sourceSchema.id});const Q=["second","minute","hour","day","week","month","quarter","year"],oe=j.granularity??"day",fe=L.granularity??"day";if(Q.indexOf(oe)>Q.indexOf(fe))throw new d("SNAPSHOT_JOIN_GRANULARITY_TOO_COARSE",`Cannot join ${T.targetSchema.id} snapshot granularity ${fe} to coarser source granularity ${oe}`,{sourceSchemaId:T.sourceSchema.id,targetSchemaId:T.targetSchema.id,sourceGranularity:oe,targetGranularity:fe})}const x=T.property.isArray?H:void 0;x&&!f.has(x)&&f.set(x,{path:x,sourceAlias:_,sourceColumn:T.property.id,...T.property.udf?{sourceSql:T.property.udf.sql,...Y?{sourceTimestampColumn:Y}:{}}:{},alias:`__array_${H}`});const v=n.get(T.targetSchema.id);l.set(H,{kind:"left",path:H,sourceAlias:_,sourceColumn:T.property.id,...T.property.udf?{sourceSql:T.property.udf.sql,...Y?{sourceTimestampColumn:Y}:{}}:{},targetSchemaId:T.targetSchema.id,targetSource:v.source,...v.sourceSql?{targetSourceSql:v.sourceSql}:{},targetAlias:Z,targetColumn:N.id,...x?{sourceArrayExpansionPath:x}:{},...N.udf?{targetSql:N.udf.sql,...C?{targetTimestampColumn:C}:{}}:{},...T.targetSchema.temporalSemantics==="snapshot"&&Y?{sourceTimestampColumn:Y,sourceTimestampGranularity:j.granularity??"day"}:{},...T.targetSchema.temporalSemantics==="snapshot"&&C?{targetTimestampColumn:C,targetTimestampGranularity:L.granularity??"day"}:{}})}_=Z}const D={schemaId:w.schema.id,property:w.property.name,propertyId:w.property.id,column:w.relations.length===0?kt(a.mapping,t,w.canonicalName)??w.property.id:w.property.id,qualifier:_,...w.property.isArray?{isArray:!0}:{},...w.property.comparable?{comparable:w.property.comparable}:{},...ts(w.relations.length>0?t:w.schema,w.property,w.relations.length>0?p:_)};return h.set(w.canonicalName,D),{reference:w.canonicalName,schema:w.schema,property:w.property,field:D}},A=$=>{if($)for(const[w,_]of Object.entries($))if((w==="$and"||w==="$or")&&Array.isArray(_))for(const O of _)typeof O=="object"&&O!==null&&!Array.isArray(O)&&A(O);else w.startsWith("$")||y(w)},R=$=>{if(ie($)){const w=Bt($,t,o),_=se($,w,r,n,o);if(_.projections.length!==1)throw new d("SUBQUERY_SINGLE_COLUMN_REQUIRED",`Query LogicForm must output exactly one column, received ${_.projections.length}`,{schemaId:$.schema,projectionCount:_.projections.length});return{kind:"logicform-subquery",plan:_}}return Array.isArray($)?$.map(R):typeof $!="object"||$===null||$ instanceof Date?$:Object.fromEntries(Object.entries($).map(([w,_])=>[w,R(_)]))},b=($,w)=>{if(typeof w!="object"||w===null||Array.isArray(w))throw new d("INVALID_RECURSIVE_QUERY","$recursive must be normalized before planning");const _=w,O=y($),D=typeof _.schema=="string"?_.schema:O.property.ref??O.schema.id,T=D===t.id?t:o.resolveSchema?.(D);if(!T)throw new d("SCHEMA_RESOLVER_REQUIRED",`$recursive requires Schema ${D}`);const H=T.properties.find(({id:N,name:j})=>N===_.idProperty||j===_.idProperty),Z=T.properties.find(({id:N,name:j})=>N===_.parentProperty||j===_.parentProperty);if(!H)throw new d("RECURSIVE_ID_PROPERTY_REQUIRED",`$recursive ID property not found: ${String(_.idProperty)}`);if(!Z)throw new d("RECURSIVE_PARENT_PROPERTY_REQUIRED",`$recursive parent property not found: ${String(_.parentProperty)}`);if(!Array.isArray(_.roots)||typeof _.includeSelf!="boolean")throw new d("INVALID_RECURSIVE_QUERY","$recursive must be normalized before planning");const E=n.get(D);return{kind:"recursive-query",schemaId:D,source:E.source,...E.sourceSql?{sourceSql:E.sourceSql}:{},idColumn:H.id,parentColumn:Z.id,roots:_.roots,includeSelf:_.includeSelf}},g=$=>Object.fromEntries(Object.entries($).map(([w,_])=>{if((w==="$and"||w==="$or")&&Array.isArray(_))return[w,_.map(D=>g(D))];if(typeof _=="object"&&_!==null&&!Array.isArray(_)&&Object.prototype.hasOwnProperty.call(_,"$recursive"))return[w,{$recursive:b(w,_.$recursive)}];const O=w.startsWith("$")?void 0:y(w).property.comparable;return[w,O?{kind:"ordinal-query",comparable:O,condition:R(_)}:R(_)]})),S=$=>{const w=O=>{if(!O||typeof O!="object")return!1;if(Array.isArray(O))return O.some(w);const D=O;return Object.prototype.hasOwnProperty.call(D,"$and")||Object.values(D).some(w)};if(w($))return $;const _=new Set(Object.keys($).flatMap(O=>{if(O.startsWith("$"))return[];const D=G(t,O,o.resolveSchema);return D.relations.length===1&&D.property.type==="ID"?[D.relations[0]?.property.name]:[]}));return Object.fromEntries(Object.entries($).map(([O,D])=>{if(O==="$and"||O==="$or")return Array.isArray(D)?[O,D.map(C=>typeof C=="object"&&C!==null&&!Array.isArray(C)?S(C):C)]:[O,D];if(O.startsWith("$"))return[O,D];const T=G(t,O,o.resolveSchema);if(T.relations.length===0)return[O,D];if(T.property.udf?.sql.includes("$TS")===!0||T.relations.some(({property:C})=>C.udf?.sql.includes("$TS")===!0))return[O,D];const Z=T.relations.map(({property:C})=>C.name).join("_");if(l.has(Z))return[O,D];const[E]=T.relations;if(!E)return[O,D];if(_.has(E.property.name))return[O,D];const N=E.property.name,j=T.canonicalName.slice(N.length+1),L=E.targetSchema.properties.find(({type:C})=>C==="ID");if(!L)throw new d("RELATION_TARGET_ID_REQUIRED",`Relation target ${E.targetSchema.id} must contain an ID property`,{schemaId:E.targetSchema.id});if(T.relations.length===1&&T.property.id===L.id)return[E.property.id,D];const Y={version:e.version,schema:E.targetSchema.id,query:j?{[j]:D}:{},preds:[{pred:L.name,name:L.name}]};return[E.property.id,{$in:Y}]}))},m=(e.groupby??[]).map($=>{const w=Qt($);if($.operator==="$case"&&$.args?.mode==="auto"&&($.args.min===void 0||$.args.max===void 0))throw new d("AUTO_CASE_GROUPBY_REQUIRES_BOUNDS","$case auto mode in groupby requires explicit args.min and args.max");const _=Qe($,r,y,I,q,g,t,o.resolveSchema,"groupby");let O=_.expression;if(_.sourceProperty?.isArray&&_.sourceField){const D=`groupby:${w}`;f.set(D,{path:D,sourceAlias:_.sourceField.qualifier,sourceColumn:_.sourceField.column,..._.sourceField.sql?{sourceSql:_.sourceField.sql,..._.sourceField.timestampColumn?{sourceTimestampColumn:_.sourceField.timestampColumn}:{}}:{},alias:`__array_group_${f.size}`}),O={kind:"array-element",schemaId:_.sourceField.schemaId,property:_.sourceProperty.name,expansionPath:D}}return{name:w,expression:O,outputProperty:{..._.outputProperty,name:w,isArray:!1}}});function I($){const w=(e.groupby??[]).findIndex(O=>typeof O.pred=="string"&&O.pred===$||O.name===$),_=w>=0?m[w]:void 0;if(!_)throw new d("WINDOW_PARTITION_NOT_GROUPED",`Window partition must reference a groupby item: ${$}`);return _.expression}function q($){const w=(e.groupby??[]).findIndex(O=>typeof O.pred=="string"&&O.pred===$||O.name===$),_=w>=0?m[w]:void 0;return _?_.expression:Yr(y($).field)}const V=$=>{$.operator&&r.get($.operator).validatePlan?.({pred:$,groupByNames:m.map(({name:w})=>w),resolveGroupName:w=>{const _=(e.groupby??[]).findIndex(O=>O.name===w||typeof O.pred=="string"&&O.pred===w);return _>=0?m[_]?.name:void 0},getOperator:w=>r.get(w)}),$.pred&&typeof $.pred=="object"&&!Array.isArray($.pred)&&V($.pred);for(const w of Array.isArray($.pred)?$.pred:[])V(typeof w=="string"?{pred:w}:w)};for(const $ of e.preds??[])V($);const k=[...m,...(e.preds??[]).map(($,w)=>rs($,r,y,I,q,g,t,o.resolveSchema,s,c.get(w)))],P=$=>Object.fromEntries(Object.entries($).map(([w,_])=>{if((w==="$and"||w==="$or")&&Array.isArray(_))return[w,_.map(D=>P(D))];const O=k.find(({name:D})=>D===w)?.outputProperty.comparable;return O&&es(_,w,O.values),[w,O?{kind:"ordinal-query",comparable:O,condition:R(_)}:R(_)]})),U=u?S(u):void 0;A(U);const F=$=>{A($.query),$.pred&&typeof $.pred=="object"&&!Array.isArray($.pred)&&F($.pred);for(const w of Array.isArray($.pred)?$.pred:[])F(typeof w=="string"?{pred:w}:w)};for(const $ of e.preds??[])F($);if(k.length===0)throw new d("EMPTY_PROJECTION","LogicForm must contain preds or groupby");ns(k);const M=new Set(k.map(({name:$})=>$)),de=m.length>0?{kind:"group",names:m.map(({name:$})=>$),separator:"_",nullLabel:"\u7A7A\u503C"}:k.every(({expression:$})=>$.kind==="column")||k.some(({expression:$})=>$.kind==="property-sql"&&t.properties.some(({id:w,type:_})=>_==="ID"&&w===$.propertyId))?(()=>{const $=t.properties.find(({type:w})=>w==="ID");return $&&(o.canUsePropertyRowIdentity?.(t,$)??!0)?{kind:"property",column:$.id,internalName:"_id"}:{kind:"generated"}})():{kind:"singleton"},X=Object.entries(e.sort??{}).map(([$,w])=>{if(!M.has($))throw new d("INVALID_SORT",`Sort field is not an output: ${$}`);const _=k.find(O=>O.name===$);return{name:$,direction:w===1?"ASC":"DESC",..._?.outputProperty.comparable?{comparable:_.outputProperty.comparable,expression:_.expression}:{}}}),ne=e.limit===void 0?void 0:e.limit>0&&e.limit<1?{kind:"ratio",page:e.page??1,ratio:e.limit}:{kind:"rows",page:e.page??1,pageSize:e.limit},pe=e.limitBy===void 0?void 0:{count:e.limitBy,partitionBy:m.slice(0,-1).map(({name:$})=>$),orderBy:X.length>0?X:(()=>{const $=m.at(-1);return[{name:$?.name??"",direction:"ASC",...$?.outputProperty.comparable?{comparable:$.outputProperty.comparable,expression:$.expression}:{}}]})()},J=h.size===0&&l.size===0&&f.size===0&&!U&&m.length===0&&k.length>0&&k.every(({expression:$})=>$.kind==="operator"&&$.operator==="$constant");return{schemaId:t.id,source:J?"":a.mapping.source,...!J&&a.mapping.sourceSql?{sourceSql:a.mapping.sourceSql}:{},mappingId:a.mapping.id??a.mapping.source,sourceAlias:p,fields:{...ho(t),...Object.fromEntries(t.properties.flatMap($=>{const w=kt(a.mapping,t,$.name);return w?[[$.name,w],[$.id,w]]:[]}))},fieldReferences:Object.fromEntries(h),joins:[...l.values()],arrayExpansions:[...f.values()],projections:k.map(({name:$,expression:w})=>({name:$,expression:w})),columnProperties:k.map(({outputProperty:$})=>$),groupBy:m.map(({name:$,expression:w})=>({name:$,expression:w})),...U?{query:g(U)}:{},...e.having?{having:P(e.having)}:{},orderBy:X,rowIdentity:J?{kind:"singleton"}:de,...ne?{pagination:ne}:{},...pe?{groupLimit:pe}:{}}},Be=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&e.kind==="logicform-subquery"&&typeof e.plan=="object"&&e.plan!==null,Fr=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&e.kind==="recursive-query",is=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&e.kind==="ordinal-query";class ss{provider;parameterOffset;values=[];constructor(t,r=0){this.provider=t,this.parameterOffset=r}add(t){const r=this.parameterOffset+this.values.length;return this.values.push(t),this.provider.parameter(r,t)}get nextParameterOffset(){return this.parameterOffset+this.values.length}append(t){this.values.push(...t)}}const as=(e,t)=>{const r=t.split(".");if(r.some(n=>n.length===0))throw new d("INVALID_SOURCE",`Invalid physical source: ${t}`);return r.map(n=>e.quoteIdentifier(n)).join(".")},Yt=(e,t,r)=>r===void 0?as(e,t):`(${r.trim().replace(/;+\s*$/,"")})`,Ye=(e,t,r,n,o)=>{const i=br(e,[],String,`Property ${t} udf.sql`);if(!i.includes("$TS"))return i;if(!n)throw new d("PROPERTY_UDF_TIMESTAMP_REQUIRED",`Property ${t} udf.sql uses $TS but its evaluation context has no timestamp Property`,{property:t});const s=(o?`${r.quoteIdentifier(o)}.`:"")+r.quoteIdentifier(n);return i.replace(/\$TS/g,s)},ae=(e,t,r,n=!1,o,i,s,a)=>{const c=(u,p)=>n&&p?`${t.quoteIdentifier(p)}.${t.quoteIdentifier(u)}`:t.quoteIdentifier(u);switch(e.kind){case"array-element":if(!a)throw new d("ARRAY_EXPANSION_UNAVAILABLE","Array expansion compiler is unavailable");return a(e.expansionPath);case"column":return c(e.column,e.qualifier);case"property-sql":return Ye(e.sql,e.property,t,e.timestampColumn,n?e.timestampQualifier??e.qualifier:void 0);case"window":{if(ee(e.input,r))throw new d("UNSUPPORTED_MIXED_OPERATOR","Window operators cannot consume a JavaScript operator");const u=e.partitionBy.length>0?`PARTITION BY ${e.partitionBy.map(f=>ae(f,t,r,n,o,i,s,a)).join(", ")} `:"",p=ae(e.input,t,r,n,o,i,s,a);return`${e.function==="rank"?"RANK":"ROW_NUMBER"}() OVER (${u}ORDER BY ${p} ${e.direction})`}case"cumulative":{if(ee(e.input,r))throw new d("UNSUPPORTED_MIXED_OPERATOR","Cumulative expressions cannot consume a JavaScript operator");const u=ae(e.input,t,r,n,o,i,s,a),p=e.partitionBy.length>0?`PARTITION BY ${e.partitionBy.map(f=>ae(f,t,r,n,o,i,s,a)).join(", ")} `:"",l=e.orderBy.map(f=>`${ae(f.expression,t,r,n,o,i,s,a)} ${f.direction}`).join(", ");return`${t.aggregateFunction(e.function,u)} OVER (${p}ORDER BY ${l} ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)`}case"ordinal-encode":{if(!i)throw new d("SQL_BINDER_UNAVAILABLE","Ordinal encoding requires a value binder");return`CASE ${e.comparable.values.map((p,l)=>`WHEN ${ae(e.input,t,r,n,o,i,s,a)} = ${i(p)} THEN ${e.comparable.direction*l}`).join(" ")} END`}case"ordinal-decode":{if(!i)throw new d("SQL_BINDER_UNAVAILABLE","Ordinal decoding requires a value binder");return`CASE ${e.comparable.values.map((p,l)=>`WHEN ${ae(e.input,t,r,n,o,i,s,a)} = ${e.comparable.direction*l} THEN ${i(p)}`).join(" ")} END`}case"operator":{const u=r.get(e.operator);if(u.kind==="component")throw new d("COMPONENT_OPERATOR_REQUIRES_EXECUTOR",`${e.operator} must be compiled through the executor component pipeline`);if(u.toSQL&&(e.input&&ee(e.input,r)||e.inputs?.some(f=>ee(f,r))))throw new d("UNSUPPORTED_MIXED_OPERATOR",`${e.operator} cannot consume a JavaScript operator in SQL`);let p=e.input?ae(e.input,t,r,n,o,i,s,a):e.column?c(e.column,e.qualifier):void 0;const l=e.inputs?.map(f=>ae(f,t,r,n,o,i,s,a));if(e.query){if(u.kind!=="aggregate")throw new d("OPERATOR_QUERY_REQUIRES_AGGREGATION",`Pred query is only supported by aggregation operators: ${e.operator}`);if(!o)throw new d("INVALID_OPERATOR_QUERY","Operator query compiler is unavailable");p=`CASE WHEN ${o(e.query)} THEN ${p??"1"} END`}if(u.requiresProperty!==!1&&!p)throw new d("PRED_PROPERTY_REQUIRED",`${e.operator} requires a column`);return u.toSQL?u.toSQL({sql:{aggregateFunction:t.aggregateFunction.bind(t),quoteIdentifier:t.quoteIdentifier.bind(t),concat:t.concat.bind(t),substring:t.substring.bind(t),dateBucket:t.dateBucket.bind(t),dateShift:t.dateShift.bind(t),...t.datePeriodBoundary?{datePeriodBoundary:t.datePeriodBoundary.bind(t)}:{},value:f=>{if(!i)throw new d("SQL_BINDER_UNAVAILABLE","SQL value binder is unavailable");return i(f)},condition:(f,h)=>{if(!s)throw new d("SQL_CONDITION_UNAVAILABLE","SQL condition compiler is unavailable");return s(f,h)}},...p?{expression:p,column:p}:{},...l?{expressions:l}:{},args:e.args}):p??"NULL"}}},ee=(e,t)=>e.kind==="window"?ee(e.input,t)||e.partitionBy.some(r=>ee(r,t)):e.kind==="cumulative"?ee(e.input,t)||e.partitionBy.some(r=>ee(r,t))||e.orderBy.some(r=>ee(r.expression,t)):e.kind==="ordinal-encode"||e.kind==="ordinal-decode"?ee(e.input,t):e.kind==="operator"&&(!t.get(e.operator).toSQL&&!!t.get(e.operator).evaluate||(e.input?ee(e.input,t):!1)||(e.inputs?.some(r=>ee(r,t))??!1)),cs=(e,t)=>e.sourceSql?Ye(e.sourceSql,e.sourceColumn,t,e.sourceTimestampColumn,e.sourceAlias):`${t.quoteIdentifier(e.sourceAlias)}.${t.quoteIdentifier(e.sourceColumn)}`,Hr=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&Object.keys(e).some(t=>t.startsWith("$")),us=(e,t,r)=>{if(!r.supportsRecursiveCte)throw new d("RECURSIVE_QUERY_UNSUPPORTED",`Provider ${r.kind} does not support recursive queries`);if(e.roots.length===0)return"(SELECT NULL WHERE 1 = 0)";const n=r.quoteIdentifier("__recursive_tree__"),o=r.quoteIdentifier("__recursive_id__"),i=r.quoteIdentifier("__recursive_node__"),s=r.quoteIdentifier("__recursive_child__"),a=r.quoteIdentifier(e.idColumn),c=r.quoteIdentifier(e.parentColumn),u=Yt(r,e.source,e.sourceSql),p=()=>e.roots.map(y=>t.add(y)).join(", "),l=(y,A=!1)=>e.roots.length===1?`${y} ${A?"<>":"="} ${p()}`:`${y} ${A?"NOT IN":"IN"} (${p()})`,f=`${i}.${a}`,h=e.includeSelf?l(f):`${l(`${i}.${c}`)} AND ${l(f,!0)}`;return`(WITH RECURSIVE ${n}(${o}) AS ( SELECT ${f} FROM ${r.tableAlias(u,"__recursive_node__")} WHERE ${h} UNION SELECT ${s}.${a} FROM ${r.tableAlias(u,"__recursive_child__")} JOIN ${n} ON ${s}.${c} = ${n}.${o}) SELECT DISTINCT ${o} FROM ${n})`},Ve=(e,t,r,n,o,i,s)=>{if(t==="$recursive"){if(!Fr(r))throw new d("INVALID_RECURSIVE_QUERY","$recursive query was not planned");return`${e} IN ${us(r,n,o)}`}if(t==="$eq"&&r===null)return`${e} IS NULL`;if(t==="$ne"&&r===null)return`${e} IS NOT NULL`;const c={$eq:"=",$ne:"<>",$gt:">",$gte:">=",$lt:"<",$lte:"<="}[t];if(c){const u=Be(r)?`(${i(r)})`:n.add(r);return`${e} ${c} ${u}`}if(t==="$in"||t==="$nin"){const u=t==="$in"?"IN":"NOT IN";if(Be(r))return`${e} ${u} (${i(r)})`;if(!Array.isArray(r))throw new d("INVALID_QUERY_VALUE",`${t} requires an array or query LogicForm`);if(r.length===0)return t==="$in"?"0 = 1":"1 = 1";const p=r.filter(Be);if(p.length>0){if(p.length!==r.length)throw new d("MIXED_SUBQUERY_VALUES",`${t} cannot mix query LogicForm objects and literal values`);return`${e} ${u} (${p.map(i).join(" UNION ALL ")})`}const l=r.map(f=>n.add(f)).join(", ");return`${e} ${u} (${l})`}if(Be(r))throw new d("UNSUPPORTED_SUBQUERY_OPERATOR",`Query LogicForm is not supported by ${t}`);if(t==="$exists")return`${e} IS ${r?"NOT ":""}NULL`;if(t==="$contains")return`${e} LIKE ${n.add(`%${String(r)}%`)}`;if(t==="$regex"){if(typeof r!="string"||s!==void 0&&typeof s!="string")throw new d("INVALID_QUERY_VALUE","$regex requires a string pattern and args.options must be a string");return o.regex(e,n.add(r),s)}throw new d("UNSUPPORTED_QUERY_OPERATOR",`Unsupported query operator: ${t}`)},nt=(e,t,r,n,o)=>{if(is(t)){const c=()=>`CASE ${t.comparable.values.map((f,h)=>`WHEN ${e} = ${r.add(f)} THEN ${t.comparable.direction*h}`).join(" ")} END`,u=new Set(["$gt","$gte","$lt","$lte"]),p=l=>typeof l!="object"||l===null||Array.isArray(l)?nt(e,l,r,n,o):Object.entries(l).filter(([f])=>f!=="args").map(([f,h])=>(f==="$and"||f==="$or")&&Array.isArray(h)?`(${h.map(p).join(f==="$and"?" AND ":" OR ")})`:u.has(f)?Ve(c(),f,t.comparable.direction*t.comparable.values.indexOf(String(h)),r,n,o):Ve(e,f,h,r,n,o)).join(" AND ");return p(t.condition)}if(Array.isArray(t))return Ve(e,"$in",t,r,n,o);if(!Hr(t))return Ve(e,"$eq",t,r,n,o);const i=[],s=t.args;if(s!==void 0){if(typeof s!="object"||s===null||Array.isArray(s))throw new d("INVALID_QUERY_VALUE","Query args.options must be a string");const c=s.options;if(c!==void 0&&typeof c!="string")throw new d("INVALID_QUERY_VALUE","Query args.options must be a string")}const a=s?.options;for(const[c,u]of Object.entries(t))if(c==="$and"||c==="$or"){if(!Array.isArray(u))throw new d("INVALID_QUERY_VALUE",`${c} requires an array`);const p=u.map(l=>nt(e,l,r,n,o));i.push(`(${p.join(c==="$and"?" AND ":" OR ")})`)}else c!=="args"&&i.push(Ve(e,c,u,r,n,o,c==="$regex"?a:void 0));if(i.length===0)throw new d("EMPTY_QUERY_CONDITION","Query condition contains no operators");return i.join(" AND ")},Gr=(e,t,r,n)=>{if(!n.arrayContains)throw new d("ARRAY_CONDITION_UNSUPPORTED",`Provider ${n.kind} does not support array conditions`);const o=n.arrayContains.bind(n),i=a=>o(e,r.add(a));if(Array.isArray(t))return`(${t.map(i).join(" OR ")})`;if(!Hr(t))return i(t);const s=[];for(const[a,c]of Object.entries(t))if(a==="$and"||a==="$or"){if(!Array.isArray(c))throw new d("INVALID_QUERY_VALUE",`${a} requires an array`);const u=c.map(p=>Gr(e,p,r,n));s.push(`(${u.join(a==="$and"?" AND ":" OR ")})`)}else if(a==="$eq")s.push(i(c));else if(a==="$ne")s.push(`NOT (${i(c)})`);else if(a==="$in"||a==="$nin"){if(!Array.isArray(c))throw new d("INVALID_QUERY_VALUE",`${a} requires an array`);const u=c.map(i),p=u.length===0?a==="$in"?"0 = 1":"1 = 1":u.join(a==="$in"?" OR ":" AND NOT ");s.push(a==="$nin"&&u.length>0?`NOT (${u.join(" OR ")})`:`(${p})`)}else if(a==="$exists")s.push(`${e} IS ${c?"NOT ":""}NULL`);else if(a!=="args")throw new d("UNSUPPORTED_ARRAY_QUERY_OPERATOR",`Unsupported array query operator: ${a}`);if(s.length===0)throw new d("EMPTY_QUERY_CONDITION","Query condition contains no operators");return s.join(" AND ")},ot=(e,t,r,n,o,i)=>{const s=[];for(const[a,c]of Object.entries(e)){if(a==="$and"||a==="$or"){if(!Array.isArray(c))throw new d("INVALID_QUERY_VALUE",`${a} requires an array`);const p=c.map(l=>{if(typeof l!="object"||l===null||Array.isArray(l))throw new d("INVALID_QUERY_VALUE",`${a} items must be query objects`);return ot(l,t,r,n,o,i)});s.push(`(${p.join(a==="$and"?" AND ":" OR ")})`);continue}const u=t(a);s.push(r(a)?Gr(u,c,n,o):nt(u,c,n,o,i))}return s.join(" AND ")},it=(e,t,r,n,o)=>e.orderBy.map(i=>{const s=t.quoteIdentifier(i.name),a=`${n?`${n}.`:""}${s}`,c=i.comparable,u=!n&&o&&i.expression?o(i.expression):a;return`${c?`CASE ${c.values.map((l,f)=>`WHEN ${u} = ${r.add(l)} THEN ${c.direction*f}`).join(" ")} END`:a} ${i.direction}`}).join(", "),Vt=(e,t)=>{let r=e;for(;t.has(r);)r=`_${r}`;return r},Wr=(e,t,r,n)=>t.concat(e.flatMap((o,i)=>[...i>0?[`'${r.replaceAll("'","''")}'`]:[],`CASE WHEN ${o} IS NULL THEN '${n.replaceAll("'","''")}' ELSE ${t.stringify(o)} END`])),ds=(e,t,r,n,o)=>{const i=new Set(t.projections.map(({name:k})=>k)),s="__sdb_page_source",a="__sdb_page",c=n.quoteIdentifier(s),u=n.quoteIdentifier(a),p=Vt("__sdb_row_number",i),l=Vt("__sdb_total_rows",i),f=n.quoteIdentifier(p),h=n.quoteIdentifier(l),y=it(t,n,o,c),A=y?`ORDER BY ${y}`:"",R=`CEIL(${h} * ${r.ratio})`,b=r.page-1,g=r.page,m=[...t.projections.map(({name:k})=>k),...t.rowIdentity.kind==="property"?[t.rowIdentity.internalName]:[],...t.rowIdentity.kind==="group"?["_id"]:[]].map(k=>`${u}.${n.quoteIdentifier(k)}`).join(", "),I=it(t,n,o,u),q=`SELECT ${c}.*, ROW_NUMBER() OVER (${A}) AS ${f}, COUNT(*) OVER () AS ${h} FROM ${n.tableAlias(`(${e})`,s)}`;let V=`SELECT ${m} FROM ${n.tableAlias(`(${q})`,a)} WHERE ${u}.${f} > ${b} * ${R} AND ${u}.${f} <= ${g} * ${R}`;return I&&(V+=` ORDER BY ${I}`),V},zr=(e,t,r,n)=>{const o=t.groupLimit;if(!o)return e;const i="__sdb_limit_by_source",s="__sdb_limit_by_ranked",a=r.quoteIdentifier(i),c=r.quoteIdentifier(s),u=new Set(t.projections.map(({name:g})=>g)),p=Vt("__sdb_limit_by_row_number",u),l=r.quoteIdentifier(p),f=o.partitionBy.map(g=>`${a}.${r.quoteIdentifier(g)}`).join(", "),h=o.orderBy.map(({name:g,direction:S,comparable:m})=>{const I=`${a}.${r.quoteIdentifier(g)}`;return`${m?`CASE ${m.values.map((V,k)=>`WHEN ${I} = ${n.add(V)} THEN ${m.direction*k}`).join(" ")} END`:I} ${S}`}).join(", "),A=[...t.projections.map(({name:g})=>g),...t.rowIdentity.kind==="property"?[t.rowIdentity.internalName]:[],...t.rowIdentity.kind==="group"?["_id"]:[]].map(g=>`${c}.${r.quoteIdentifier(g)}`).join(", "),R=`PARTITION BY ${f} ORDER BY ${h}`,b=`SELECT ${a}.*, ROW_NUMBER() OVER (${R}) AS ${l} FROM ${r.tableAlias(`(${e})`,i)}`;return`SELECT ${A} FROM ${r.tableAlias(`(${b})`,s)} WHERE ${c}.${l} <= ${o.count}`},re=(e,t,r=we(),n=0)=>{const o=new ss(t,n);if(e.subplans){const m=e.projections.map(({name:P})=>P),I=e.subplans.map((P,U)=>{const F=re(P,t,r,o.nextParameterOffset);o.append(F.parameters);const M=`__composition_child_${U}`,de=t.quoteIdentifier(M),X=new Set(P.projections.map(({name:ne})=>ne));return{aliasName:M,alias:de,available:X,sql:F.sql}}),q=I[0];if(!q)throw new d("INVALID_COMPOSITION","Composition has no children");const V=m.map(P=>`${(I.find(F=>F.available.has(P))??q).alias}.${t.quoteIdentifier(P)} AS ${t.quoteIdentifier(P)}`);e.rowIdentity.kind==="group"&&V.push(`${q.alias}.${t.quoteIdentifier("_id")} AS ${t.quoteIdentifier("_id")}`);let k=`SELECT ${V.join(", ")} FROM ${t.tableAlias(`(${q.sql})`,q.aliasName)}`;for(const P of I.slice(1))k+=` LEFT JOIN ${t.tableAlias(`(${P.sql})`,P.aliasName)}`,k+=e.rowIdentity.kind==="group"?` ON ${q.alias}.${t.quoteIdentifier("_id")} = ${P.alias}.${t.quoteIdentifier("_id")}`:" ON 1 = 1";return e.groupLimit&&(k=zr(k,e,t,o)),e.orderBy.length>0&&(k+=` ORDER BY ${it(e,t,o)}`),e.pagination?.kind==="rows"&&(k=t.paginate(k,e.pagination.pageSize,0)),{sql:k,parameters:o.values}}const i=m=>{if(m.plan.projections.some(({expression:q})=>ee(q,r)))throw new d("JAVASCRIPT_OPERATOR_IN_SUBQUERY","A query LogicForm cannot use a JavaScript-only operator");const I=re(m.plan.rowIdentity.kind==="property"||m.plan.rowIdentity.kind==="group"?{...m.plan,rowIdentity:{kind:"generated"}}:m.plan,t,r,o.nextParameterOffset);return o.append(I.parameters),I.sql},s=(e.joins?.length??0)>0,a=(e.arrayExpansions?.length??0)>0,c=s||a||e.sourcePlan!==void 0||e.sourceSql!==void 0,u=new Map,p=(e.arrayExpansions??[]).map(m=>{if(!t.expandArray)throw new d("ARRAY_EXPANSION_UNSUPPORTED",`Provider ${t.kind} does not support array expansion`);const I=t.expandArray(cs(m,t),m.alias,"value");return u.set(m.path,I.valueExpression),I}),l=m=>{const I=e.fieldReferences?.[m];if(I?.sql)return Ye(I.sql,I.property,t,I.timestampColumn,c?I.timestampQualifier??I.qualifier:void 0);if(I&&c)return`${t.quoteIdentifier(I.qualifier)}.${t.quoteIdentifier(I.column)}`;const q=e.fields[m];if(!q)throw new d("PROPERTY_NOT_FOUND",`Query property not found: ${m}`);return t.quoteIdentifier(q)},f=m=>ae(m,t,r,c,I=>ot(I,l,q=>e.fieldReferences?.[q]?.isArray===!0,o,t,i),I=>o.add(I),(I,q)=>nt(I,q,o,t,i),I=>{const q=u.get(I);if(!q)throw new d("ARRAY_EXPANSION_NOT_FOUND",`Array expansion not found: ${I}`);return q}),h=e.projections.map(m=>`${f(m.expression)} AS ${t.quoteIdentifier(m.name)}`),y=e.rowIdentity.kind==="property"?`${c&&e.sourceAlias?`${t.quoteIdentifier(e.sourceAlias)}.`:""}${t.quoteIdentifier(e.rowIdentity.column)} AS ${t.quoteIdentifier(e.rowIdentity.internalName)}`:e.rowIdentity.kind==="group"?(()=>{const m=e.rowIdentity.names.map(I=>{const q=e.groupBy.find(V=>V.name===I)??e.projections.find(V=>V.name===I);if(!q)throw new d("GROUP_IDENTITY_OUTPUT_NOT_FOUND",`Group identity output not found: ${I}`);return f(q.expression)});return`${Wr(m,t,e.rowIdentity.separator,e.rowIdentity.nullLabel)} AS ${t.quoteIdentifier("_id")}`})():void 0,A=[...h,...y?[y]:[]].join(", "),R=e.sourcePlan?(()=>{const m=re(e.sourcePlan,t,r,o.nextParameterOffset);return o.append(m.parameters),`(${m.sql})`})():e.source?Yt(t,e.source,e.sourceSql):"",b=c&&e.sourceAlias?t.tableAlias(R,e.sourceAlias):R;let g=`SELECT ${A}${b?` FROM ${b}`:""}`;for(const m of p)g+=` ${m.joinSql}`;for(const m of e.joins??[]){g+=` LEFT JOIN ${t.tableAlias(Yt(t,m.targetSource,m.targetSourceSql),m.targetAlias)}`;const I=m.sourceArrayExpansionPath?u.get(m.sourceArrayExpansionPath):m.sourceSql?Ye(m.sourceSql,m.sourceColumn,t,m.sourceTimestampColumn,m.sourceAlias):`${t.quoteIdentifier(m.sourceAlias)}.${t.quoteIdentifier(m.sourceColumn)}`,q=m.targetSql?Ye(m.targetSql,m.targetColumn,t,m.targetTimestampColumn,m.targetAlias):`${t.quoteIdentifier(m.targetAlias)}.${t.quoteIdentifier(m.targetColumn)}`;if(!I)throw new d("ARRAY_EXPANSION_NOT_FOUND",`Array expansion not found: ${m.path}`);if(g+=` ON ${I} = ${q}`,m.sourceTimestampColumn&&m.targetTimestampColumn&&m.sourceTimestampGranularity&&m.targetTimestampGranularity){const V=`${t.quoteIdentifier(m.sourceAlias)}.${t.quoteIdentifier(m.sourceTimestampColumn)}`,k=`${t.quoteIdentifier(m.targetAlias)}.${t.quoteIdentifier(m.targetTimestampColumn)}`;g+=` AND ${t.dateBucket(V,m.sourceTimestampGranularity)} = ${t.dateBucket(k,m.targetTimestampGranularity)}`}}const S=[];if(e.query&&Object.keys(e.query).length>0&&S.push(ot(e.query,l,m=>e.fieldReferences?.[m]?.isArray===!0,o,t,i)),S.length>0&&(g+=` WHERE ${S.join(" AND ")}`),e.groupBy.length>0){const m=e.groupBy.map(q=>f(q.expression)),I=e.rowIdentity.kind==="group"?[Wr(m,t,e.rowIdentity.separator,e.rowIdentity.nullLabel)]:[];g+=` GROUP BY ${[...m,...I].join(", ")}`}if(e.having&&Object.keys(e.having).length>0){const m=I=>{const q=e.projections.find(V=>V.name===I);if(!q)throw new d("INVALID_HAVING",`Having field is not an output: ${I}`);return t.supportsHavingAlias===!1?f(q.expression):t.quoteIdentifier(I)};g+=` HAVING ${ot(e.having,m,()=>!1,o,t,i)}`}if(e.groupLimit&&(g=zr(g,e,t,o)),e.pagination?.kind==="ratio")g=ds(g,e,e.pagination,t,o);else if(e.orderBy.length>0&&(g+=` ORDER BY ${it(e,t,o,void 0,f)}`),e.pagination?.kind==="rows"){const m=(e.pagination.page-1)*e.pagination.pageSize;g=t.paginate(g,e.pagination.pageSize,m)}return{sql:g,parameters:o.values}},ps=(e,t)=>{const r=e.match(/[A-Za-z_$][\w$]*|\d+(?:\.\d+)?|[()+\-*/ ,]/g)?.filter(p=>!/^\s$/.test(p))??[];let n=0;const o=()=>r[n],i=()=>r[n++],s=()=>{const p=i();if(!p)throw new Error("Component expression is incomplete");if(p==="("){const f=c();if(i()!==")")throw new Error("Component expression has an unclosed parenthesis");return`(${f})`}if(/^\d/.test(p))return p;if(!/^[A-Za-z_$][\w$]*$/.test(p))throw new Error(`Invalid component expression token: ${p}`);if(o()==="("){i();const f=[];if(o()!==")")for(;f.push(c()),o()===",";)i();if(i()!==")")throw new Error("Component expression has an unclosed function call");if(!["ABS","NULLIF","COALESCE"].includes(p.toUpperCase()))throw new Error(`Unsupported component expression function: ${p}`);return`${p.toUpperCase()}(${f.join(", ")})`}const l=t[p];if(!l)throw new Error(`Unknown component in expression: ${p}`);return l},a=()=>{let p=s();for(;o()==="*"||o()==="/";)p=`${p} ${i()} ${s()}`;return p},c=()=>{let p=a();for(;o()==="+"||o()==="-";)p=`${p} ${i()} ${a()}`;return p},u=c();if(n!==r.length)throw new Error(`Unexpected component expression token: ${o()}`);return u},fs=e=>`__sdb_cte_${e}`,vr=e=>{const t=e.projections[e.groupBy.length];if(!t)throw new Error("CTE component must produce one metric projection");return t.name},ls=(e,t)=>e?.find(r=>r.name===t),ms=(e,t,r)=>r===0?e:t.kind==="postgresql"?e.replace(/\$(\d+)/g,(n,o)=>`$${Number(o)+r}`):t.kind==="oracle"?e.replace(/:(\d+)/g,(n,o)=>`:${Number(o)+r}`):t.kind==="clickhouse"?e.replace(/\{p(\d+):([^}]+)\}/g,(n,o,i)=>`{p${Number(o)+r}:${i}}`):e,xr=(e,t,r,n=we())=>{if(e.length===0)throw new Error("CTE query combination requires at least one unit");let o=0;const i=e.map((g,S)=>{const m={...g.compiled,sql:ms(g.compiled.sql,r,o)};return o+=g.compiled.parameters.length,{...g,compiled:m,alias:`__sdb_exec_${S}`}}),s=i.map(({alias:g,compiled:S})=>`${r.quoteIdentifier(g)} AS (${S.sql})`),a=i[0],c=r.quoteIdentifier(a.alias),u=t.groupBy.map(({name:g})=>g),p=t.orderBy??[],l=t.rowIdentity.kind==="group",f=r.quoteIdentifier("__sdb_exec_keys");if(l){const g=S=>[...u.map(m=>`${S}.${r.quoteIdentifier(m)}`),`${S}.${r.quoteIdentifier("_id")}`].join(", ");s.push(`${f} AS (${i.map(({alias:S})=>`SELECT ${g(r.quoteIdentifier(S))} FROM ${r.quoteIdentifier(S)}`).join(" UNION ")})`)}const h=l?f:c,y=[...u,...e.flatMap(({outputs:g})=>g)],A=y.filter((g,S,m)=>m.indexOf(g)===S).map(g=>{if(u.includes(g))return`${h}.${r.quoteIdentifier(g)} AS ${r.quoteIdentifier(g)}`;const S=i.find(({outputs:I})=>I.includes(g));if(!S)throw new Error(`CTE execution unit does not expose output projection: ${g}`);return`${r.quoteIdentifier(S.alias)}.${r.quoteIdentifier(g)} AS ${r.quoteIdentifier(g)}`});l&&A.push(`${h}.${r.quoteIdentifier("_id")} AS ${r.quoteIdentifier("_id")}`);let R=`SELECT ${A.join(", ")} FROM ${h}`;for(const g of l?i:i.slice(1)){const S=r.quoteIdentifier(g.alias);R+=` LEFT JOIN ${S}`,R+=l?` ON ${h}.${r.quoteIdentifier("_id")} = ${S}.${r.quoteIdentifier("_id")}`:" ON 1 = 1"}if(!!(t.having&&Object.keys(t.having).length>0||p.length>0||t.pagination||t.groupLimit)){const g={schemaId:t.schemaId,source:"__sdb_cte_result_source",sourceSql:R,sourceAlias:"__sdb_cte_result",fields:Object.fromEntries(y.map(m=>[m,m])),projections:y.map(m=>({name:m,expression:{kind:"column",property:m,column:m}})),groupBy:[],...t.having&&Object.keys(t.having).length>0?{query:t.having}:{},orderBy:p.map(({name:m,direction:I,comparable:q})=>({name:m,direction:I,...q?{comparable:q}:{}})),...t.pagination?{pagination:t.pagination}:{},...t.groupLimit?{groupLimit:t.groupLimit}:{},rowIdentity:{kind:"generated"}},S=re(g,r,n,o);return{sql:`WITH ${s.join(", ")} ${S.sql}`,parameters:[...i.flatMap(({compiled:m})=>m.parameters),...S.parameters]}}return{sql:`WITH ${s.join(", ")} ${R}`,parameters:i.flatMap(({compiled:g})=>g.parameters)}},Ft=(e,t,r,n,o)=>{const i=[];let s=0;for(const g of t){const S=re(g.plan,n,o,s);s+=S.parameters.length,i.push({input:g,sql:S,alias:fs(g.name)})}const a=i.map(({sql:g,alias:S})=>`${n.quoteIdentifier(S)} AS (${g.sql})`).join(", "),c=i[0];if(!c)throw new Error("CTE calculation requires a current component");const u=n.quoteIdentifier(c.alias),p=r.groupBy.map(({name:g})=>g),l=p.map(g=>`${u}.${n.quoteIdentifier(g)} AS ${n.quoteIdentifier(g)}`);let f="";for(const g of i.slice(1)){const S=n.quoteIdentifier(g.alias),m=(g.input.joinKeys??p).map(I=>{const q=ls(g.input.groupKeyShifts,I),V=q?n.dateShift(`${S}.${n.quoteIdentifier(I)}`,q.granularity,q.offset):`${S}.${n.quoteIdentifier(I)}`;return`${u}.${n.quoteIdentifier(I)} = ${V}`});f+=` LEFT JOIN ${S} ON ${m.length>0?m.join(" AND "):"1 = 1"}`}const h=Object.fromEntries(i.map(({input:g,alias:S})=>[g.name,`${n.quoteIdentifier(S)}.${n.quoteIdentifier(vr(g.plan))}`])),y=ps(e.expression,h),A=e.outputName??r.projections[r.groupBy.length]?.name;if(!A)throw new Error("CTE output projection is missing");const R=[...l,...r.rowIdentity.kind==="group"?[`${u}.${n.quoteIdentifier("_id")} AS ${n.quoteIdentifier("_id")}`]:[],...e.exposeComponents?i.map(({input:g,alias:S})=>`${`${n.quoteIdentifier(S)}.${n.quoteIdentifier(vr(g.plan))}`} AS ${n.quoteIdentifier(g.name)}`):[],`${y} AS ${n.quoteIdentifier(A)}`].join(", ");let b=`WITH ${a} SELECT ${R} FROM ${u}`;return b+=f,{sql:b,parameters:i.flatMap(({sql:g})=>g.parameters)}},ys=e=>{if(typeof e!="string"||!/\bSELECT\b/i.test(e))return e;try{let t=e;const r=Jr(e).length*2+2;for(let n=0;n<r;n+=1){const o=hs(t);if(o===t)return t;t=o}return t}catch{return e}},hs=e=>{const t=Jr(e),r=gs(e,t);if(r!==e)return r;const n=[];for(const i of t){const s=Zr(e,i.selectEnd,i.fromStart),a=s?.length===1&&s[0]?.trim()==="*"?Ts(e.slice(i.fromStart+4,i.close)):null;if(a){n.push({start:i.open,end:i.close+1,value:a});continue}if(!s||s.some(y=>y.trim()==="*"))continue;const c=Ps($s(e.slice(i.fromStart,i.close),i,t)),u=ws(e,i);let p=s.filter(y=>{const A=Xr(y);if(!A||A==="_id")return!0;const R=new RegExp(`(^|[^\\w$])${nn(A)}([^\\w$]|$)`,"i");return R.test(c)||R.test(u)}),l=!0;for(;l;){l=!1;const y=rn(p.join(" ")),A=s.filter(R=>{if(p.includes(R))return!1;const b=Xr(R);return b?new RegExp(`(^|[^\\w$])${nn(b)}([^\\w$]|$)`,"i").test(y):!1});A.length>0&&(p=s.filter(R=>p.includes(R)||A.includes(R)),l=!0)}if(p.length===s.length)continue;const f=e.slice(i.selectEnd,i.fromStart),h=p.length===0&&Ns(e,i)&&!/(^|[^\w$])\*([^\w$]|$)/.test(u)&&!/^\s*(?:DISTINCT|ALL|TOP|SQL_)\b/i.test(f)&&!/\b(?:UNION|INTERSECT|EXCEPT)\b/i.test(c);p.length===0&&!h||n.push({start:i.selectEnd,end:i.fromStart,value:f.match(/^\s*/)[0]+(h?"1":p.map(y=>y.trim()).join(", "))+f.match(/\s*$/)[0]})}n.sort((i,s)=>s.start-i.start);let o=e;for(const i of n)o=o.slice(0,i.start)+i.value+o.slice(i.end);return o},gs=(e,t)=>{const r=/^\s*SELECT\b/i.exec(e);if(!r)return e;const n=r.index+r[0].length,o=Kr(e,"FROM",n);if(o===-1||!Zr(e,n,o)?.every(bs))return e;const s=t.find(f=>f.open>o&&e.slice(o+4,f.open).trim().length===0);if(!s||!/^\s*1\s*$/.test(e.slice(s.selectEnd,s.fromStart)))return e;const a=t.filter(f=>f.open>s.fromStart&&f.close<s.close).sort((f,h)=>h.close-h.open-(f.close-f.open))[0];if(!a||e.slice(s.fromStart+4,a.open).trim().length>0)return e;const c=e.slice(a.close+1,s.close);if(/\b(?:GROUP|HAVING|ORDER|LIMIT|OFFSET|UNION|INTERSECT|EXCEPT)\b/i.test(c))return e;const u=Ss.exec(c)?.[1],p=Os.exec(e.slice(s.close+1));if(!u||!p||en(u)!==en(p[1]))return e;const l=/;(\s*)$/.exec(e)?.[0]??"";return e.slice(0,s.open)+e.slice(a.open,s.close)+l},$s=(e,t,r)=>As(e,r.filter(n=>n.open>t.open&&n.close<t.close).map(n=>({start:n.open-t.fromStart,end:n.close-t.fromStart+1}))),ws=(e,t)=>{const r=e.slice(0,t.open)+" ".repeat(t.close-t.open+1)+e.slice(t.close+1);return rn(r)},As=(e,t)=>{if(!t.length)return e;const r=e.split("");for(const n of t)for(let o=Math.max(0,n.start);o<Math.min(r.length,n.end);o+=1)r[o]=" ";return r.join("")},Kr=(e,t,r)=>{let n=0,o=0,i="",s="";for(let a=r;a<e.length;a+=1){const c=e[a],u=e[a+1];if(s==="--"){c===`
2
- `&&(s="");continue}if(s==="/*"){c==="*"&&u==="/"&&(s="",a+=1);continue}if(i){c===i&&e[a-1]!=="\\"&&(i="");continue}if(c==="-"&&u==="-"){s="--",a+=1;continue}if(c==="/"&&u==="*"){s="/*",a+=1;continue}if(c==="`"||c==='"'||c==="'"){i=c;continue}if(c==="("){n+=1;continue}if(c===")"){n-=1;continue}if(c==="["){o+=1;continue}if(c==="]"){o-=1;continue}if(n===0&&o===0&&new RegExp(`^${t}\\b`,"i").test(e.slice(a)))return a}return-1},Jr=e=>{const t=[],r=[];let n="",o="";for(let i=0;i<e.length;i+=1){const s=e[i],a=e[i+1];if(o==="--"){s===`
3
- `&&(o="");continue}if(o==="/*"){s==="*"&&a==="/"&&(o="",i+=1);continue}if(n){s===n&&e[i-1]!=="\\"&&(n="");continue}if(s==="-"&&a==="-"){o="--",i+=1;continue}if(s==="/"&&a==="*"){o="/*",i+=1;continue}if(s==="`"||s==='"'||s==="'"){n=s;continue}if(s==="("){r.push({open:i});continue}if(s!==")")continue;const c=r.pop();if(!c)continue;const u=e.slice(c.open+1,i),p=/^\s*SELECT\b/i.exec(u);if(!p)continue;const l=c.open+1+p.index,f=Kr(e,"FROM",l+6);f===-1||f>=i||t.push({open:c.open,close:i,selectEnd:l+6,fromStart:f})}return t},Zr=(e,t,r)=>{const n=e.slice(t,r),o=[];let i=0,s=0,a=0,c="";for(let u=0;u<n.length;u+=1){const p=n[u];if(c){p===c&&n[u-1]!=="\\"&&(c="");continue}if(p==="`"||p==='"'||p==="'"){c=p;continue}p==="("?s+=1:p===")"?s-=1:p==="["?a+=1:p==="]"?a-=1:p===","&&s===0&&a===0&&(o.push(n.slice(i,u)),i=u+1)}return c||s!==0||a!==0?null:(o.push(n.slice(i)),o)},Xr=e=>e.trim().match(/\bAS\s+(`[^`]+`|"[^"]+"|[A-Za-z_][\w$]*)\s*$/i)?.[1]?.replace(/^`|`$/g,"").replace(/^"|"$/g,"")??null,ye='(?:`(?:``|[^`])+`|"(?:""|[^"])+"|[A-Za-z_][\\w$]*)',_s=new RegExp(`\\s+AS\\s+${ye}\\s*$`,"i"),Es=new RegExp(`\\bAS\\s+${ye}`,"gi"),Is=new RegExp(`(?:${ye}\\s*\\.\\s*)+${ye}`,"g"),Rs=new RegExp(`^${ye}(?:\\s*\\.\\s*${ye})*$`),Ss=new RegExp(`^\\s*(?:AS\\s+)?(${ye})\\s+WHERE\\b`,"i"),Os=new RegExp(`^\\s*(?:AS\\s+)?(${ye})\\s*;?\\s*$`,"i"),en=e=>e.replace(/^`|`$/g,"").replace(/^"|"$/g,"").toLowerCase(),bs=e=>{const t=e.replace(_s,"").trim();return/^(?:NULL|TRUE|FALSE|[-+]?\d+(?:\.\d+)?|'(?:''|[^'])*')$/i.test(t)||/^COUNT\s*\(\s*(?:\*|1)\s*\)$/i.test(t)},tn=(e,t)=>e.replace(t,r=>" ".repeat(r.length)),rn=e=>tn(e,Es),Ps=e=>tn(e,Is),Ns=(e,t)=>/\b(?:FROM|JOIN)\s*$/i.test(e.slice(0,t.open)),Ts=e=>{const t=e.trim();return Rs.test(t)?t:null},nn=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Ht=(e,t)=>{if(e.kind!=="operator")return!1;const r=t.get(e.operator);return!r.toSQL&&!!r.evaluate||(e.input?Ht(e.input,t):!1)||(e.inputs?.some(n=>Ht(n,t))??!1)},on=(e,t,r,n)=>{if(e.kind!=="operator")return t[r];const o=n.get(e.operator),i=e.input?on(e.input,t,r,n):t[r];return o.evaluate?Promise.resolve(i).then(s=>o.evaluate?.({input:s,args:e.args})):i},st=async(e,t,r)=>{const n=t.filter(({expression:o})=>Ht(o,r));return n.length===0?[...e]:Promise.all(e.map(async o=>{const i={...o};for(const s of n)i[s.name]=await on(s.expression,i,s.name,r);return i}))},Gt=e=>e==null?"\u7A7A\u503C":typeof e=="object"?"_id"in e?String(e._id):"id"in e?String(e.id):JSON.stringify(e):String(e),sn=(e,t,r="_",n="\u7A7A\u503C")=>t.map(o=>e[o]===null||e[o]===void 0?n:Gt(e[o])).join(r),an=(e,t)=>e.map(r=>{if(t.kind==="property"){const{[t.internalName]:n,...o}=r;return{...o,_id:String(n)}}return t.kind==="group"?{...r,_id:r._id===void 0?sn(r,t.names,t.separator,t.nullLabel):Gt(r._id)}:{...r,_id:t.kind==="singleton"?"0":Zn()}}),Ls=e=>{const t=B(e);return delete t.having,delete t.sort,delete t.limit,delete t.page,t},Fe=(e,t)=>e.operator&&t.get(e.operator).kind==="component"?!0:!!e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred)&&Fe(e.pred,t)||Array.isArray(e.pred)&&e.pred.some(r=>typeof r!="string"&&Fe(r,t)),Wt=(e,t,r,n,o,i)=>{const s=e.preds??[],a=s.map((l,f)=>({pred:l,index:f,definition:l.operator?n.get(l.operator):void 0})).filter(({definition:l})=>l?.kind==="component");if(a.length===0&&t.sourcePlan||a.length===0)return;for(const l of s)if((!l.operator||n.get(l.operator).kind!=="component")&&(l.pred&&typeof l.pred=="object"&&!Array.isArray(l.pred)&&Fe(l.pred,n)||Array.isArray(l.pred)&&l.pred.some(f=>typeof f!="string"&&Fe(f,n))))throw new d("UNSUPPORTED_COMPONENT_NESTING","A component operator must currently be the top-level projection operator");const c=[],u=s.filter((l,f)=>!a.some(h=>h.index===f));if(u.length>0){const l=Ls(e);l.preds=u,c.push({kind:"query",logicform:l})}const p=e.groupby?.length??0;for(const{pred:l,index:f,definition:h}of a){const y=h?.createComponent;if(!y)continue;const A=t.projections[p+f]?.name;if(!A)throw new d("INVALID_COMPONENT_PLAN","Component output projection is missing");const R=i?.preds?.[f],b=y({logicform:e,pred:R??l,outputName:A,schema:r,resolveSchema:o,...i?{sourceLogicform:i}:{}});if("logicform"in b&&(b.logicform.preds??[]).some(g=>Fe(g,n)))throw new d("UNSUPPORTED_COMPONENT_NESTING","Nested component operators are not supported yet");c.push("components"in b&&!("mergeRow"in b)?{...b,outputName:A}:b)}return c},ce=e=>e instanceof Date?e.getTime():e,Ds=(e,t,r,n)=>{const o=ce(e),i=ce(r);switch(t){case"$eq":return o===i;case"$ne":return o!==i;case"$gt":return o!=null&&i!==void 0&&i!==null&&o>i;case"$gte":return o!=null&&i!==void 0&&i!==null&&o>=i;case"$lt":return o!=null&&i!==void 0&&i!==null&&o<i;case"$lte":return o!=null&&i!==void 0&&i!==null&&o<=i;case"$in":return Array.isArray(r)&&r.some(s=>ce(s)===o);case"$nin":return Array.isArray(r)&&r.every(s=>ce(s)!==o);case"$exists":return r?e!=null:e==null;case"$contains":return String(e).includes(String(r));case"$regex":return typeof r=="string"&&new RegExp(r,n).test(String(e));default:throw new d("UNSUPPORTED_QUERY_OPERATOR",`Unsupported having operator: ${t}`)}},cn=(e,t)=>{if(!t||typeof t!="object"||Array.isArray(t))return ce(e)===ce(t);const r=Object.entries(t),n=t.args,o=n&&typeof n=="object"&&!Array.isArray(n)?n.options:void 0;return r.every(([i,s])=>{if(i==="args")return!0;if(i==="$and"||i==="$or"){if(!Array.isArray(s))return!1;const a=s.map(c=>cn(e,c));return i==="$and"?a.every(Boolean):a.some(Boolean)}return Ds(e,i,s,typeof o=="string"?o:void 0)})},un=(e,t)=>Object.entries(t).every(([r,n])=>{if(r==="$and"||r==="$or"){if(!Array.isArray(n))return!1;const o=n.map(i=>un(e,i));return r==="$and"?o.every(Boolean):o.some(Boolean)}return cn(e[r],n)}),dn=(e,t)=>t.length===0?"0":e._id===void 0?sn(e,t):Gt(e._id),pn=(e,t)=>{const r=new Map;for(const n of e)for(const o of n){const i=dn(o,t);r.set(i,{...r.get(i)??{},...o})}return[...r.values()]},qs=(e,t)=>{const r=t.groupBy.map(({name:o})=>o);let n=pn(e,r);if(t.having&&(n=n.filter(o=>un(o,t.having))),t.groupLimit){const o=t.groupLimit,i=new Map;for(const s of n){const a=dn(s,o.partitionBy);i.set(a,[...i.get(a)??[],s])}n=[...i.values()].flatMap(s=>s.sort((a,c)=>{for(const u of o.orderBy){const p=ce(a[u.name]),l=ce(c[u.name]);if(p!==l)return p==null?u.direction==="ASC"?-1:1:l==null?u.direction==="ASC"?1:-1:(p<l?-1:1)*(u.direction==="ASC"?1:-1)}return 0}).slice(0,o.count))}if(t.orderBy.length>0&&n.sort((o,i)=>{for(const s of t.orderBy){const a=ce(o[s.name]),c=ce(i[s.name]);if(a!==c)return a==null?s.direction==="ASC"?-1:1:c==null?s.direction==="ASC"?1:-1:(a<c?-1:1)*(s.direction==="ASC"?1:-1)}return 0}),t.pagination?.kind==="rows"){const o=(t.pagination.page-1)*t.pagination.pageSize;n=n.slice(o,o+t.pagination.pageSize)}else if(t.pagination?.kind==="ratio"){const o=Math.ceil(n.length*t.pagination.ratio),i=(t.pagination.page-1)*o;n=n.slice(i,i+o)}return n},fn=(e,t,r)=>{if(!e.schema||e.schema===t.id)return t;const n=r.resolveSchema?.(e.schema);if(!n)throw new d("SCHEMA_RESOLVER_REQUIRED",`Cannot normalize nested LogicForm schema without a schema resolver: ${e.schema}`,{schemaId:e.schema});return n},at=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Cs={year:"\u5E74",quarter:"\u5B63\u5EA6",month:"\u6708",week:"\u5468",day:"\u65E5",hour:"\u65F6",minute:"\u5206",second:"\u79D2"},Pe=(e,t)=>{if(e===null)return t?"null":"\u7A7A\u503C";if(typeof e=="string"||typeof e=="number")return String(e);if(typeof e=="boolean")return t?String(e):e?"\u662F":"\u5426";if(Array.isArray(e))return e.map(n=>Pe(n,t)).join(t?", ":"\u3001");if(!at(e))return t?"the specified condition":"\u6307\u5B9A\u6761\u4EF6";if(Array.isArray(e.roots))return e.roots.map(n=>Pe(n,t)).join(t?", ":"\u3001");if(e.root!==void 0)return Pe(e.root,t);const r=["year","quarter","month","week","day","hour","minute","second"].filter(n=>e[n]!==void 0).map(n=>t?`${n} ${String(e[n])}`:`${String(e[n])}${Cs[n]??""}`);return r.length>0?r.join(t?", ":""):t?"the specified condition":"\u6307\u5B9A\u6761\u4EF6"},ct=(e,t,r)=>e.filter(Boolean).join(r?t==="$and"?" and ":" or ":t==="$and"?"\u4E14":"\u6216"),ln=(e,t,r,n)=>{const s=(n?{$eq:"is",$ne:"is not",$gt:"is greater than",$gte:"is at least",$lt:"is less than",$lte:"is at most",$in:"is one of",$nin:"is none of",$contains:"contains",$regex:"matches",$recursive:"is"}:{$eq:"\u4E3A",$ne:"\u4E0D\u4E3A",$gt:"\u5927\u4E8E",$gte:"\u5927\u4E8E\u7B49\u4E8E",$lt:"\u5C0F\u4E8E",$lte:"\u5C0F\u4E8E\u7B49\u4E8E",$in:"\u4E3A",$nin:"\u4E0D\u4E3A",$contains:"\u5305\u542B",$regex:"\u5339\u914D",$recursive:"\u5C5E\u4E8E"})[e];if(!s)return;const a=e==="$in"?n?"":"\u4E4B\u4E00":e==="$nin"?n?"":"\u4E2D\u7684\u4EFB\u4E00\u9879":e==="$recursive"?n?" or a descendant":"\u53CA\u5176\u4E0B\u7EA7":"";return n?`${t} ${s} ${r}${a}`:`${t}${s}${r}${a}`},mn=(e,t,r)=>{if(!at(t)||Object.keys(t).every(o=>!o.startsWith("$")))return ln("$eq",e,Pe(t,r),r)??"";const n=[];for(const[o,i]of Object.entries(t))if((o==="$and"||o==="$or")&&Array.isArray(i))n.push(ct(i.map(s=>mn(e,s,r)),o,r));else if(o==="$exists")n.push(r?`${e} ${i?"exists":"does not exist"}`:`${i?"\u6709":"\u65E0"}${e}`);else if(o!=="args"){const s=o==="$regex"&&at(i)?Pe(i.pattern,r):Pe(i,r),a=ln(o,e,s,r);a&&n.push(a)}return ct(n,"$and",r)},yn=(e,t="zh-CN")=>{const r=t.toLowerCase().startsWith("en"),n=[];for(const[o,i]of Object.entries(e))(o==="$and"||o==="$or")&&Array.isArray(i)?n.push(ct(i.map(s=>at(s)?yn(s,t):""),o,r)):i!==void 0&&n.push(mn(o,i,r));return ct(n,"$and",r)},Ne=(e,t,r={})=>{if(e.name!==void 0){if(typeof e.name!="string"||e.name.length===0)throw new d("INVALID_PRED_NAME","PredItem name must be a non-empty string");return e.name}const n=r.locale??"zh-CN",o=n.toLowerCase().startsWith("en"),i=Array.isArray(e.pred)?e.pred.map(p=>typeof p=="string"?p:Ne(p,t,r)):[],s=typeof e.pred=="string"?e.pred:e.pred&&!Array.isArray(e.pred)?Ne(e.pred,t,r):void 0,a=s??(i.length>0?i.join(o?", ":"\u3001"):o?"rows":"\u6570\u636E\u884C"),c=e.operator?t.get(e.operator).defaultName({operandName:a,...s?{inputName:s}:{},inputNames:i,args:e.args??{},locale:n}):a;if(typeof c!="string"||c.length===0)throw new d("INVALID_PRED_NAME",`Operator defaultName must return a non-empty name: ${e.operator}`,{operator:e.operator});if(!e.query)return c;const u=yn(e.query,n);return u?o?`${c} where ${u}`:`${u}\u7684${c}`:c},Us={name:"boolean",primalType:"boolean",hydrateResult(e){return typeof e=="number"?e===1:e}},js={name:"category",primalType:"string"},ks={name:"currency",primalType:"number"},Ms={name:"date",primalType:"date"},Qs={name:"duration",primalType:"number"},Bs={name:"end_date",primalType:"date"},hn=(e,{property:t,requestEntity:r})=>!t.ref||e===void 0||e===null||typeof e=="object"&&!Array.isArray(e)?e:r(t.ref,e),Ys={name:"object",primalType:"object",hydrateResult:hn},Vs={name:"entity",primalType:"entity",hydrateResult:hn},Fs={name:"file",primalType:"string"},Hs={name:"humanName",primalType:"string"},Gs={name:"ID",primalType:"string"},Ws={name:"image",primalType:"string"},zs={name:"int",primalType:"number"},vs={name:"name",primalType:"string"},xs={name:"number",primalType:"number"},Ks={name:"order",primalType:"number"},Js={name:"percentage",primalType:"number"},Zs={name:"start_date",primalType:"date"},Xs={name:"string",primalType:"string"},ea={name:"timestamp",primalType:"date"},gn=Object.freeze([Gs,Xs,vs,Hs,js,Ws,Fs,xs,zs,ks,Js,Qs,Ks,Us,ea,Ms,Zs,Bs,Vs,Ys]);class $n{#e=new Map;constructor(t=[]){for(const r of t)this.register(r)}register(t){if(!t.name)throw new d("INVALID_SEMANTIC_TYPE","Semantic type name must not be empty");if(this.#e.has(t.name))throw new d("SEMANTIC_TYPE_ALREADY_REGISTERED",`Semantic type is already registered: ${t.name}`,{type:t.name});return this.#e.set(t.name,t),this}get(t){const r=this.#e.get(t);if(!r)throw new d("SEMANTIC_TYPE_NOT_FOUND",`Semantic type is not registered: ${t}`,{type:t});return r}requiresPerPeriodEvaluation(t){return t.property?this.get(t.property.type).requiresPerPeriodEvaluation?.({...t,property:t.property})??!1:!1}}const ta=e=>{const t=new Set,r=new Set;for(const n of e){if(!n.name)throw new d("INVALID_PROPERTY_NAME","Property name must not be empty");if(!n.id)throw new d("INVALID_PROPERTY_ID",`Property ${n.name} physical id must not be empty`);if(t.has(n.name))throw new d("DUPLICATE_PROPERTY_NAME",`Duplicate property name: ${n.name}`,{property:n.name});if(r.has(n.id))throw new d("DUPLICATE_PROPERTY_ID",`Duplicate property physical id: ${n.id}`,{propertyId:n.id});t.add(n.name),r.add(n.id)}},wn=(e,t={})=>{ta(e);const r=e.filter(({type:n})=>n==="timestamp");if(r.length>1)throw new d("MULTIPLE_TIMESTAMP_PROPERTIES","A Schema can declare at most one timestamp Property",{properties:r.map(({name:n})=>n)});if(t.temporalSemantics==="snapshot"&&r.length===0)throw new d("SNAPSHOT_TIMESTAMP_REQUIRED","A snapshot Schema must declare exactly one timestamp Property",{schemaId:t.schemaId})},ra=new Set(["hour","day","week","month","quarter","year"]),An=(e,t)=>{if(e===void 0)return;if(typeof e!="object"||e===null||Array.isArray(e))throw new d("INVALID_TIME_WATERMARK",`${t} timeWatermark must be an object`);const r=e,n=Object.keys(r);if(!(r.type==="database_latest"&&n.length===1)&&!(r.type==="now_offset"&&n.every(o=>o==="type"||o==="offset")&&Number.isInteger(r.offset)))throw new d("INVALID_TIME_WATERMARK",`${t} timeWatermark must be database_latest or now_offset with an integer offset`,{owner:t,timeWatermark:e})},na=(e,t)=>{if(An(e.timeWatermark,`Property ${e.name}`),"_id"in e||"_sid"in e)throw new d("LEGACY_PROPERTY_ID_NOT_ALLOWED",`Property ${e.name} must use id instead of _id; _sid is not supported`,{property:e.name});if("sid"in e)throw new d("PROPERTY_SID_NOT_ALLOWED",`Property ${e.name} must not declare sid`,{property:e.name});const r=e;if(r.is_comparable!==void 0||r.comparable_order!==void 0)throw new d("LEGACY_COMPARABLE_NOT_ALLOWED",`Property ${e.name} must use comparable instead of is_comparable/comparable_order`,{property:e.name});if(e.udf!==void 0){const a=e.udf;if(typeof a!="object"||a===null||Array.isArray(a))throw new d("INVALID_PROPERTY_UDF",`Property ${e.name} udf must be an object containing only sql`,{property:e.name});const c=a,u=Object.keys(c).filter(p=>p!=="sql");if(u.length>0)throw new d("UNSUPPORTED_PROPERTY_UDF",`Property ${e.name} udf only supports sql`,{property:e.name,unsupportedKeys:u});if(typeof c.sql!="string"||c.sql.trim().length===0)throw new d("INVALID_PROPERTY_UDF",`Property ${e.name} udf.sql must be a non-empty string`,{property:e.name})}const n=t.get(e.type),o=e.primal_type==="object"?"entity":e.primal_type;if(o!==void 0&&o!==n.primalType)throw new d("PRIMAL_TYPE_MISMATCH",`Property ${e.name} declares primal_type ${e.primal_type}, but ${e.type} requires ${n.primalType}`,{property:e.name,type:e.type,declared:e.primal_type,expected:n.primalType});if(e.isArray!==void 0&&typeof e.isArray!="boolean")throw new d("INVALID_IS_ARRAY",`Property ${e.name} isArray must be a boolean`,{property:e.name,isArray:e.isArray});if(e.level!==void 0&&(typeof e.level!="string"||e.level.trim().length===0))throw new d("INVALID_PROPERTY_LEVEL",`Property ${e.name} level must be a non-empty string`,{property:e.name,level:e.level});if("is_observation"in e)throw new d("LEGACY_TEMPORAL_SEMANTICS_NOT_ALLOWED",`Property ${e.name} must use Schema temporalSemantics; is_observation is not supported`,{property:e.name});if(e.comparable!==void 0){const a=e.comparable;if(typeof a!="object"||a===null||Array.isArray(a))throw new d("INVALID_COMPARABLE_CATEGORY",`Property ${e.name} comparable must contain values and direction`);const c=a;if(Object.keys(c).some(u=>u!=="values"&&u!=="direction")||!Array.isArray(c.values)||c.values.length===0||c.values.some(u=>typeof u!="string")||new Set(c.values).size!==c.values.length||c.direction!==1&&c.direction!==-1)throw new d("INVALID_COMPARABLE_CATEGORY",`Property ${e.name} comparable requires unique string values and direction 1 or -1`,{property:e.name,comparable:a});if(e.type!=="category"||e.isArray===!0)throw new d("COMPARABLE_CATEGORY_REQUIRED",`Property ${e.name} comparable is only supported by scalar category properties`,{property:e.name,type:e.type})}const i={...e,id:e.id??e.name,primal_type:n.primalType,isArray:e.isArray??!1,is_dynamic:e.udf?.sql!==void 0,...n.primalType==="date"?{granularity:e.granularity??"day"}:{}};if(i.timeWatermark&&i.primal_type!=="date")throw new d("TIME_WATERMARK_DATE_PROPERTY_REQUIRED",`Property ${i.name} timeWatermark is only supported by date Properties`,{property:i.name});if(n.primalType==="entity"||n.primalType==="object"){if(typeof i.ref!="string"||i.ref.length===0)throw new d("PROPERTY_REF_REQUIRED",`Entity property ${i.name} must declare ref`,{property:i.name,type:i.type})}else if(i.ref!==void 0)throw new d("PROPERTY_REF_NOT_ALLOWED",`Property ${i.name} cannot declare ref unless its primal_type is entity`,{property:i.name,type:i.type});if(i.level!==void 0&&i.primal_type!=="entity"&&i.primal_type!=="object")throw new d("PROPERTY_LEVEL_REQUIRES_ENTITY",`Property ${i.name} level requires an entity relation`,{property:i.name,type:i.type});if(n.primalType==="date"||e.type==="duration"){if(i.granularity!==void 0&&!ra.has(i.granularity))throw new d("INVALID_GRANULARITY",`Property ${i.name} has unsupported granularity: ${i.granularity}`,{property:i.name,granularity:i.granularity})}else if(i.granularity!==void 0)throw new d("GRANULARITY_NOT_ALLOWED",`Property ${i.name} cannot declare granularity unless its type supports it`,{property:i.name,type:i.type});return n.validateProperty?.(i),i},_n=(e,t,r=[])=>{An(e.timeWatermark,`Schema ${e.id}`);const n=Ke(r);if("_id"in e||"_sid"in e)throw new d("LEGACY_SCHEMA_ID_NOT_ALLOWED","Schema must use id instead of _id; _sid is not supported");if("sid"in e)throw new d("SCHEMA_SID_NOT_ALLOWED","Schema must not declare sid");if("is_snapshot"in e||"is_observation"in e)throw new d("LEGACY_TEMPORAL_SEMANTICS_NOT_ALLOWED","Schema must use temporalSemantics instead of is_snapshot/is_observation",{schemaId:e.id});const o=e.temporalSemantics??"normal";if(o!=="normal"&&o!=="snapshot")throw new d("INVALID_TEMPORAL_SEMANTICS","Schema temporalSemantics must be normal or snapshot",{schemaId:e.id,temporalSemantics:o});const i=o;if(!e.id)throw new d("INVALID_SCHEMA_ID","Schema id must not be empty");let s=e.properties.map(f=>na(f,t));if(e.type==="entity"&&!s.some(({type:f})=>f==="timestamp")&&s.some(({type:f})=>f==="start_date")&&s.some(({type:f})=>f==="end_date")&&!s.some(({name:f})=>f==="\u65E5\u671F")){const f=s.find(({type:h})=>h==="start_date");f&&(s=[...s,{id:"__chatbi__timestamp__placeholder__",name:"\u65E5\u671F",type:"timestamp",primal_type:"date",isArray:!1,is_dynamic:!0,is_supplementary:!0,udf:{sql:f.id}}])}wn(s,{temporalSemantics:i,schemaId:e.id});const a=n.flatMap(f=>f.schemaMetadata?[f.schemaMetadata]:[]);let c={};for(const f of a)c={...c,...f.resolve(e,s)};const u=e.parentProperty===void 0?void 0:s.find(({id:f,name:h})=>f===e.parentProperty||h===e.parentProperty);if(e.parentProperty!==void 0&&!u)throw new d("RECURSIVE_PARENT_PROPERTY_REQUIRED",`Schema parentProperty does not exist: ${e.parentProperty}`,{schemaId:e.id,property:e.parentProperty});const p=new Set(n.flatMap(f=>[...f.schemaMetadata?.keys??[],...f.legacySchemaKeys??[]]));return{...Object.fromEntries(Object.entries(e).filter(([f])=>f!=="parentProperty"&&!p.has(f))),temporalSemantics:i,properties:s,...c,...u?{parentProperty:u.name}:{}}};W.extend(Xn),W.extend(We),W.extend(ze);const oa="YYYY-MM-DD HH:mm:ss",ia=new Set(["YTD","QTD","MTD","WTD","DTD"]),sa=new Set(["$eq","$gt","$gte","$lt","$lte","$in","$nin","$and","$or"]),ut=["second","minute","hour","day","week","month","quarter","year"],Te=e=>Object.prototype.toString.call(e)==="[object Object]",zt=e=>!Te(e)||"$gte"in e||"$gt"in e||"$lte"in e||"$lt"in e||"$or"in e||"$ne"in e?!1:typeof e.granularity=="string"&&ut.includes(e.granularity)&&typeof e.offset=="number"||ut.some(t=>t in e),Le=e=>W(e).format(oa),aa=(e,t)=>ut.find(r=>r in e||t!==void 0),ca=(e,t,r)=>t==="month"?e.month(r-1):t==="day"?e.date(r):t==="week"?e.isoWeek(r):t==="quarter"?e.quarter(r):e.set(t,r),En=(e,t)=>{const r=typeof e.granularity=="string"?e.granularity:void 0,n=r?{[r]:e.offset}:void 0,o=r??aa(e,void 0)??"day";let i=W(t).millisecond(0);for(const a of[...ut].reverse()){const c=e[a];typeof c=="number"&&(i=ca(i,a,c));const u=n?.[a];typeof u=="number"&&u!==0&&(i=i.add(u,a))}const s=o==="week"?"isoWeek":o;return{$gte:Le(i.startOf(s)),$lte:Le(i.endOf(s))}},ua=(e,t)=>{const r=W(t),o={DTD:()=>r.startOf("day"),WTD:()=>r.startOf("isoWeek"),MTD:()=>r.startOf("month"),QTD:()=>r.startOf("quarter"),YTD:()=>r.startOf("year")}[e];return{$gte:Le(o()),$lte:Le(r.endOf("day"))}},vt=async(e,t)=>{const r=W(String(e.$lte)),n=await t.requestTimeWatermark(r.toDate());if(!n)return e;const o=t.property.granularity??"day",i=o==="week"?"isoWeek":o,s=W(n).endOf(i),a=W(String(e.$gte));if(a.isValid()&&s.isBefore(a))return e;const c=s.isBefore(r)?s:r;return{...e,$lte:Le(c)}},xt=async(e,t)=>ie(e)?e:e instanceof Date||typeof e=="string"&&W(e).isValid()?Le(e):typeof e=="string"&&ia.has(e)?vt(ua(e,t.now),t):zt(e)?vt(En(e,t.now),t):e,In=async(e,t,r)=>{if(e==="$and"||e==="$or")return Array.isArray(t)?Promise.all(t.map(o=>dt(o,r))):t;if(Array.isArray(t))return Promise.all(t.map(o=>xt(o,r)));const n=await xt(t,r);return e==="$eq"&&Te(n)&&"$gte"in n&&"$lte"in n?n:e==="$gte"||e==="$gt"?Te(n)&&"$gte"in n?n.$gte:n:(e==="$lte"||e==="$lt")&&Te(n)&&"$lte"in n?n.$lte:n},dt=async(e,t)=>{if(ie(e))return e;if(Array.isArray(e))return Promise.all(e.map(o=>dt(o,t)));if(!Te(e))return xt(e,t);if("$options"in e)throw new d("UNSUPPORTED_QUERY_OPERATOR","$options is a LogicForm 1.x field; use args.options in LogicForm 2.0");if("$offset"in e)throw new d("UNSUPPORTED_DATE_VALUE","The legacy {$offset: ...} date form is not supported; use { granularity, offset }");if(("granularity"in e||"offset"in e)&&(!zt(e)||!Number.isInteger(e.offset)))throw new d("INVALID_DATE_VALUE","Relative date values require one granularity and an integer offset");if(zt(e))return vt(En(e,t.now),t);const r=Object.entries(e);if(r.length===1&&r[0]?.[0]==="$eq"){const o=await In("$eq",r[0][1],t);if(Te(o)&&"$gte"in o&&"$lte"in o)return o}const n={};for(const[o,i]of r)n[o]=sa.has(o)?await In(o,i,t):await dt(i,t);return n},da=(e,t)=>t.property.primal_type==="date"?dt(e,t):e,Rn=()=>new $n(gn),pa=/^(\d+)\.(\d+)(?:\.(\d+))?(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/,fa=e=>{if(typeof e!="string")return!1;const t=pa.exec(e);if(!t)return!1;const r=Number(t[1]),n=Number(t[2]),o=Number(t[3]??0);return r!==2?r>2:n>0||o>0?!0:t[4]===void 0},Kt=e=>{if(!fa(e.version))throw new d("UNSUPPORTED_LOGICFORM_VERSION",`This library only supports LogicForm version 2.0 or later; received ${JSON.stringify(e.version)}`,{minimumVersion:"2.0",receivedVersion:e.version})},Sn=(e,t)=>Object.entries(e).some(([r,n])=>t.has(r)?!0:r!=="$and"&&r!=="$or"||!Array.isArray(n)?!1:n.some(o=>typeof o=="object"&&o!==null&&!Array.isArray(o)&&Sn(o,t))),On=(e,t,r,n=[])=>{if(t===void 0||t==="placeholder")return e;if(!At(t))throw new d("INVALID_ENTITY_ID","entity_id must be a non-empty string or a safe integer");const o=_t(r,n);return e&&Sn(e,new Set([o.name,o.id]))?e:{[o.name]:t,...e??{}}},la=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&typeof e.schema=="string"&&typeof e.query=="object"&&e.query!==null&&!Array.isArray(e.query),ma=e=>{if(!ie(e))return!1;const t=e;return t.groupby!==void 0||t.preds!==void 0||t.from!==void 0||t.having!==void 0||t.sort!==void 0||t.limit!==void 0||t.limitBy!==void 0||t.page!==void 0},Jt=async(e,t)=>{if(ie(e)){if(!t.normalizeNestedLogicform)throw new d("LOGICFORM_NORMALIZER_UNAVAILABLE","Nested query LogicForm must be normalized through normalizeLogicform");return t.normalizeNestedLogicform(e)}return Array.isArray(e)?Promise.all(e.map(r=>Jt(r,t))):typeof e!="object"||e===null||e instanceof Date?e:Object.fromEntries(await Promise.all(Object.entries(e).map(async([r,n])=>[r,await Jt(n,t)])))},bn=(e,t)=>Object.fromEntries(Object.entries(e).map(([r,n])=>(r==="$and"||r==="$or")&&Array.isArray(n)?[r,n.map(o=>bn(o,t))]:[`${t}_${r}`,n])),ya=e=>{if(typeof e!="object"||e===null||Array.isArray(e))return e;const t=Object.entries(e),[r]=t;return t.length===1&&r?.[0]==="$eq"?r[1]:e},Pn=async(e,t,r,n)=>{const o=u=>{if(Array.isArray(u)){u.forEach(o);return}if(typeof u!="object"||u===null||ie(u))return;const p=u;if("$options"in p)throw new d("UNSUPPORTED_QUERY_OPERATOR","$options is a LogicForm 1.x field; use args.options in LogicForm 2.0");Object.values(p).forEach(o)};o(e);const i=n.semanticTypes.get(r.type),s={schema:t,property:r,now:n.now??new Date,requestTimeWatermark:u=>n.requestTimeWatermark?.(t,r,u)??Promise.resolve(void 0)},a=await da(B(e),s),c=i.normalizeQuery?i.normalizeQuery(a,s):a;if(r.comparable){const u=new Set(r.comparable.values),p=(l,f)=>{if(!(ie(l)||l===null)){if(Array.isArray(l)){l.forEach(h=>p(h,f));return}if(typeof l=="object"){Object.entries(l).forEach(([h,y])=>{["args","$exists","$regex","$contains"].includes(h)||p(y,h)});return}if(!(f&&["args","$exists","$regex","$contains"].includes(f))&&(typeof l!="string"||!u.has(l)))throw new d("COMPARABLE_VALUE_NOT_FOUND",`Comparable category ${r.name} does not contain value: ${JSON.stringify(l)}`,{property:r.name,value:l})}};p(c)}return c},ha=async(e,t,r,n)=>{const o=typeof e=="object"&&e!==null&&!Array.isArray(e)?e:{root:e},i=typeof o.schema=="string"?o.schema:r.ref??t.id,s=i===t.id?t:n.resolveSchema?.(i);if(!s)throw new d("SCHEMA_RESOLVER_REQUIRED",`$recursive requires Schema ${i}`);const a=o.idProperty??o.id_property,c=s.properties.filter(({type:y})=>y==="ID"),u=a===void 0?c.length===1?c[0]:void 0:s.properties.find(({id:y,name:A})=>y===a||A===a);if(!u||a===void 0&&c.length!==1)throw new d("RECURSIVE_ID_PROPERTY_REQUIRED",`$recursive Schema ${i} must have exactly one ID property or idProperty`);const p=Array.isArray(o.roots),l=p?o.roots:o.root===void 0?[]:[o.root];if(!p&&l.length===0||l.some(y=>y===void 0))throw new d("RECURSIVE_ROOT_REQUIRED","$recursive requires root or roots");const f=await Promise.all(l.map(y=>Pn(y,s,u,n))),h=o.parentProperty??o.parent_property??s.parentProperty??"pid";if(typeof h!="string"||h.length===0)throw new d("RECURSIVE_PARENT_PROPERTY_REQUIRED","$recursive parentProperty must be a string");if(o.includeSelf!==void 0&&typeof o.includeSelf!="boolean"||o.include_self!==void 0&&typeof o.include_self!="boolean")throw new d("INVALID_RECURSIVE_QUERY","$recursive includeSelf must be boolean");return{schema:i,roots:f,includeSelf:o.includeSelf??o.include_self??!0,idProperty:u.name,parentProperty:h}},Zt=async(e,t,r)=>{const n={};for(const[o,i]of Object.entries(e)){if(o==="$and"||o==="$or"){if(!Array.isArray(i))throw new d("INVALID_QUERY_VALUE",`${o} requires an array`);n[o]=await Promise.all(i.map(async u=>{if(typeof u!="object"||u===null||Array.isArray(u))throw new d("INVALID_QUERY_VALUE",`${o} items must be query objects`);return Zt(u,t,r)}));continue}const s=G(t,o,r.resolveSchema);if(ma(i)&&(s.property.primal_type==="entity"||s.property.primal_type==="object")&&s.property.ref){if(i.schema!==s.property.ref)throw new d("RELATION_SCHEMA_MISMATCH",`Relation ${s.canonicalName} references ${s.property.ref}, not ${i.schema??"undefined"}`);if(!r.normalizeNestedLogicform)throw new d("LOGICFORM_NORMALIZER_UNAVAILABLE","Nested query LogicForm must be normalized through normalizeLogicform");const u=await r.normalizeNestedLogicform(i);n[s.canonicalName]={$in:u};continue}if(la(i)){if(i.version!==void 0&&Kt(i),s.property.primal_type!=="entity"&&s.property.primal_type!=="object")throw new d("INVALID_RELATION_QUERY",`Relation query ${o} must resolve to an entity property`);if(!s.property.ref)throw new d("INVALID_RELATION_QUERY",`Nested LogicForm query requires an object property: ${s.canonicalName}`);if(i.schema!==s.property.ref)throw new d("RELATION_SCHEMA_MISMATCH",`Relation ${s.canonicalName} references ${s.property.ref}, not ${i.schema}`);const u=r.resolveSchema?.(i.schema);if(!u)throw new d("SCHEMA_RESOLVER_REQUIRED",`Nested relation query requires Schema ${i.schema}`);const p=On(i.query,i.entity_id,u,r.plugins),l=await Zt(p,u,r);Object.assign(n,bn(l,s.canonicalName));continue}if(typeof i=="object"&&i!==null&&!Array.isArray(i)&&Object.prototype.hasOwnProperty.call(i,"$recursive")){const u=i;if(Object.keys(u).filter(l=>l!=="$recursive").length>0)throw new d("INVALID_RECURSIVE_QUERY","$recursive cannot be combined with other field operators");n[s.canonicalName]={$recursive:await ha(u.$recursive,s.schema,s.property,r)};continue}const a=await Jt(i,r),c=await Pn(a,s.schema,s.property,r);n[s.canonicalName]=ya(c)}return n},Nn=async(e,t,r)=>{if(e)return Zt(e,t,r)},ga=e=>{if(typeof e!="object"||e===null||Array.isArray(e))return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||t===null},$a=e=>{if(e.args===void 0||Object.keys(e.args).length>0)return e;const{args:t,...r}=e;return r},pt=async(e,t,r)=>{if("components"in e)throw new d("PRED_COMPONENTS_NOT_ALLOWED","PredItem components is not supported; use a pred array for multiple inputs");const n=r.operators,o={...r.locale?{locale:r.locale}:{}};if(!n)throw new Error("Normalizer operator registry is not initialized");if(e.name!==void 0&&(typeof e.name!="string"||e.name.length===0))throw new d("INVALID_PRED_NAME","PredItem name must be a non-empty string");if(e.name==="_id")throw new d("RESERVED_OUTPUT_NAME","PredItem name _id is reserved for executor-owned row identity");if(e.args!==void 0&&!ga(e.args))throw new d("INVALID_OPERATOR_ARGS","Pred args must be a plain object");const i=e.schema===void 0||e.schema===t.id?t:r.resolveSchema?.(e.schema);if(!i)throw new d("SCHEMA_RESOLVER_REQUIRED",`Cross-Schema pred requires Schema ${e.schema}`);const s=await Nn(e.query,i,r),a=Array.isArray(e.pred)?await Promise.all(e.pred.map(p=>pt(typeof p=="string"?{pred:p}:p,i,r))):void 0,c={...e,...s?{query:s}:{},...a?{pred:a}:{}},u=p=>{const l=p.operator?n.get(p.operator).normalizePred?.({pred:p,schema:i})??p:p;return $a(l)};if(typeof e.pred=="string"){const p=G(i,e.pred,r.resolveSchema),l={...c,pred:p.canonicalName};return u({...l,name:l.name??Ne(l,n,o)})}if(e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred)){const p={...c,pred:await pt(e.pred,i,r)};return u({...p,name:p.name??Ne(p,n,o)})}if(a)return u({...c,name:c.name??Ne(c,n,o)});if(e.pred!==void 0)throw new d("UNSUPPORTED_PRED","A pred must be a property name or nested pred");return u({...c,name:c.name??Ne(c,n,o)})},Tn=(e,t,r)=>Promise.all((e??[]).map(n=>pt(n,t,r))),wa=(e,t,r)=>Tn(e??[],t,r),De=(e,t)=>{throw new d("INVALID_PAGINATION",e,t)},Aa=e=>{"skip"in e&&De("skip has been removed; use the 1-based page field",{skip:e.skip});const t=e.groupby?.length??0;e.limitBy!==void 0&&((!Number.isInteger(e.limitBy)||e.limitBy<=0)&&De("limitBy must be a positive integer",{limitBy:e.limitBy}),t<2&&(e.limit=e.limitBy,delete e.limitBy));const{limit:r,page:n}=e;if(r===void 0){n!==void 0&&De("page requires limit",{page:n});return}if((!Number.isFinite(r)||r<0&&r!==-1||r>1&&!Number.isInteger(r))&&De("limit must be -1, a non-negative integer, or a ratio between 0 and 1",{limit:r}),r===-1){n!==void 0&&De("page cannot be used with unlimited results",{limit:r,page:n}),delete e.limit;return}n!==void 0&&(!Number.isInteger(n)||n<1)&&De("page must be a positive integer starting from 1",{page:n}),e.page=n??1},_a=e=>e.property.name,Ln=(e,t,r,n,o=new Set)=>{if(o.has(e.id))return;const i=new Set(o).add(e.id),s=e.properties.find(a=>a.id===t||a.name===t);if(s)return s.name;if(n==="timestamp"){const a=e.properties.find(c=>c.type==="timestamp");if(a)return a.name}for(const a of e.properties){if(!a.ref||a.primal_type!=="entity"&&a.primal_type!=="object")continue;const c=r.resolveSchema?.(a.ref);if(!c)continue;const u=Ln(c,t,r,n,i);if(u)return`${a.name}_${u}`}},Ea=(e,t,r)=>{const n=[...new Set((e.preds??[]).map(s=>s.schema).filter(s=>!!(s&&s!==t.id)))];if(n.length===0)return e;const o={};for(const[s,a]of Object.entries(e.propertyResolve??{})){const c=r.resolveSchema?.(s),u={};for(const[p,l]of Object.entries(a))try{const f=G(t,p,r.resolveSchema),h=c?G(c,l,r.resolveSchema):void 0;u[f.canonicalName]=h?.canonicalName??l}catch{u[p]=l}o[s]=u}const i=[...(e.groupby??[]).map(s=>s.pred),...Object.keys(e.query??{}).filter(s=>s!=="$and"&&s!=="$or")];for(const s of i){if(typeof s!="string")continue;let a;try{a=G(t,s,r.resolveSchema)}catch{continue}const c=_a(a);for(const u of n){const p=r.resolveSchema?.(u),l=p&&Ln(p,c,r,a.property.type);l&&l!==a.canonicalName&&(o[u]={...o[u]??{},[a.canonicalName]:l})}}return Object.keys(o).length>0?{...e,propertyResolve:o}:e},Ia=e=>{if(e!==void 0){if(typeof e!="object"||e===null||Array.isArray(e))throw new d("INVALID_PROPERTY_RESOLVE","propertyResolve must be an object");for(const[t,r]of Object.entries(e)){if(typeof r!="object"||r===null||Array.isArray(r))throw new d("INVALID_PROPERTY_RESOLVE",`propertyResolve.${t} must be an object`);for(const[n,o]of Object.entries(r))if(typeof o!="string"||o.length===0)throw new d("INVALID_PROPERTY_RESOLVE",`propertyResolve.${t}.${n} must be a non-empty string`)}}},Ra=async(e,t,r)=>{if(!e)return;const n=fn(e,t,r);return qe(e,n,r)},qe=async(e,t,r)=>{if(r=r.operators?r:{...r,operators:we(r.plugins)},Kt(e),Ia(e.propertyResolve),e.output&&e.output.type!=="data"&&e.output.type!=="sql")throw new d("UNSUPPORTED_OUTPUT",`Output type is not supported: ${e.output.type}`);const o=B(e),i={...r,normalizeNestedLogicform:async f=>{const h=fn(f,t,r);return qe(f,h,r)}};Aa(o);const s=await Ra(o.from,t,i),a=s&&r.resolveFromSchema?r.resolveFromSchema(s,t):t,c=await Nn(On(o.query,o.entity_id,a,r.plugins),a,i),u=o.preds===void 0&&o.groupby===void 0?a.properties.filter(f=>r.canProjectProperty?.(a,f)??!0).map(f=>({pred:f.name,name:f.name})):o.preds;o.preds=await Tn(u,a,i);const p=await wa(o.groupby,a,i);return p.length>0?o.groupby=p:delete o.groupby,s?o.from=s:delete o.from,c?o.query=c:delete o.query,Ea(o,a,i)},Xt=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),he=(e,t)=>{if(e){if(!Xt(e,t))throw new d("TABLE_PERMISSION_DENIED",`Schema is not included in the table permissions: ${t}`,{schemaId:t});return e[t]}},_e=(e,t,r)=>{const n=he(e,t)?.columnPermissions?.whitelist;return!n||n.includes(r.name)||n.includes(r.id)},Ce=(e,t,r)=>{if(!_e(e,t.id,r))throw new d("COLUMN_PERMISSION_DENIED",`Property is not included in the column permissions: ${t.id}.${r.name}`,{schemaId:t.id,property:r.name,propertyId:r.id})},er=(e,t,r,n)=>{const o=G(t,e,n);for(const i of o.relations)he(r,i.targetSchema.id),Ce(r,i.sourceSchema,i.property);Ce(r,o.schema,o.property)},Dn=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&typeof e.schema=="string"&&typeof e.query=="object"&&e.query!==null&&!Array.isArray(e.query),Sa=(e,t,r,n)=>{if(typeof e!="object"||e===null||Array.isArray(e)||!Xt(e,"$recursive"))return;const o=e.$recursive,i=typeof o=="object"&&o!==null&&!Array.isArray(o)?o:{},s=typeof i.schema=="string"?i.schema:t.property.ref??t.schema.id,a=n(s);if(he(r,s)?.rowPermissions!==void 0)throw new d("RECURSIVE_ROW_PERMISSION_UNSUPPORTED",`$recursive cannot safely apply row permissions for Schema ${s}`,{schemaId:s});const u=i.idProperty??i.id_property,p=u===void 0?a.properties.find(({type:h})=>h==="ID"):a.properties.find(({id:h,name:y})=>h===u||y===u),l=i.parentProperty??i.parent_property??a.parentProperty??"pid",f=a.properties.find(({id:h,name:y})=>h===l||y===l);p&&Ce(r,a,p),f&&Ce(r,a,f)},tr=(e,t,r,n)=>{if(ie(e)){mt(e,t,r,n);return}if(Array.isArray(e)){for(const o of e)tr(o,t,r,n);return}if(!(typeof e!="object"||e===null||e instanceof Date))for(const o of Object.values(e))tr(o,t,r,n)},ft=(e,t,r,n,o)=>{if(e)for(const[i,s]of Object.entries(e)){if(i==="$and"||i==="$or"){if(Array.isArray(s))for(const c of s)ft(c,t,r,n,o);continue}const a=G(t,i,n);if(er(i,t,r,n),Sa(s,a,r,n),Dn(s)){if(a.property.ref!==s.schema)continue;const c=n(s.schema);he(r,c.id),At(s.entity_id)&&Ce(r,c,_t(c,o)),ft(s.query,c,r,n,o);continue}tr(s,r,n,o)}},lt=(e,t,r,n,o)=>{const i=e.schema?n(e.schema):t;e.schema&&he(r,e.schema),typeof e.pred=="string"?er(e.pred,i,r,n):e.pred&&!Array.isArray(e.pred)&&lt(e.pred,i,r,n,o);for(const s of Array.isArray(e.pred)?e.pred:[])typeof s=="string"?er(s,i,r,n):lt(s,i,r,n,o);ft(e.query,i,r,n,o)},mt=(e,t,r,n=[])=>{if(!e.schema){if(e.from){mt(e.from,t,r,n);return}throw new d("LOGICFORM_SCHEMA_REQUIRED","A physical LogicForm must define schema")}const o=r(e.schema);if(he(t,o.id),At(e.entity_id)&&Ce(t,o,_t(o,n)),e.from){mt(e.from,t,r,n);return}ft(e.query,o,t,r,n);for(const i of e.preds??[])lt(i,o,t,r,n);for(const i of e.groupby??[])lt(i,o,t,r,n)},yt=(e,t)=>{if(Array.isArray(e))return e.map(o=>yt(o,t));if(typeof e!="object"||e===null||e instanceof Date)return e;const r=Object.entries(e).map(([o,i])=>[o,yt(i,t)]),n=Object.fromEntries(r);return Dn(e)&&!Xt(e,"version")&&(n.version=t),n},Oa=(e,t,r)=>{const n=[],o=(s,a)=>{if(s)for(const[c,u]of Object.entries(s))if((c==="$and"||c==="$or")&&Array.isArray(u))for(const p of u)o(p,a);else c.startsWith("$")||n.push(G(a,c,r))},i=(s,a)=>{const c=s.schema?r(s.schema):a;typeof s.pred=="string"?n.push(G(c,s.pred,r)):s.pred&&!Array.isArray(s.pred)&&i(s.pred,c);for(const u of Array.isArray(s.pred)?s.pred:[])typeof u=="string"?n.push(G(c,u,r)):i(u,c);o(s.query,c)};o(e.query,t);for(const s of e.preds??[])i(s,t);for(const s of e.groupby??[])i(s,t);return n},ba=(e,t,r)=>{if(!e.schema)return[];const n=r(e.schema),o=new Set,i=[];for(const s of Oa(e,n,r)){if(s.relations.length===0)continue;let a=-1;if(s.relations.forEach(({targetSchema:l},f)=>{t[l.id]?.rowPermissions!==void 0&&(a=f)}),a<0)continue;const c=s.relations.slice(0,a+1),u=c.map(({property:l})=>l.name).join("_");if(o.has(u))continue;o.add(u);let p={};for(const l of[...c].reverse())p={[l.property.name]:{schema:l.targetSchema.id,query:p}};i.push(p)}return i},Ue=(e,t,r,n,o,i)=>ie(e)?Ee(e,t,r,n,o,i):Array.isArray(e)?e.map(s=>Ue(s,t,r,n,o,i)):typeof e!="object"||e===null||e instanceof Date?e:Object.fromEntries(Object.entries(e).map(([s,a])=>[s,Ue(a,t,r,n,o,i)])),rr=(e,t,r,n,o,i)=>({...e,...e.query?{query:Ue(e.query,t,r,n,o,i)}:{},...e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred)?{pred:rr(e.pred,t,r,n,o,i)}:{},...Array.isArray(e.pred)?{pred:e.pred.map(s=>typeof s=="string"?s:rr(s,t,r,n,o,i))}:{}}),Ee=(e,t,r,n=!0,o=new Set,i=[])=>{if(!t)return B(e);if(!e.schema){const h=B(e);return h.from&&(h.from=Ee(h.from,t,r,n,new Set,i)),h}n&&mt(e,t,r,i);const s=he(t,e.schema),a=o.has(e.schema),c=new Set(o).add(e.schema),u=B(e);u.query&&(u.query=Ue(u.query,t,r,n,new Set,i)),u.preds&&(u.preds=u.preds.map(h=>rr(h,t,r,n,new Set,i))),u.from&&(u.from=Ee(u.from,t,r,n,new Set,i));const p=a||e.from?void 0:s?.rowPermissions,l=(e.from?[]:ba(e,t,r)).map(h=>Ue(yt(h,e.version),t,r,!1,c,i));p&&l.push(Ue(yt(B(p),e.version),t,r,!1,c,i));const f=[u.query,...l].filter(h=>h!==void 0&&Object.keys(h).length>0);return f.length===1?u.query=f[0]:f.length>1?u.query={$and:f}:delete u.query,u},Pa=(e,t)=>{if(e)for(const[r,n]of Object.entries(e)){const o=t(r),i=n.columnPermissions?.whitelist;if(i&&(!Array.isArray(i)||i.some(s=>typeof s!="string")))throw new d("INVALID_COLUMN_PERMISSIONS",`Column permissions whitelist must be an array of strings: ${r}`,{schemaId:r});for(const s of i??[])if(!o.properties.some(({id:a,name:c})=>a===s||c===s))throw new d("INVALID_COLUMN_PERMISSION",`Column permission property not found: ${r}.${s}`,{schemaId:r,property:s})}},qn=(e,t)=>{const r=new Intl.DateTimeFormat("en-US",{timeZone:t,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23"}).formatToParts(e),n=o=>Number(r.find(i=>i.type===o)?.value);return{year:n("year"),month:n("month"),day:n("day"),hour:n("hour"),minute:n("minute"),second:n("second")}},Cn=(e,t)=>{const r=Date.UTC(e.year,e.month-1,e.day,e.hour,e.minute,e.second);let n=r;for(let o=0;o<3;o+=1){const i=qn(new Date(n),t),s=Date.UTC(i.year,i.month-1,i.day,i.hour,i.minute,i.second);n+=r-s}return new Date(n)},Na=(e,t)=>{const r=qr(e.expireAt);if(!r)throw new Error(`Invalid daily expiration time: ${e.expireAt}`);if(!e.timeZone){const i=new Date(t);return i.setHours(r.hour,r.minute,r.second,0),i.getTime()<=t.getTime()&&i.setDate(i.getDate()+1),i}const n=qn(t,e.timeZone);let o=Cn({...n,...r},e.timeZone);if(o.getTime()<=t.getTime()){const i=new Date(Date.UTC(n.year,n.month-1,n.day+1));o=Cn({year:i.getUTCFullYear(),month:i.getUTCMonth()+1,day:i.getUTCDate(),...r},e.timeZone)}return o},Ta=(e,t)=>{const r=e.flatMap(n=>n.mode==="manual"?[]:n.mode==="ttl"?[new Date(t.getTime()+n.ttlSeconds*1e3)]:[Na(n,t)]);return r.length===0?void 0:new Date(Math.min(...r.map(n=>n.getTime())))},He=(e,t,r)=>{if(Be(e)){t.push(e.plan);return}if(Fr(e)){r.set(`${e.schemaId}:${e.source}`,{schemaId:e.schemaId,source:e.source});return}if(Array.isArray(e)){for(const n of e)He(n,t,r);return}if(!(typeof e!="object"||e===null||e instanceof Date))for(const n of Object.values(e))He(n,t,r)},Ge=(e,t,r)=>{if(e.kind==="window"){Ge(e.input,t,r);for(const n of e.partitionBy)Ge(n,t,r);return}if(e.kind==="operator"){He(e.query,t,r),e.input&&Ge(e.input,t,r);for(const n of e.inputs??[])Ge(n,t,r)}},te=e=>{const t=new Map,r=o=>{t.set(`${o.schemaId}:${o.source}`,o)};if(e.subplans)for(const o of e.subplans)for(const i of te(o))r(i);else if(e.sourcePlan)for(const o of te(e.sourcePlan))r(o);else e.source&&r({schemaId:e.schemaId,source:e.source});for(const o of e.joins??[])r({schemaId:o.targetSchemaId,source:o.targetSource});const n=[];He(e.query,n,t),He(e.having,n,t);for(const o of e.projections)Ge(o.expression,n,t);for(const o of n)for(const i of te(o))r(i);return[...t.values()]},ht=e=>{const t=new Map;for(const r of e.flat())t.set(`${r.schemaId}:${r.source}`,r);return[...t.values()]},Un=async(e,t)=>{try{return await e.execute(t)}catch(r){const n=r instanceof Error?r.message:String(r),o=`${e.kind} provider \u6267\u884C SQL \u4EA7\u751F\u9519\u8BEF\uFF1A`;throw r instanceof Error?(r.message.startsWith(o)||(r.message=`${o}${n}`),r):new Error(`${o}${n}`,{cause:r})}},La=(e,t)=>{const r=[];for(const n of e){const o=t.findSource(n.schemaId,n.source);if(!o?.freshness)return;r.push(o.freshness)}return r},je=async(e,t,r)=>{e=jn(e),r.signal?.throwIfAborted();const n=r.cache?La(t,r.schemaMappings):void 0;if(!r.cache||!n)return Un(r.provider,{...e,...r.signal?{signal:r.signal}:{}});const o={namespace:r.cache.namespace,provider:r.provider.kind,sql:e.sql,parameters:e.parameters};try{const s=await r.cache.store.get(o);if(r.signal?.throwIfAborted(),s)return[...s]}catch{r.signal?.throwIfAborted()}const i=await Un(r.provider,{...e,...r.signal?{signal:r.signal}:{}});try{const s=Ta(n,new Date);await r.cache.store.set(o,i,{sources:[...new Set(t.map(({source:a})=>a))],...s?{expiresAt:s}:{}})}catch{}return i},jn=e=>({...e,sql:ys(e.sql)}),Da=e=>{if(e.every(t=>typeof t=="string"))return[...e];if(e.every(t=>typeof t=="number"))return[...e];if(e.every(t=>typeof t=="boolean"))return[...e];throw new TypeError("Entity IDs must have one scalar type")},qa=(e,t,r)=>{const n=Da(t);if(!r||n.length<=r)return{[e]:{$in:n}};const o=[];for(let i=0;i<n.length;i+=r)o.push({[e]:{$in:n.slice(i,i+r)}});return{$or:o}},Ca=async(e,t)=>{if(!_e(t.permissions,e.schema.id,e.idProperty))throw new d("COLUMN_PERMISSION_DENIED",`Entity hydration requires the ID property in the column permissions: ${e.schema.id}.${e.idProperty.name}`,{schemaId:e.schema.id,property:e.idProperty.name});const r=e.schema.properties.filter(u=>_e(t.permissions,e.schema.id,u)),n={version:t.version,schema:e.schema.id,query:qa(e.idProperty.name,e.ids,t.provider.maxInListItems),preds:r.map(u=>({pred:u.name,name:u.name}))},o=Ee(n,t.permissions,t.resolveSchema,!0,new Set,t.plugins),i=await qe(o,e.schema,{semanticTypes:t.semanticTypes,operators:t.operators,...t.plugins?{plugins:t.plugins}:{},...t.locale?{locale:t.locale}:{},resolveSchema:t.resolveSchema}),s=se(i,e.schema,t.operators,t.schemaMappings,{resolveSchema:t.resolveSchema,canUsePropertyRowIdentity:(u,p)=>_e(t.permissions,u.id,p)}),a=re(s,t.provider,t.operators);t.onCompiled?.(a,i);const c=await je(a,te(s),{provider:t.provider,schemaMappings:t.schemaMappings,...t.cache?{cache:t.cache}:{},...t.signal?{signal:t.signal}:{}});return an(c,s.rowIdentity)},kn=e=>String(e),Ua=(e,t,r)=>{const n=`\u6570\u636E\u5E93\u4E2D\u672A\u627E\u5230 ID \u4E3A\u300C${kn(r)}\u300D\u7684\u5B9E\u4F53`,o={};for(const i of e.properties)i.id===t.id?o[i.name]=r:i.isArray?o[i.name]=[]:o[i.name]=i.primal_type==="string"?n:null;return o._id=kn(r),o},Mn=(e,t)=>`${e}:${String(t)}`,ja=e=>{const t=e.properties.filter(({type:n})=>n==="ID"),r=t[0];if(t.length!==1||!r)throw new d("RELATION_TARGET_ID_REQUIRED",`Relation target ${e.id} must contain exactly one ID property`,{schemaId:e.id,count:t.length});return r};class ka{#e;#r=new Map;#t=new Map;#n=new Map;#o=!1;constructor(t){this.#e=t}load=(t,r)=>{const n=Mn(t,r),o=this.#r.get(n);if(o)return Promise.resolve(o);const i=this.#t.get(n);if(i)return i;const s=this.#e.resolveSchema(t),a=ja(s);let c,u;const p=new Promise((f,h)=>{c=f,u=h}),l=this.#n.get(t)??{schema:s,idProperty:a,loads:new Map};return l.loads.set(n,{id:r,resolve:f=>c?.(f),reject:f=>u?.(f)}),this.#n.set(t,l),this.#t.set(n,p),this.#i(),p};#i(){this.#o||(this.#o=!0,queueMicrotask(()=>{this.#s()}))}async#s(){this.#o=!1;const t=this.#n;this.#n=new Map,await Promise.all([...t.values()].map(r=>this.#a(r)))}async#a(t){const r={schema:t.schema,idProperty:t.idProperty,ids:[...t.loads.values()].map(({id:n})=>n)};try{const n=await this.#e.fetchEntities(r),o=new Map;for(const i of n){const s=i[t.idProperty.name]??i._id;if(s!=null){const a=typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"||typeof s=="bigint"?String(s):JSON.stringify(s),c=i._id===a?i:{...i,_id:a};o.set(Mn(t.schema.id,s),c)}}for(const[i,s]of t.loads){const a=o.get(i)??Ua(t.schema,t.idProperty,s.id);this.#r.set(i,a),this.#t.delete(i),s.resolve(a)}}catch(n){for(const[o,i]of t.loads)this.#t.delete(o),i.reject(n)}}}const Ma=(e,t)=>{if(!t.isArray||typeof e!="string")return e;const r=e.trim();if(!r.startsWith("[")||!r.endsWith("]"))return e;try{const n=JSON.parse(r);if(!Array.isArray(n))throw new Error("JSON result is not an array");return n}catch(n){throw new d("INVALID_ARRAY_RESULT",`Result column ${t.name} contains invalid array JSON`,{property:t.name,cause:n})}},Qa=async(e,t,r,n)=>{await Promise.all(e.map(async o=>{await Promise.all(t.map(async i=>{if(!(i.name in o))return;const s=Ma(o[i.name],i),a=r.get(i.type).hydrateResult;if(!a){o[i.name]=s;return}o[i.name]=i.isArray&&Array.isArray(s)?await Promise.all(s.map(c=>a(c,{property:i,requestEntity:n}))):await a(s,{property:i,requestEntity:n})}))}))},Qn=5,Ba=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&!(e instanceof Date),Ya=(e,t)=>{const r=t.properties.find(({type:n})=>n==="ID");return r?e[r.name]:void 0},Va=(e,t)=>{const r=structuredClone(e);if(!("_id"in r)){const n=Ya(r,t);(typeof n=="string"||typeof n=="number"||typeof n=="boolean")&&(r._id=String(n))}return r},Fa=(e,t,r,n)=>{const o=`${t.id}:${n?"recursive":"leaf"}`,i=e.get(o);if(i){i.rows.push(r);return}e.set(o,{rows:[r],properties:t.properties,expandEntities:n})},Ha=async(e,t,r)=>{const n=new ka(r);let o=[{rows:e,properties:t,expandEntities:!0}];for(let i=0;o.length>0;i+=1){if(await Promise.all(o.map(a=>{const c=a.expandEntities&&i<Qn;return Qa(a.rows,a.properties,r.semanticTypes,c?n.load:(u,p)=>Promise.resolve(p))})),i>=Qn)return;const s=new Map;for(const a of o)if(a.expandEntities)for(const c of a.properties){if(c.primal_type!=="entity"&&c.primal_type!=="object"||!c.ref)continue;const u=r.resolveSchema(c.ref);for(const p of a.rows){if(!(c.name in p))continue;const l=p[c.name],f=c.isArray?Array.isArray(l)?l:[l]:[l];for(const[h,y]of f.entries()){if(!Ba(y))continue;const A=Va(y,u);c.isArray?f[h]=A:p[c.name]=A,Fa(s,u,A,!c.isArray)}c.isArray&&(p[c.name]=f)}}o=[...s.values()]}},Ga=async(e,t,r)=>{const n=e.map(o=>({...o}));return await Ha(n,t,r),n},nr=e=>`'${e.replaceAll("'","''")}'`,gt=(e,t)=>{if(e==null)return"NULL";if(typeof e=="boolean")return e?"TRUE":"FALSE";if(typeof e=="number")return String(e);if(typeof e=="bigint")return nr(e.toString());if(typeof e=="string")return nr(e);if(e instanceof Date){const r=t==="clickhouse"?e.toISOString().replace("T"," ").replace("Z",""):e.toISOString();return nr(r)}if(Buffer.isBuffer(e)){const r=e.toString("hex");return t==="oracle"?`HEXTORAW('${r}')`:t==="postgresql"?`decode('${r}', 'hex')`:t==="snowflake"?`TO_BINARY('${r}', 'HEX')`:`unhex('${r}')`}throw new TypeError(`Unsupported ${t} display parameter type: ${typeof e}`)},Wa=(e,t)=>e.replace(/\{p(\d+):[^}]+\}/g,(r,n)=>{const o=Number(n);return o in t?gt(t[o],"clickhouse"):r}),za=(e,t)=>e.replace(/:([1-9]\d*)\b/g,(r,n)=>{const o=Number(n)-1;return o in t?gt(t[o],"oracle"):r}),va=(e,t)=>{let r="",n;for(let o=0;o<e.length;o+=1){const i=e[o];if(i){if(n){r+=i,i===n&&(e[o+1]===n?(r+=n,o+=1):n=void 0);continue}if(i==="'"||i==='"'){n=i,r+=i;continue}if(i==="$"){const s=/^\$(\d+)/.exec(e.slice(o)),a=s?.[1];if(s&&a){const c=Number(a)-1;if(c in t){r+=gt(t[c],"postgresql"),o+=s[0].length-1;continue}}}r+=i}}return r},xa=(e,t)=>{let r="",n=0,o;for(let i=0;i<e.length;i+=1){const s=e[i];if(s){if(o){r+=s,s===o&&(e[i+1]===o?(r+=o,i+=1):o=void 0);continue}if(s==="'"||s==='"'||s==="`"){o=s,r+=s;continue}if(s==="?"&&n<t.length){r+=gt(t[n],"snowflake"),n+=1;continue}r+=s}}return r},Ka=e=>e===null?"Nullable(String)":typeof e=="boolean"?"Bool":typeof e=="number"?"Float64":e instanceof Date?"DateTime64(3)":"String",Ja=e=>e instanceof Date?e.toISOString().replace("T"," ").replace("Z",""):e;class Za{kind="clickhouse";client;constructor(t={}){this.client=t.client??to({url:t.url??"http://localhost:8123",username:t.username??"default",password:t.password??"",database:t.database??"default"})}quoteIdentifier(t){return`\`${t.replaceAll("`","``")}\``}tableAlias(t,r){return`${t} AS ${this.quoteIdentifier(r)}`}paginate(t,r,n){return`${t} LIMIT ${r}${n>0?` OFFSET ${n}`:""}`}parameter(t,r){return`{p${t}:${Ka(r)}}`}displayQuery(t,r){return Wa(t,r)}dateBucket(t,r){const o={hour:"toStartOfHour",day:"toStartOfDay",week:"toStartOfWeek",month:"toStartOfMonth",quarter:"toStartOfQuarter",year:"toStartOfYear"}[r];if(!o)throw new Error(`Unsupported ClickHouse date level: ${r}`);return`${o}(${t})`}dateShift(t,r,n){if(!new Set(["second","minute","hour","day","week","month","quarter","year"]).has(r)||!Number.isInteger(n))throw new Error(`Unsupported ClickHouse date shift: ${r}/${n}`);return`dateAdd('${r}', ${n}, ${t})`}aggregateFunction(t,r="*"){if(!/^[A-Za-z][A-Za-z0-9_]*$/.test(t))throw new Error(`Unsupported ClickHouse aggregate function: ${t}`);return`${t.toUpperCase()}(${r})`}stringify(t){return`toString(${t})`}concat(t){return`concat(${t.join(", ")})`}substring(t,r,n){return`substring(${t}, ${r}, ${n})`}regex(t,r,n){if(n&&n!=="i")throw new Error(`Unsupported ClickHouse regex options: ${n}`);const o=n==="i"?`concat('(?i)', ${r})`:r;return`match(${t}, ${o})`}arrayContains(t,r){return`has(${t}, ${r})`}expandArray(t,r,n){const o=this.quoteIdentifier(r);return{joinSql:`ARRAY JOIN ${t} AS ${o}`,valueExpression:o}}async execute(t){t.signal?.throwIfAborted();const r=Object.fromEntries(t.parameters.map((o,i)=>[`p${i}`,Ja(o)]));return(await this.client.query({query:t.sql,format:"JSONEachRow",query_params:r,...t.signal?{abort_signal:t.signal}:{}})).json()}async close(){await this.client.close()}}const K={quoteIdentifier(e){return`\`${e.replaceAll("`","``")}\``},tableAlias(e,t){return`${e} AS ${this.quoteIdentifier(t)}`},paginate(e,t,r){return`${e} LIMIT ${t}${r>0?` OFFSET ${r}`:""}`},parameter(e,t){return"?"},displayQuery(e,t){return no.format(e,[...t])},dateBucket(e,t){const r={hour:"%Y-%m-%d %H:00:00",day:"%Y-%m-%d",month:"%Y-%m-01",year:"%Y-01-01"};if(t==="week")return`DATE_SUB(DATE(${e}), INTERVAL WEEKDAY(${e}) DAY)`;if(t==="quarter")return`MAKEDATE(YEAR(${e}), 1) + INTERVAL (QUARTER(${e}) - 1) QUARTER`;const n=r[t];if(!n)throw new Error(`Unsupported MySQL-compatible date level: ${t}`);return`DATE_FORMAT(${e}, '${n}')`},dateShift(e,t,r){if(!new Set(["second","minute","hour","day","week","month","quarter","year"]).has(t)||!Number.isInteger(r))throw new Error(`Unsupported MySQL-compatible date shift: ${t}/${r}`);return`DATE_ADD(${e}, INTERVAL ${r} ${t.toUpperCase()})`},datePeriodBoundary(e,t,r){if(r==="start")return this.dateBucket(e,t);switch(t){case"hour":return`DATE_FORMAT(${e}, '%Y-%m-%d %H:59:59')`;case"day":return`TIMESTAMP(DATE(${e}), '23:59:59')`;case"month":return`TIMESTAMP(LAST_DAY(${e}), '23:59:59')`;case"year":return`CONCAT(YEAR(${e}), '-12-31 23:59:59')`;default:return this.dateShift(this.dateShift(this.dateBucket(e,t),t,1),"second",-1)}},aggregateFunction(e,t="*"){if(!/^[A-Za-z][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsupported MySQL-compatible aggregate function: ${e}`);return`${e.toUpperCase()}(${t})`},stringify(e){return`CAST(${e} AS CHAR)`},concat(e){return`CONCAT(${e.join(", ")})`},substring(e,t,r){return`SUBSTRING(${e}, ${t}, ${r})`},regex(e,t,r){if(r&&r!=="i")throw new Error(`Unsupported MySQL-compatible regex options: ${r}`);return r==="i"?`LOWER(${e}) REGEXP LOWER(${t})`:`${e} REGEXP ${t}`},arrayContains(e,t){return`JSON_OVERLAPS(${e}, JSON_ARRAY(${t}))`},expandArray(e,t,r){const n=this.quoteIdentifier(t),o=this.quoteIdentifier(r);return{joinSql:`CROSS JOIN JSON_TABLE(CASE WHEN JSON_TYPE(${e}) = 'ARRAY' THEN ${e} ELSE JSON_ARRAY() END, '$[*]' COLUMNS (${o} JSON PATH '$')) AS ${n}`,valueExpression:`${n}.${o}`}}},Xa={connectionLimit:30,maxIdle:10,idleTimeout:6e4,enableKeepAlive:!0,keepAliveInitialDelay:0};class or{supportsRecursiveCte=!0;pool;constructor(t={}){this.pool=t.pool??ro({...Xa,decimalNumbers:!0,...t.connection})}quoteIdentifier(t){return K.quoteIdentifier(t)}tableAlias(t,r){return K.tableAlias(t,r)}paginate(t,r,n){return K.paginate(t,r,n)}parameter(t,r){return K.parameter(t,r)}displayQuery(t,r){return K.displayQuery(t,r)}dateBucket(t,r){return K.dateBucket(t,r)}dateShift(t,r,n){return K.dateShift(t,r,n)}datePeriodBoundary(t,r,n){const o=K.datePeriodBoundary?.bind(K);if(!o)throw new Error("MySQL date period boundary renderer is unavailable");return o(t,r,n)}aggregateFunction(t,r){return K.aggregateFunction(t,r)}stringify(t){return K.stringify(t)}concat(t){return K.concat(t)}substring(t,r,n){return K.substring(t,r,n)}regex(t,r,n){return K.regex(t,r,n)}arrayContains(t,r){const n=K.arrayContains?.bind(K);if(!n)throw new Error("MySQL-compatible array conditions are unavailable");return n(t,r)}expandArray(t,r,n){const o=K.expandArray?.bind(K);if(!o)throw new Error("MySQL-compatible array expansion is unavailable");return o(t,r,n)}async execute(t){t.signal?.throwIfAborted();const[r]=await this.pool.execute(t.sql,t.parameters);if(!Array.isArray(r))throw new Error(`${this.kind} provider expected an array result`);return r}async close(){await this.pool.end()}}class ec extends or{kind="doris";constructor(t={}){super(t)}}class tc extends or{kind="mysql";constructor(t={}){super(t)}}const Bn=e=>{if(e==null)return null;if(typeof e=="bigint")return e.toString();if(typeof e=="string"||typeof e=="number"||typeof e=="boolean"||e instanceof Date||Buffer.isBuffer(e))return e;throw new TypeError(`Unsupported Oracle parameter type: ${typeof e}`)},rc=e=>e.reason instanceof Error?e.reason:new DOMException("The operation was aborted","AbortError");class nc{kind="oracle";supportsHavingAlias=!1;maxInListItems=1e3;#e;#r;#t;constructor(t={}){this.#e=t.connection??{},this.#r=t.driver??{createPool:r=>yr.createPool(r)},this.#t=t.pool?Promise.resolve(t.pool):void 0}quoteIdentifier(t){return`"${t.replaceAll('"','""')}"`}tableAlias(t,r){return`${t} ${this.quoteIdentifier(r)}`}paginate(t,r,n){return n>0?`${t} OFFSET ${n} ROWS FETCH NEXT ${r} ROWS ONLY`:`${t} FETCH FIRST ${r} ROWS ONLY`}parameter(t,r){return`:${t+1}`}displayQuery(t,r){return za(t,r.map(Bn))}dateBucket(t,r){const n={hour:"HH24",day:void 0,week:"IW",month:"MM",quarter:"Q",year:"YYYY"};if(!(r in n))throw new Error(`Unsupported Oracle date level: ${r}`);const o=n[r];return o?`TRUNC(${t}, '${o}')`:`TRUNC(${t})`}dateShift(t,r,n){if(!Number.isInteger(n))throw new Error(`Unsupported Oracle date shift: ${r}/${n}`);const i={month:1,quarter:3,year:12}[r];if(i)return`ADD_MONTHS(${t}, ${n*i})`;const a={second:{unit:"SECOND",multiplier:1},minute:{unit:"MINUTE",multiplier:1},hour:{unit:"HOUR",multiplier:1},day:{unit:"DAY",multiplier:1},week:{unit:"DAY",multiplier:7}}[r];if(!a)throw new Error(`Unsupported Oracle date shift: ${r}/${n}`);return`(${t} + NUMTODSINTERVAL(${n*a.multiplier}, '${a.unit}'))`}aggregateFunction(t,r="*"){if(!/^[A-Za-z][A-Za-z0-9_]*$/.test(t))throw new Error(`Unsupported Oracle aggregate function: ${t}`);return`${t.toUpperCase()}(${r})`}stringify(t){return`TO_CHAR(${t})`}concat(t){return`(${t.join(" || ")})`}substring(t,r,n){return`SUBSTR(${t}, ${r}, ${n})`}regex(t,r,n){if(n&&n!=="i")throw new Error(`Unsupported Oracle regex options: ${n}`);return`REGEXP_LIKE(${t}, ${r}${n?", 'i'":""})`}arrayContains(t,r){return`JSON_EXISTS(${t}, '$?(@ == $value)' PASSING ${r} AS "value")`}expandArray(t,r,n){const o=this.quoteIdentifier(r),i=this.quoteIdentifier(n);return{joinSql:`CROSS APPLY JSON_TABLE(${t}, '$[*]' COLUMNS (${i} VARCHAR2(4000) PATH '$')) ${o}`,valueExpression:`${o}.${i}`}}async#n(){this.#t??=this.#r.createPool(this.#e);try{return await this.#t}catch(t){throw this.#t=void 0,t}}async execute(t){t.signal?.throwIfAborted();const r=await this.#n();t.signal?.throwIfAborted();const n=await r.getConnection(),o=t.signal,i=()=>{n.break().catch(()=>{})};o?.addEventListener("abort",i,{once:!0});try{const s=await n.execute(t.sql,t.parameters.map(Bn),{outFormat:yr.OUT_FORMAT_OBJECT});if(o?.throwIfAborted(),!Array.isArray(s.rows))throw new Error("Oracle provider expected an array result");return s.rows}catch(s){throw o?.aborted?rc(o):s}finally{o?.removeEventListener("abort",i),await n.close()}}async close(){const t=this.#t;if(!t)return;await(await t).close(0),this.#t=void 0}}class oc{kind="postgresql";supportsHavingAlias=!1;supportsRecursiveCte=!0;pool;constructor(t={}){this.pool=t.pool??new oo(t.connection)}quoteIdentifier(t){return`"${t.replaceAll('"','""')}"`}tableAlias(t,r){return`${t} AS ${this.quoteIdentifier(r)}`}paginate(t,r,n){return`${t} LIMIT ${r}${n>0?` OFFSET ${n}`:""}`}parameter(t,r){return`$${t+1}`}displayQuery(t,r){return va(t,r)}dateBucket(t,r){if(!new Set(["hour","day","week","month","quarter","year"]).has(r))throw new Error(`Unsupported PostgreSQL date level: ${r}`);return`DATE_TRUNC('${r}', ${t})`}dateShift(t,r,n){if(!new Set(["second","minute","hour","day","week","month","quarter","year"]).has(r)||!Number.isInteger(n))throw new Error(`Unsupported PostgreSQL date shift: ${r}/${n}`);return`(${t} + (${n} * INTERVAL '1 ${r}'))`}aggregateFunction(t,r="*"){if(!/^[A-Za-z][A-Za-z0-9_]*$/.test(t))throw new Error(`Unsupported PostgreSQL aggregate function: ${t}`);return`${t.toUpperCase()}(${r})`}stringify(t){return`CAST(${t} AS TEXT)`}concat(t){return`CONCAT(${t.join(", ")})`}substring(t,r,n){return`SUBSTRING(${t} FROM ${r} FOR ${n})`}regex(t,r,n){if(n&&n!=="i")throw new Error(`Unsupported PostgreSQL regex options: ${n}`);return`${t} ${n==="i"?"~*":"~"} ${r}`}arrayContains(t,r){return`${r} = ANY(${t})`}expandArray(t,r,n){const o=this.quoteIdentifier(r),i=this.quoteIdentifier(n);return{joinSql:`CROSS JOIN LATERAL unnest(${t}) AS ${o}(${i})`,valueExpression:`${o}.${i}`}}async execute(t){t.signal?.throwIfAborted();const r=await this.pool.query(t.sql,[...t.parameters]);if(t.signal?.throwIfAborted(),!Array.isArray(r.rows))throw new Error("PostgreSQL provider expected an array result");return r.rows}async close(){await this.pool.end()}}const Yn=e=>{if(e==null)return null;if(e instanceof Date)return e.toISOString();if(typeof e=="bigint")return e.toString();if(typeof e=="string"||typeof e=="number"||typeof e=="boolean")return e;throw new TypeError(`Unsupported Snowflake parameter type: ${typeof e}`)},ic=e=>e.reason instanceof Error?e.reason:new DOMException("The operation was aborted","AbortError");class sc{kind="snowflake";#e;#r=!1;#t;constructor(t={}){this.#e=t.client??io.createConnection(t.connection??{})}quoteIdentifier(t){return`"${t.replaceAll('"','""')}"`}tableAlias(t,r){return`${t} AS ${this.quoteIdentifier(r)}`}paginate(t,r,n){return`${t} LIMIT ${r}${n>0?` OFFSET ${n}`:""}`}parameter(t,r){return"?"}displayQuery(t,r){return xa(t,r.map(Yn))}dateBucket(t,r){if(!new Set(["hour","day","week","month","quarter","year"]).has(r))throw new Error(`Unsupported Snowflake date level: ${r}`);return`DATE_TRUNC('${r.toUpperCase()}', ${t})`}dateShift(t,r,n){if(!new Set(["second","minute","hour","day","week","month","quarter","year"]).has(r)||!Number.isInteger(n))throw new Error(`Unsupported Snowflake date shift: ${r}/${n}`);return`DATEADD(${r.toUpperCase()}, ${n}, ${t})`}aggregateFunction(t,r="*"){if(!/^[A-Za-z][A-Za-z0-9_]*$/.test(t))throw new Error(`Unsupported Snowflake aggregate function: ${t}`);return`${t.toUpperCase()}(${r})`}stringify(t){return`TO_VARCHAR(${t})`}concat(t){return`CONCAT(${t.join(", ")})`}substring(t,r,n){return`SUBSTRING(${t}, ${r}, ${n})`}regex(t,r,n){if(n&&n!=="i")throw new Error(`Unsupported Snowflake regex options: ${n}`);return n?`REGEXP_INSTR(${t}, ${r}, 1, 1, 0, '${n}') > 0`:`REGEXP_INSTR(${t}, ${r}) > 0`}arrayContains(t,r){return`ARRAY_CONTAINS(${r}::VARIANT, ${t})`}expandArray(t,r,n){const o=this.quoteIdentifier(r);return{joinSql:`, LATERAL FLATTEN(INPUT => ${t}) ${o}`,valueExpression:`${o}.VALUE`}}async#n(){if(!this.#r){this.#t??=new Promise((t,r)=>{this.#e.connect(n=>{if(n){r(n);return}this.#r=!0,t()})});try{await this.#t}catch(t){throw this.#t=void 0,t}}}async execute(t){t.signal?.throwIfAborted(),await this.#n(),t.signal?.throwIfAborted();const r=t.parameters.map(Yn);return new Promise((n,o)=>{const i=t.signal,s={};let a=!1;const c=p=>{a||(a=!0,i?.removeEventListener("abort",u),p())},u=()=>{s.current?.cancel(),i&&c(()=>o(ic(i)))};i?.addEventListener("abort",u,{once:!0}),s.current=this.#e.execute({sqlText:t.sql,binds:r,complete:(p,l,f)=>{if(p){c(()=>o(p));return}if(!Array.isArray(f)){c(()=>o(new Error("Snowflake provider expected an array result")));return}c(()=>n(f))}}),i?.aborted&&u()})}async close(){this.#r&&await new Promise((t,r)=>{this.#e.destroy(n=>{if(n){r(n);return}this.#r=!1,this.#t=void 0,t()})})}}class ac extends or{kind="starrocks";constructor(t={}){super(t)}}const cc=e=>{switch(e.kind){case"mysql":{const{id:t,kind:r,...n}=e;return new tc({connection:n})}case"doris":{const{id:t,kind:r,...n}=e;return new ec({connection:n})}case"starrocks":{const{id:t,kind:r,...n}=e;return new ac({connection:n})}case"postgresql":{const{id:t,kind:r,...n}=e;return new oc({connection:n})}case"clickhouse":{const{id:t,kind:r,...n}=e;return new Za(n)}case"snowflake":{const{id:t,kind:r,...n}=e;return new sc({connection:n})}case"oracle":{const{id:t,kind:r,...n}=e;return new nc({connection:n})}}};class uc{create;#e=new Map;constructor(t=cc){this.create=t}get(t){const r=this.#e.get(t.id);if(r){if(!eo(r.connection,t))throw new d("DATABASE_CONNECTION_CONFIGURATION_MISMATCH",`Database connection configuration changed for id: ${t.id}`,{connectionId:t.id});return r.provider}const n=this.create(t);return this.#e.set(t.id,{connection:t,provider:n}),n}async close(){const t=[...this.#e.values()].map(({provider:o})=>o);this.#e.clear();const r=await Promise.allSettled(t.map(async o=>o.close())),n=[];for(const o of r)o.status==="rejected"&&n.push(o.reason);if(n.length>0)throw new AggregateError(n,"Failed to close one or more database connections")}}const Vn=new uc,dc=e=>Vn.get(e),pc=async()=>Vn.close(),fc=new Set(["$sply","$splm","$splq","$splw","$yoy","$mom","$qoq","$wow","$yoyd","$momd","$qoqd","$wowd","$percentage"]),Fn=e=>!z(e)||!Array.isArray(e.properties)?[]:e.properties.filter(z),ke=(e,t,r)=>{const n=(o,i,s)=>{const u=Fn(r[o]).map(y=>{const A=typeof y.id=="string"?y.id:void 0,R=typeof y.name=="string"?y.name:void 0,g=[A,R].filter(S=>!!S&&(i===S||i.startsWith(`${S}_`))).sort((S,m)=>m.length-S.length)[0];return g?{property:y,key:g}:void 0}).filter(y=>!!y).sort((y,A)=>A.key.length-y.key.length)[0];if(!u)return;const p=String(u.property.id??u.property.name),l=i===u.key?"":i.slice(u.key.length+1);if(!l)return p;const f=typeof u.property.ref=="string"?u.property.ref:void 0;if(!f||s.has(f))return;const h=n(f,l,new Set(s).add(f));return h?`${p}_${h}`:void 0};return n(e,t,new Set([e]))},ir=(e,t,r)=>{const n=Fn(r[e]).filter(o=>typeof o.id=="string").sort((o,i)=>String(i.id).length-String(o.id).length).find(o=>t===o.id||t.startsWith(`${String(o.id)}_`));if(!(!n||typeof n.id!="string")){if(t===n.id)return n.id;if(typeof n.ref=="string")return ir(n.ref,t.slice(n.id.length+1),r)}},Hn=e=>Object.keys(e).filter(t=>t!=="$and"&&t!=="$or"),z=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Gn=e=>{if(!z(e))return e;if(z(e.$offset)){const t=Object.entries(e.$offset),r=t[0];if(t.length===1&&r&&Number.isInteger(r[1]))return{granularity:r[0],offset:r[1]}}return e},lc=(e,t)=>{const n=e&&({$sply:"$periodShift",$splm:"$periodShift",$splq:"$periodShift",$splw:"$periodShift",$yoy:"$periodGrowth",$mom:"$periodGrowth",$qoq:"$periodGrowth",$wow:"$periodGrowth",$yoyd:"$periodDifference",$momd:"$periodDifference",$qoqd:"$periodDifference",$wowd:"$periodDifference",$dailyavg:"$averagePerPeriod",$weeklyavg:"$averagePerPeriod",$monthlyavg:"$averagePerPeriod",$startOfPeriod:"$periodValue",$endOfPeriod:"$periodValue",$dateLevel:"$dateBucket",$uniq:"$countDistinct",$percentage:"$shareOfTotal"}[e]??e),o={...t};return e==="$sply"||e==="$yoy"||e==="$yoyd"?o.time??={granularity:"year",offset:-1}:e==="$splm"||e==="$mom"||e==="$momd"?o.time??={granularity:"month",offset:-1}:e==="$splq"||e==="$qoq"||e==="$qoqd"?o.time??={granularity:"quarter",offset:-1}:e==="$splw"||e==="$wow"||e==="$wowd"?o.time??={granularity:"week",offset:-1}:e==="$dailyavg"?o.granularity??="day":e==="$weeklyavg"?o.granularity??="week":e==="$monthlyavg"?o.granularity??="month":e==="$startOfPeriod"?o.boundary??="start":e==="$endOfPeriod"&&(o.boundary??="end"),{...n?{operator:n}:{},args:o}},ge=e=>{if(Array.isArray(e))return e.map(ge);if(!z(e))return e;const t=Gn(e);if(t!==e)return t;const r=e,n={};for(const[i,s]of Object.entries(r))i==="skip"||i==="_snapshot"||i==="_snapshots"||(n[i]=ge(s));if(typeof r.version=="string"&&/^1\./.test(r.version)&&(n.version="2.0"),Array.isArray(r.groupby)){const i=r.groupby;n.groupby=i.map(s=>{if(!z(s))return s;const{_id:a,level:c,...u}=s,p={...u,...u.pred===void 0&&typeof a=="string"?{pred:a}:{}};return typeof c=="string"&&(p.operator="$dateBucket",p.args={...z(p.args)?p.args:{},granularity:c}),p})}const o=r.skip;if(typeof o=="number"&&Number.isInteger(o)&&o>=0){const i=r.limit;o===0?delete n.skip:typeof i=="number"&&Number.isInteger(i)&&i>0&&o%i===0?n.page=o/i+1:n.skip=o}else o!==void 0&&(n.skip=ge(o));if(r.operator&&typeof r.operator=="string"){const i=lc(r.operator,z(n.args)?n.args:{});i.operator&&(n.operator=i.operator),n.args=i.args,fc.has(r.operator)&&typeof n.pred=="string"&&(n.pred={operator:"$sum",pred:n.pred})}return r.params!==void 0&&n.args===void 0&&(n.args=Array.isArray(r.params)?{values:ge(r.params)}:ge(r.params)),r.inputs!==void 0&&n.pred===void 0&&Array.isArray(r.inputs)&&(n.pred=r.inputs.map(ge),z(n.args)&&delete n.args.inputs),r.pred===void 0&&typeof r.operator=="string"&&r.operator==="$sql"&&typeof r.sql=="string"&&(n.args={...z(n.args)?n.args:{},sql:r.sql},delete n.sql),r.$options!==void 0&&n.$regex!==void 0&&(n.args={...z(n.args)?n.args:{},options:r.$options},delete n.$options),r.query&&z(r.query)&&(n.query=mc(r.query)),n},mc=e=>{const t=ge(e);for(const[r,n]of Object.entries(t))t[r]=Gn(n);return t},Wn=(e,t)=>{const r=z(e)?e:void 0,n=ge(e);if(!z(n))return n;if(r&&typeof r.operator=="string"&&r.preds===void 0){const o={};for(const a of["version","schema","query","groupby","having","sort","limit","page","skip","output","representation","currency"])n[a]!==void 0&&(o[a]=n[a]);const i=new Set(["version","schema","query","groupby","having","sort","limit","page","skip","output","representation","currency"]),s=Object.fromEntries(Object.entries(n).filter(([a])=>!i.has(a)));return o.preds=[s],Wn(o)}return(n.version===void 0||typeof n.version=="string"&&/^1\./.test(n.version))&&(n.version="2.0"),t?yc(n,t):n},yc=(e,t)=>{const r=e;if(!Array.isArray(r.preds))return e;const n=r.preds,o=typeof r.schema=="string"?r.schema:void 0;if(!o)return e;const i=new Set([o]);for(const c of n)z(c)&&typeof c.schema=="string"&&i.add(c.schema);if(i.size<2)return e;if(!t)throw new Error("Cannot migrate cross-Schema LogicForm without Schema metadata for field alignment");const s=Array.isArray(r.groupby)?r.groupby.map(c=>z(c)&&typeof c.pred=="string"?ke(o,c.pred,t):void 0):[];for(const c of i)if(Array.isArray(r.groupby)&&r.groupby.map((u,p)=>{if(!z(u)||typeof u.pred!="string")return u;const l=c===o?ke(c,u.pred,t):ke(c,ir(o,s[p]??"",t)??u.pred,t);if(!l)return u;const f=l.split("_").at(-1)??u.pred;return{...u,pred:l,name:f}}),z(r.query))for(const u of Hn(r.query)){const p=ke(o,u,t);if(!(c===o?p:ke(c,(p&&ir(o,p,t))??u,t))&&c===o)throw new Error(`Cannot align legacy query field ${u} in Schema ${c}`)}const a={...r};if(Array.isArray(r.groupby)&&(a.groupby=r.groupby.map((c,u)=>{if(!z(c)||typeof c.pred!="string")return c;const p=s[u];return p?{...c,pred:p}:c})),z(r.query)){const c=r.query,u=Hn(c).map(p=>[ke(o,p,t)??p,c[p]]);a.query=Object.fromEntries(u)}return a},hc=e=>{const t=(r,n)=>{if(Array.isArray(r)){r.forEach((o,i)=>t(o,`${n}[${i}]`));return}if(z(r))for(const[o,i]of Object.entries(r)){if(["is_snapshot","is_observation","_snapshot","_snapshots","$options","params","inputs"].includes(o))throw new d("LEGACY_LOGICFORM_NOT_ALLOWED",`Legacy LogicForm field is not supported in v2: ${n}.${o}`);if(o==="_id"&&(n.endsWith(".groupby")||n.includes(".groupby[")))throw new d("LEGACY_LOGICFORM_NOT_ALLOWED",`Legacy LogicForm field is not supported in v2: ${n}.${o}`);t(i,`${n}.${o}`)}};t(e,"$")},sr=e=>{if(Array.isArray(e))return e.map(sr).filter(n=>n!==void 0);if(typeof e!="object"||e===null||Object.prototype.toString.call(e)!=="[object Object]")return e;const t=Object.entries(e),r=t.filter(([,n])=>n!==null).map(([n,o])=>[n,sr(o)]).filter(([,n])=>n!==void 0);if(!(t.length>0&&r.length===0))return Object.fromEntries(r)},gc=e=>{if(e.comparable!=null)return e.comparable;if(e.is_comparable!==!0||e.isArray===!0||e.type!=="string"&&e.type!=="category"||!Array.isArray(e.constraints?.enum))return;const r=e.constraints.enum.map(n=>Array.isArray(n)?n[0]:n);if(!(r.length===0||r.some(n=>typeof n!="string")))return{values:[...new Set(r)],direction:e.comparable_order===-1?-1:1}},$c=e=>{if(typeof e!="object"||e===null||Array.isArray(e))return e;const t=e;if(t.sql!=null)return Object.keys(t).every(r=>r==="sql")?e:{sql:t.sql}},wc=(e,t=[],r=!0)=>{const n=Ke(t),o={},i=new Set(n.flatMap(s=>[...s.schemaMetadata?.keys??[],...s.legacySchemaKeys??[]]));for(const[s,a]of Object.entries(e)){const c=sr(a),u=c,l=(Array.isArray(u.properties)?u.properties:[]).some(S=>S.is_observation===!0)||u.is_observation===!0,f=u.is_snapshot===!0,h=typeof c.id=="string"&&c.id.length>0?c.id:r&&typeof c._id=="string"&&c._id.length>0?c._id:c.id,{properties:y}=c,A=Object.fromEntries(Object.entries(c).filter(([S])=>(r?!["_id","_sid","sid","is_observation","is_snapshot"].includes(S):S!=="properties")&&S!=="properties"&&!i.has(S))),R=y.map(S=>{const m=S,I=typeof m.id=="string"&&m.id.length>0?m.id:r&&typeof m._id=="string"&&m._id.length>0?m._id:m.id,{udf:q,...V}=m,k=gc(m),P=$c(q),U=k!==void 0&&m.comparable==null?"category":m.type==="object"?"entity":m.type;return{...r?Object.fromEntries(Object.entries(V).filter(([M])=>!["_id","_sid","sid","is_observation","is_comparable","comparable_order"].includes(M))):V,type:U,...m.primal_type==="object"?{primal_type:"entity"}:{},...I!==void 0?{id:I}:{},...P!==void 0?{udf:P}:{},...k!==void 0?{comparable:k}:{}}});let b={};for(const S of n)for(const m of S.schemaMetadata?.keys??[])c[m]!==void 0&&(b={...b,[m]:c[m]});for(const S of n)b={...b,...S.normalizeLegacySchema?.({source:c,properties:R})};const g={...A,...h!==void 0?{id:h}:{},properties:R,...r&&(f||l)?{temporalSemantics:"snapshot"}:{},...b};o[s]=g}return o};W.extend(We),W.extend(ze);const ar=e=>({kind:"query",logicform:e.logicform,...e.prepare!==void 0?{prepare:e.prepare}:{},...e.mapResult?{mapResult:e.mapResult}:{},...e.groupKeyShifts?{groupKeyShifts:e.groupKeyShifts}:{}}),zn=e=>e instanceof Error?e:new Error(String(e)),Ac=(e,t="zh-CN")=>e instanceof d?e.localizedMessage(t):e.message,_c=(e,t,r={},n="zh-CN")=>{const o=zn(e);return{errorCode:"100",error:Ac(o,n),result:[],...r.schema?{schema:r.schema}:{},normedLogicform:r.normedLogicform??t,sqls:r.sqls??[],...r.provider?{provider:r.provider}:{},...r.lineage?{lineage:r.lineage}:{}}},Ec=(e,t,r)=>{if(e.length<2||e.some(i=>i.kind==="js"||i.kind==="query"&&i.unit.mapResult))return!1;const n=new Set,o=[...e.flatMap(({sources:i})=>i),...te(r)];for(const i of o){const s=t.findSource(i.schemaId,i.source);if(!s)return!1;n.add(s.connectionId)}return n.size<=1},Ic=async(e,t,r)=>{await e?.({...t,partialResult:r})},Rc=(e,t,r,n,o,i=r)=>({type:r,explain:i==="time-watermark"?o.toLowerCase().startsWith("en")?"Resolve time watermark to keep year-over-year and period-over-period comparison ranges consistent":"\u8BA1\u7B97\u6570\u636E\u6700\u540E\u65F6\u95F4\uFF0C\u4ECE\u800C\u4FDD\u8BC1\u540C\u6BD4\u3001\u73AF\u6BD4\u7684\u6BD4\u8F83\u533A\u95F4\u4E00\u81F4":i==="entity-expansion"?o.toLowerCase().startsWith("en")?"Expand entities to obtain more information":"\u5B9E\u4F53\u5C55\u5F00\uFF0C\u7528\u4E8E\u83B7\u5F97\u66F4\u591A\u4FE1\u606F":i==="computation"?o.toLowerCase().startsWith("en")?"Numeric computation":"\u6570\u503C\u8BA1\u7B97":o.toLowerCase().startsWith("en")?"Semantic resolution":"\u8BED\u4E49\u89E3\u6790",logicform:n,sql:e.sql,parameters:[...e.parameters],displaySql:t.displayQuery(e.sql,e.parameters)}),vn=(e,t)=>{if(t.connectionId)for(const r of te(e)){const n=t.schemaMappings.findSource(r.schemaId,r.source);if(!n)throw new d("SCHEMA_MAPPING_NOT_FOUND",`Schema mapping is not registered: ${r.schemaId}:${r.source}`,{schemaId:r.schemaId,source:r.source});if(n.connectionId!==t.connectionId)throw new d("CROSS_CONNECTION_QUERY_UNSUPPORTED",`One physical query cannot use multiple database connections: ${t.connectionId}, ${n.connectionId}`,{schemaId:r.schemaId,source:r.source,connectionId:n.connectionId})}},Sc=e=>{const t=new Set,r=n=>{n.schema&&t.add(n.schema),n.from&&r(n.from)};return r(e),[...t]},Oc="YYYY-MM-DD HH:mm:ss",xn=(e,t)=>W(e).endOf(t==="week"?"isoWeek":t).toDate(),cr=e=>W(e).format(Oc),bc=(e,t)=>{const r=e??{type:"database_latest"};if(r.type==="database_latest"||Number.isInteger(r.offset))return r;throw new d("INVALID_TIME_WATERMARK",`${t} timeWatermark must be database_latest or now_offset with an integer offset`,{owner:t,timeWatermark:e})},ur=e=>{const t=e.schema?[e.schema]:[];return e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred)?[...t,...ur(e.pred)]:Array.isArray(e.pred)?[...t,...e.pred.flatMap(r=>typeof r=="string"?[]:ur(r))]:t},Pc=async(e,t)=>{const r=t.plugins??[],n=e.version,o=typeof n=="string"&&(/^2\./.test(n)||/^[3-9]\d*\./.test(n)),i=n===void 0||typeof n=="string"&&/^1\./.test(n);o&&hc(e);const s=i?Wn(e,t.schemas):e,a={...t,schemas:wc(t.schemas,r,i)},c=mr.now(),u=a.semanticTypes??Rn(),p=a.operators?new qt(a.operators.definitions()):we(r);if(a.operators)for(const P of r)for(const U of P.operators??[])if(p.has(U.name)){if(p.get(U.name)!==U)throw new d("PLUGIN_OPERATOR_ALREADY_REGISTERED",`Plugin Operator is already registered: ${U.name}`,{operator:U.name,plugin:P.name})}else p.register(U);const l=a.schemaMappings,f=new Date,h=new Map;let y={provider:a.provider.kind};const A=[],R=(P,U,F,M=U)=>{A.push(Rc(jn(P),a.provider,U,F,a.locale??"zh-CN",M)),y={...y,sqls:[...A]}},b=async(P,U={})=>{y={...y,...U},await Ic(a.onProgress,P,y)},g=P=>_n(mo(P,a.schemas),u,r),S=new Map,m=P=>{const U=S.get(P);return U||(he(a.permissions,P),g(P))},I=P=>{if(P.schema)return m(P.schema);if(P.from)return I(P.from);throw new d("LOGICFORM_SCHEMA_REQUIRED","A LogicForm must contain a physical schema leaf")},q={resolveSchema:m,canUsePropertyRowIdentity:(P,U)=>_e(a.permissions,P.id,U)},V=(P,U)=>{const F=Br(se(P,I(P),p,l,q),U);return S.set(F.id,F),F},k=async(P,U,F)=>{const M=`${P.id}:${U.id}:${F.toISOString()}`,de=h.get(M);if(de)return de;const X=(async()=>{const ne=[...new Set((s.preds??[]).flatMap(ur).filter(E=>E!==P.id))],pe=[{schema:P,property:U}];for(const E of ne){const N=m(E),j=s.propertyResolve?.[E],L=j?.[U.id]??j?.[U.name];if(!L)throw new d("TIME_WATERMARK_PROPERTY_RESOLVE_REQUIRED",`Cross-Schema timeWatermark requires propertyResolve for ${E}.${U.name}`,{schemaId:E,property:U.name});const Y=N.properties.find(({id:C,name:x})=>C===L||x===L);if(!Y||Y.primal_type!=="date")throw new d("TIME_WATERMARK_PROPERTY_REQUIRED",`timeWatermark Property is not a date Property: ${E}.${L}`,{schemaId:E,property:L});pe.push({schema:N,property:Y})}const J=pe.map(({schema:E,property:N})=>{const j=bc(N.timeWatermark??E.timeWatermark??a.timeWatermark,`${E.id}.${N.id}`);if(j.type==="now_offset"){const L=xn(W(f).add(j.offset,"day").toDate(),N.granularity??"day");return{operator:"$constant",args:{value:cr(L),type:"timestamp"},name:`${E.name}\u6570\u636E\u65F6\u95F4`}}return{operator:"$periodBoundary",args:{boundary:"end"},pred:{operator:"$max",pred:N.name,schema:E.id},name:`${E.name}\u6700\u65B0\u65F6\u95F4`}});J.some(({operator:E})=>E==="$periodBoundary")&&J.push({operator:"$constant",args:{value:cr(xn(f,U.granularity??"day")),type:"timestamp"},name:"\u73B0\u5728"}),J.push({operator:"$constant",args:{value:cr(F),type:"timestamp"},name:"\u63D0\u95EE\u65F6\u95F4\u4E0A\u754C"});const $={version:s.version,schema:P.id,preds:[{name:"__timeWatermark__",operator:"$least",pred:J}]},w=Ee($,a.permissions,m,!1,new Set,r),_=await qe(w,P,{semanticTypes:u,operators:p,plugins:r,now:f,...a.locale?{locale:a.locale}:{},resolveSchema:m,resolveFromSchema:V}),O=se(_,P,p,l,q);vn(O,a);const D=re(O,a.provider,p);R(D,"semantic-resolution",_,"time-watermark");const T=await je(D,te(O),a),H=T[0]?.__timeWatermark__??Object.values(T[0]??{})[0];if(H==null||!(H instanceof Date)&&typeof H!="string"&&typeof H!="number")return;const Z=H instanceof Date?H:new Date(H);return Number.isNaN(Z.getTime())?void 0:Z})();return h.set(M,X),X};try{a.signal?.throwIfAborted(),Kt(s),await b({stage:"started",logicform:s}),Pa(a.permissions,g);const P=I(s);await b({stage:"validated",schema:P});const U=Ee(s,a.permissions,m,!0,new Set,r),F=await qe(U,P,{semanticTypes:u,operators:p,plugins:r,now:f,...a.locale?{locale:a.locale}:{},resolveSchema:m,resolveFromSchema:V,canProjectProperty:(E,N)=>_e(a.permissions,E.id,N),requestTimeWatermark:k});await b({stage:"normalized",normedLogicform:F},{normedLogicform:F});const M=se(F,P,p,l,q);vn(M,a);const de=M.columnProperties??[],X=Qr(M,P);S.set(X.id,X),await b({stage:"planned",plan:M},{schema:X});const ne=Dr(M,P,a.provider,p);await b({stage:"lineage",lineage:ne},{lineage:ne});const pe=Wt(F,M,P,p,m),J=async E=>{const N=I(E.logicform),j=E.prepare?await qe(Ee(E.logicform,a.permissions,m,!0,new Set,r),N,{semanticTypes:u,operators:p,plugins:r,now:f,...a.locale?{locale:a.locale}:{},resolveSchema:m,resolveFromSchema:V,canProjectProperty:(C,x)=>_e(a.permissions,C.id,x),requestTimeWatermark:k}):E.logicform,L=se(j,N,p,l,q),Y=Wt(j,L,N,p,m,E.logicform);if(Y){if(Y.length!==1)throw new Error("A generated component must produce exactly one execution unit");const C=Y[0];if("logicform"in C){const Q=await J(C),oe=Q.component.mapResult,fe=E.mapResult;return{...Q,component:{...E,logicform:Q.component.logicform,...oe||fe?{mapResult:fr=>{const lr=oe?.(fr)??[...fr];return fe?.(lr)??[...lr]}}:{}}}}if("mergeRow"in C)throw new d("UNSUPPORTED_NESTED_JS_COMPONENT","A JavaScript composite metric cannot currently be nested as a generated component");const x=await Promise.all(C.components.map(async Q=>({name:Q.name,prepared:await J(ar(Q)),...Q.groupKeyShifts?{groupKeyShifts:Q.groupKeyShifts}:{},...Q.joinKeys?{joinKeys:Q.joinKeys}:{}}))),v=Ft(C,x.map(({name:Q,prepared:oe,...fe})=>({name:Q,plan:oe.plan,...fe})),L,a.provider,p);return{component:{...E,logicform:j},plan:L,compiled:v,sources:ht(x.map(({prepared:Q})=>Q.sources))}}return{component:{...E,logicform:j},plan:L,compiled:re(L,a.provider,p),sources:te(L)}},$=async(E,N)=>{const j=Wt(E,N,I(E),p,m);if(!j)return{compiled:re(N,a.provider,p),sources:te(N)};const L=await Promise.all(j.map(async Y=>{if("logicform"in Y){const v=await J(Y);return{plan:v.plan,compiled:v.compiled,outputs:v.plan.projections.map(({name:Q})=>Q).filter(Q=>!N.groupBy.some(oe=>oe.name===Q))}}if("mergeRow"in Y)throw new d("UNSUPPORTED_NESTED_JS_COMPONENT","JavaScript composite metrics cannot be used as a derived source");const C=await Promise.all(Y.components.map(async v=>{const Q=await J(ar(v));return{name:v.name,plan:Q.plan,...v.joinKeys?{joinKeys:v.joinKeys}:{},...v.groupKeyShifts?{groupKeyShifts:v.groupKeyShifts}:{}}})),x=Ft(Y,C,N,a.provider,p);return{plan:N,compiled:x,outputs:[Y.outputName??N.projections[N.groupBy.length]?.name??""]}}));return{compiled:xr(L,N,a.provider,p),sources:ht(L.map(({plan:Y})=>te(Y)))}},w=pe?await Promise.all(pe.map(async E=>{if("logicform"in E)return{kind:"query",unit:E,...await J(E)};const N=await Promise.all(E.components.map(async L=>({name:L.name,prepared:await J(ar(L)),...L.groupKeyShifts?{groupKeyShifts:L.groupKeyShifts}:{},...L.joinKeys?{joinKeys:L.joinKeys}:{}})));if("mergeRow"in E)return{kind:"js",unit:E,components:N.map(({prepared:L})=>L)};const j=N.map(({name:L,prepared:Y,...C})=>({name:L,plan:Y.plan,...C}));return{kind:"component",unit:E,plan:M,compiled:Ft(E,j,M,a.provider,p),sources:ht(N.map(({prepared:L})=>L.sources))}})):void 0,_=w&&Ec(w,l,M)?xr(w.map(E=>{const N=new Set(M.groupBy.map(({name:L})=>L));if(E.kind==="query")return{plan:E.plan,compiled:E.compiled,outputs:E.plan.projections.map(({name:L})=>L).filter(L=>!N.has(L))};const j=E.unit.outputName;if(!j)throw new d("INVALID_COMPONENT_PLAN","Component output projection is missing");return{plan:E.plan,compiled:E.compiled,outputs:[j]}}),M,a.provider,p):void 0,O=w?void 0:await(async()=>{if(!M.sourcePlan||!M.sourceLogicform)return re(M,a.provider,p);const E=await $(M.sourceLogicform,M.sourcePlan),N={...M};delete N.sourcePlan,delete N.sourceLogicform;const j={...N,sourceSql:E.compiled.sql,source:M.source},L=re(j,a.provider,p,E.compiled.parameters.length);return{sql:L.sql,parameters:[...E.compiled.parameters,...L.parameters]}})();if(_)R(_,"computation",F);else if(w)for(const E of w)if(E.kind==="js")for(const N of E.components)R(N.compiled,"computation",N.component.logicform);else R(E.compiled,"computation",F);else R(O,"computation",F);await b({stage:"compiled",sqls:[...A]},{sqls:[...A]}),await b({stage:"executing",provider:a.provider.kind});const D=_?await(async()=>{const E=await je(_,ht([...w.map(j=>j.sources),te(M)]),a);return await st(E,M.projections,p)})():w?qs(await Promise.all(w.map(async E=>{if(E.kind==="js"){const L=await Promise.all(E.components.map(async C=>{const x=await je(C.compiled,C.sources,a),v=await st(x,C.plan.projections,p);return C.component.mapResult?.(v)??v})),Y=E.unit.components.map(({name:C})=>C);return Promise.all(pn(L,M.groupBy.map(({name:C})=>C)).map(async C=>{const x=await E.unit.mergeRow(C);return{...E.unit.exposeComponents?C:Object.fromEntries(Object.entries(C).filter(([Q])=>!Y.includes(Q))),[E.unit.outputName]:x}}))}const N=await je(E.compiled,E.sources,a),j=E.kind==="query"?await st(N,E.plan.projections,p):N;return E.kind==="query"?E.unit.mapResult?.(j)??j:j})),M):await(async()=>{const E=await je(O,te(M),a);return st(E,M.projections,p)})();await b({stage:"hydrating"});const T=await Ga(D,de,{semanticTypes:u,resolveSchema:m,fetchEntities:E=>Ca(E,{version:F.version,operators:p,schemaMappings:l,semanticTypes:u,plugins:r,...a.locale?{locale:a.locale}:{},resolveSchema:m,...a.permissions?{permissions:a.permissions}:{},provider:a.provider,...a.cache?{cache:a.cache}:{},...a.signal?{signal:a.signal}:{},onCompiled:(N,j)=>R(N,"semantic-resolution",j,"entity-expansion")})}),H=an(T,M.rowIdentity);return await b({stage:"result",result:H},{result:H,sqls:[...A]}),await b({stage:"completed",durationMs:mr.now()-c}),{result:H,schema:X,normedLogicform:F,sqls:[...A],lineage:ne,provider:a.provider.kind}}catch(P){const U=zn(P);try{await b({stage:"failed",error:U})}catch{}throw U}},Nc=async(e,t)=>{let r={};const n=t.locale??"zh-CN";try{if(t.connections.length===0)throw new d("DATABASE_CONNECTION_REQUIRED","At least one database connection is required");const o=new Map;for(const p of t.connections){if(p.id.trim().length===0)throw new d("INVALID_DATABASE_CONNECTION","Database connection id must not be empty");if(o.has(p.id))throw new d("DATABASE_CONNECTION_ALREADY_REGISTERED",`Database connection id is duplicated: ${p.id}`,{connectionId:p.id});o.set(p.id,p)}const i=new Ct(t.schemaMappings),s=new Set;for(const p of Sc(e))for(const l of i.list(p))s.add(l.connectionId);if(s.size>1)throw new d("CROSS_CONNECTION_QUERY_UNSUPPORTED",`One LogicForm cannot compile into SQL for multiple database connections: ${[...s].join(", ")}`,{connectionIds:[...s]});const[a]=s;if(!a)throw new d("LOGICFORM_SCHEMA_REQUIRED","A LogicForm must contain at least one physical Schema leaf");const c=o.get(a);if(!c)throw new d("DATABASE_CONNECTION_NOT_FOUND",`Database connection is not registered: ${a}`,{connectionId:a});const u=dc(c);return r={provider:u.kind},await Pc(e,{...t,schemaMappings:i,locale:n,provider:u,connectionId:c.id,onProgress:async p=>{r=p.partialResult,await t.onProgress?.(p)}})}catch(o){return _c(o,e,r,n)}},Kn="semanticdb_calendar_dates",dr="semanticdb_calendar_relations",Ie={dates:"__sdb_calendar_dates",relations:"__sdb_calendar_relations"},pr=e=>`${typeof e}:${String(e)}`,Tc=(e,t)=>{const r=typeof e=="number"?e:Number(e),n=typeof t=="number"?t:Number(t);return Number.isFinite(r)&&Number.isFinite(n)?r-n:String(e).localeCompare(String(t))},Jn=(e,t,r)=>{const n=r.filter(c=>c.calendar===t.calendar&&c.grain===t.grain&&c.relation===t.relation&&(t.key===void 0||c.key===t.key)),o=new Map(n.map(c=>[pr(c.sourceDateId),c])),i=e.flatMap(c=>{const u=o.get(pr(c))?.targetDateId;return u==null?[]:[u]}),s=[...new Map(i.map(c=>[pr(c),c])).values()].sort(Tc),a=[];for(const c of s){const u=a[a.length-1];if(u&&typeof u.end=="number"&&typeof c=="number"&&c===u.end+1)u.end=c;else if(u&&String(u.end).match(/^\d{8}$/)&&String(c).match(/^\d{8}$/)){const p=Number(u.end),l=Number(c),f=new Date(Date.UTC(Math.floor(p/1e4),Math.floor(p/100)%100-1,p%100));f.setUTCDate(f.getUTCDate()+1);const h=new Date(Date.UTC(Math.floor(l/1e4),Math.floor(l/100)%100-1,l%100));if(f.getTime()===h.getTime()){u.end=c;continue}a.push({start:c,end:c})}else a.push({start:c,end:c})}return{dateIds:s,ranges:a}},Lc=async(e,t,r)=>Jn(e,t,await r.loadRelations(e,t)),Dc=(e,t)=>e.filter(r=>Object.entries(t).every(([n,o])=>r[n]===o)).map(r=>r.dateId),qc=["source_date_id","target_date_id","calendar","grain","relation","relation_key"];class Cc{provider;constructor(t){this.provider=t}async loadRelations(t,r){if(t.length===0)return[];const n=[...t,r.calendar,r.grain,r.relation];r.key!==void 0&&n.push(r.key);const o=t.map((u,p)=>this.provider.parameter(p,u)),i=u=>this.provider.parameter(u,n[u]),s=u=>this.provider.quoteIdentifier(u),a=[`${s("source_date_id")} IN (${o.join(", ")})`,`${s("calendar")} = ${i(t.length)}`,`${s("grain")} = ${i(t.length+1)}`,`${s("relation")} = ${i(t.length+2)}`];return r.key!==void 0&&a.push(`${s("relation_key")} = ${i(t.length+3)}`),(await this.provider.execute({sql:`SELECT ${qc.map(s).join(", ")} FROM ${s(dr)} WHERE ${a.join(" AND ")}`,parameters:n})).map(u=>({sourceDateId:u.source_date_id,targetDateId:u.target_date_id,calendar:String(u.calendar),grain:String(u.grain),relation:String(u.relation),...typeof u.relation_key=="string"||typeof u.relation_key=="number"?{key:String(u.relation_key)}:{}}))}}const Uc={[Ie.dates]:{id:Ie.dates,name:Ie.dates,type:"entity",source:Kn,properties:[{id:"date_id",name:"date_id",type:"id",primal_type:"string"},{id:"calendar",name:"calendar",type:"string",primal_type:"string"},{id:"grain",name:"grain",type:"string",primal_type:"string"},{id:"period_key",name:"period_key",type:"string",primal_type:"string"},{id:"relative_day",name:"relative_day",type:"int",primal_type:"number"}]},[Ie.relations]:{id:Ie.relations,name:Ie.relations,type:"entity",source:dr,properties:[{id:"source_date_id",name:"source_date_id",type:"string",primal_type:"string"},{id:"target_date_id",name:"target_date_id",type:"string",primal_type:"string"},{id:"calendar",name:"calendar",type:"string",primal_type:"string"},{id:"grain",name:"grain",type:"string",primal_type:"string"},{id:"relation",name:"relation",type:"string",primal_type:"string"},{id:"relation_key",name:"relation_key",type:"string",primal_type:"string"}]}},jc=Object.freeze({execute:Nc,close:pc});export{Kn as CALENDAR_DATES_TABLE,dr as CALENDAR_RELATIONS_TABLE,Ie as CALENDAR_SYSTEM_SCHEMA_IDS,jc as Logicform,qt as OperatorRegistry,Ur as PlannerSemanticRegistry,Cc as ProviderCalendarRelationStore,Ct as SchemaMappingRegistry,d as SemanticDBError,$n as SemanticTypeRegistry,ki as builtinOperators,gn as builtinSemanticTypes,Uc as calendarSystemSchemas,we as createOperatorRegistry,jr as createPlannerSemanticRegistry,Rn as createSemanticTypeRegistry,Vi as fromYiAskSchemaMapping,Jn as resolveCalendarPeriod,Lc as resolveCalendarPeriodFromStore,_n as resolveSchema,Dc as selectCalendarDates,wn as validateResolvedSchema};
1
+ import{performance as Wr}from"node:perf_hooks";import J from"dayjs";import dt from"dayjs/plugin/isoWeek.js";import pt from"dayjs/plugin/quarterOfYear.js";import{randomUUID as oi}from"node:crypto";import ii from"dayjs/plugin/customParseFormat.js";import{getNameProperty as si}from"semanticdb-core";import{isDeepStrictEqual as ai}from"node:util";import{createClient as ci}from"@clickhouse/client";import{createPool as ui}from"mysql2/promise";import di from"mysql2";import zr from"oracledb";import{Pool as pi}from"pg";import li from"snowflake-sdk";const x=e=>typeof e=="string",Ke=()=>{let e,t;const r=new Promise((n,o)=>{e=n,t=o});return r.resolve=e,r.reject=t,r},Kr=e=>e==null?"":""+e,fi=(e,t,r)=>{e.forEach(n=>{t[n]&&(r[n]=t[n])})},mi=/###/g,Jr=e=>e&&e.indexOf("###")>-1?e.replace(mi,"."):e,Zr=e=>!e||x(e),Je=(e,t,r)=>{const n=x(t)?t.split("."):t;let o=0;for(;o<n.length-1;){if(Zr(e))return{};const i=Jr(n[o]);!e[i]&&r&&(e[i]=new r),Object.prototype.hasOwnProperty.call(e,i)?e=e[i]:e={},++o}return Zr(e)?{}:{obj:e,k:Jr(n[o])}},Xr=(e,t,r)=>{const{obj:n,k:o}=Je(e,t,Object);if(n!==void 0||t.length===1){n[o]=r;return}let i=t[t.length-1],s=t.slice(0,t.length-1),a=Je(e,s,Object);for(;a.obj===void 0&&s.length;)i=`${s[s.length-1]}.${i}`,s=s.slice(0,s.length-1),a=Je(e,s,Object),a?.obj&&typeof a.obj[`${a.k}.${i}`]<"u"&&(a.obj=void 0);a.obj[`${a.k}.${i}`]=r},yi=(e,t,r,n)=>{const{obj:o,k:i}=Je(e,t,Object);o[i]=o[i]||[],o[i].push(r)},lt=(e,t)=>{const{obj:r,k:n}=Je(e,t);if(r&&Object.prototype.hasOwnProperty.call(r,n))return r[n]},hi=(e,t,r)=>{const n=lt(e,r);return n!==void 0?n:lt(t,r)},en=(e,t,r)=>{for(const n in t)n!=="__proto__"&&n!=="constructor"&&(n in e?x(e[n])||e[n]instanceof String||x(t[n])||t[n]instanceof String?r&&(e[n]=t[n]):en(e[n],t[n],r):e[n]=t[n]);return e},Pe=e=>e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var gi={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;"};const $i=e=>x(e)?e.replace(/[&<>"'\/]/g,t=>gi[t]):e;class wi{constructor(t){this.capacity=t,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(t){const r=this.regExpMap.get(t);if(r!==void 0)return r;const n=new RegExp(t);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(t,n),this.regExpQueue.push(t),n}}const Ai=[" ",",","?","!",";"],Ei=new wi(20),_i=(e,t,r)=>{t=t||"",r=r||"";const n=Ai.filter(s=>t.indexOf(s)<0&&r.indexOf(s)<0);if(n.length===0)return!0;const o=Ei.getRegExp(`(${n.map(s=>s==="?"?"\\?":s).join("|")})`);let i=!o.test(e);if(!i){const s=e.indexOf(r);s>0&&!o.test(e.substring(0,s))&&(i=!0)}return i},Ht=(e,t,r=".")=>{if(!e)return;if(e[t])return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0;const n=t.split(r);let o=e;for(let i=0;i<n.length;){if(!o||typeof o!="object")return;let s,a="";for(let c=i;c<n.length;++c)if(c!==i&&(a+=r),a+=n[c],s=o[a],s!==void 0){if(["string","number","boolean"].indexOf(typeof s)>-1&&c<n.length-1)continue;i+=c-i+1;break}o=s}return o},Ze=e=>e?.replace(/_/g,"-"),Si={type:"logger",log(e){this.output("log",e)},warn(e){this.output("warn",e)},error(e){this.output("error",e)},output(e,t){console?.[e]?.apply?.(console,t)}};class Bt{constructor(t,r={}){this.init(t,r)}init(t,r={}){this.prefix=r.prefix||"i18next:",this.logger=t||Si,this.options=r,this.debug=r.debug}log(...t){return this.forward(t,"log","",!0)}warn(...t){return this.forward(t,"warn","",!0)}error(...t){return this.forward(t,"error","")}deprecate(...t){return this.forward(t,"warn","WARNING DEPRECATED: ",!0)}forward(t,r,n,o){return o&&!this.debug?null:(x(t[0])&&(t[0]=`${n}${this.prefix} ${t[0]}`),this.logger[r](t))}create(t){return new Bt(this.logger,{prefix:`${this.prefix}:${t}:`,...this.options})}clone(t){return t=t||this.options,t.prefix=t.prefix||this.prefix,new Bt(this.logger,t)}}var me=new Bt;class ft{constructor(){this.observers={}}on(t,r){return t.split(" ").forEach(n=>{this.observers[n]||(this.observers[n]=new Map);const o=this.observers[n].get(r)||0;this.observers[n].set(r,o+1)}),this}off(t,r){if(this.observers[t]){if(!r){delete this.observers[t];return}this.observers[t].delete(r)}}emit(t,...r){this.observers[t]&&Array.from(this.observers[t].entries()).forEach(([o,i])=>{for(let s=0;s<i;s++)o(...r)}),this.observers["*"]&&Array.from(this.observers["*"].entries()).forEach(([o,i])=>{for(let s=0;s<i;s++)o.apply(o,[t,...r])})}}class tn extends ft{constructor(t,r={ns:["translation"],defaultNS:"translation"}){super(),this.data=t||{},this.options=r,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)}removeNamespaces(t){const r=this.options.ns.indexOf(t);r>-1&&this.options.ns.splice(r,1)}getResource(t,r,n,o={}){const i=o.keySeparator!==void 0?o.keySeparator:this.options.keySeparator,s=o.ignoreJSONStructure!==void 0?o.ignoreJSONStructure:this.options.ignoreJSONStructure;let a;t.indexOf(".")>-1?a=t.split("."):(a=[t,r],n&&(Array.isArray(n)?a.push(...n):x(n)&&i?a.push(...n.split(i)):a.push(n)));const c=lt(this.data,a);return!c&&!r&&!n&&t.indexOf(".")>-1&&(t=a[0],r=a[1],n=a.slice(2).join(".")),c||!s||!x(n)?c:Ht(this.data?.[t]?.[r],n,i)}addResource(t,r,n,o,i={silent:!1}){const s=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator;let a=[t,r];n&&(a=a.concat(s?n.split(s):n)),t.indexOf(".")>-1&&(a=t.split("."),o=r,r=a[1]),this.addNamespaces(r),Xr(this.data,a,o),i.silent||this.emit("added",t,r,n,o)}addResources(t,r,n,o={silent:!1}){for(const i in n)(x(n[i])||Array.isArray(n[i]))&&this.addResource(t,r,i,n[i],{silent:!0});o.silent||this.emit("added",t,r,n)}addResourceBundle(t,r,n,o,i,s={silent:!1,skipCopy:!1}){let a=[t,r];t.indexOf(".")>-1&&(a=t.split("."),o=n,n=r,r=a[1]),this.addNamespaces(r);let c=lt(this.data,a)||{};s.skipCopy||(n=JSON.parse(JSON.stringify(n))),o?en(c,n,i):c={...c,...n},Xr(this.data,a,c),s.silent||this.emit("added",t,r,n)}removeResourceBundle(t,r){this.hasResourceBundle(t,r)&&delete this.data[t][r],this.removeNamespaces(r),this.emit("removed",t,r)}hasResourceBundle(t,r){return this.getResource(t,r)!==void 0}getResourceBundle(t,r){return r||(r=this.options.defaultNS),this.getResource(t,r)}getDataByLanguage(t){return this.data[t]}hasLanguageSomeTranslations(t){const r=this.getDataByLanguage(t);return!!(r&&Object.keys(r)||[]).find(o=>r[o]&&Object.keys(r[o]).length>0)}toJSON(){return this.data}}var rn={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,r,n,o){return e.forEach(i=>{t=this.processors[i]?.process(t,r,n,o)??t}),t}};const nn=Symbol("i18next/PATH_KEY");function Ii(){const e=[],t=Object.create(null);let r;return t.get=(n,o)=>(r?.revoke?.(),o===nn?e:(e.push(o),r=Proxy.revocable(n,t),r.proxy)),Proxy.revocable(Object.create(null),t).proxy}function je(e,t){const{[nn]:r}=e(Ii()),n=t?.keySeparator??".",o=t?.nsSeparator??":";if(r.length>1&&o){const i=t?.ns,s=Array.isArray(i)?i:null;if(s&&s.length>1&&s.slice(1).includes(r[0]))return`${r[0]}${o}${r.slice(1).join(n)}`}return r.join(n)}const on={},Gt=e=>!x(e)&&typeof e!="boolean"&&typeof e!="number";class Ft extends ft{constructor(t,r={}){super(),fi(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],t,this),this.options=r,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=me.create("translator")}changeLanguage(t){t&&(this.language=t)}exists(t,r={interpolation:{}}){const n={...r};if(t==null)return!1;const o=this.resolve(t,n);if(o?.res===void 0)return!1;const i=Gt(o.res);return!(n.returnObjects===!1&&i)}extractFromKey(t,r){let n=r.nsSeparator!==void 0?r.nsSeparator:this.options.nsSeparator;n===void 0&&(n=":");const o=r.keySeparator!==void 0?r.keySeparator:this.options.keySeparator;let i=r.ns||this.options.defaultNS||[];const s=n&&t.indexOf(n)>-1,a=!this.options.userDefinedKeySeparator&&!r.keySeparator&&!this.options.userDefinedNsSeparator&&!r.nsSeparator&&!_i(t,n,o);if(s&&!a){const c=t.match(this.interpolator.nestingRegexp);if(c&&c.length>0)return{key:t,namespaces:x(i)?[i]:i};const u=t.split(n);(n!==o||n===o&&this.options.ns.indexOf(u[0])>-1)&&(i=u.shift()),t=u.join(o)}return{key:t,namespaces:x(i)?[i]:i}}translate(t,r,n){let o=typeof r=="object"?{...r}:r;if(typeof o!="object"&&this.options.overloadTranslationOptionHandler&&(o=this.options.overloadTranslationOptionHandler(arguments)),typeof o=="object"&&(o={...o}),o||(o={}),t==null)return"";typeof t=="function"&&(t=je(t,{...this.options,...o})),Array.isArray(t)||(t=[String(t)]),t=t.map(V=>typeof V=="function"?je(V,{...this.options,...o}):String(V));const i=o.returnDetails!==void 0?o.returnDetails:this.options.returnDetails,s=o.keySeparator!==void 0?o.keySeparator:this.options.keySeparator,{key:a,namespaces:c}=this.extractFromKey(t[t.length-1],o),u=c[c.length-1];let d=o.nsSeparator!==void 0?o.nsSeparator:this.options.nsSeparator;d===void 0&&(d=":");const l=o.lng||this.language,f=o.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(l?.toLowerCase()==="cimode")return f?i?{res:`${u}${d}${a}`,usedKey:a,exactUsedKey:a,usedLng:l,usedNS:u,usedParams:this.getUsedParamsDetails(o)}:`${u}${d}${a}`:i?{res:a,usedKey:a,exactUsedKey:a,usedLng:l,usedNS:u,usedParams:this.getUsedParamsDetails(o)}:a;const m=this.resolve(t,o);let y=m?.res;const g=m?.usedKey||a,_=m?.exactUsedKey||a,R=["[object Number]","[object Function]","[object RegExp]"],$=o.joinArrays!==void 0?o.joinArrays:this.options.joinArrays,E=!this.i18nFormat||this.i18nFormat.handleAsObject,h=o.count!==void 0&&!x(o.count),S=Ft.hasDefaultValue(o),N=h?this.pluralResolver.getSuffix(l,o.count,o):"",k=o.ordinal&&h?this.pluralResolver.getSuffix(l,o.count,{ordinal:!1}):"",j=h&&!o.ordinal&&o.count===0,v=j&&o[`defaultValue${this.options.pluralSeparator}zero`]||o[`defaultValue${N}`]||o[`defaultValue${k}`]||o.defaultValue;let K=y;E&&!y&&S&&(K=v);const D=Gt(K),L=Object.prototype.toString.apply(K);if(E&&K&&D&&R.indexOf(L)<0&&!(x($)&&Array.isArray(K))){if(!o.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const V=this.options.returnedObjectHandler?this.options.returnedObjectHandler(g,K,{...o,ns:c}):`key '${a} (${this.language})' returned an object instead of string.`;return i?(m.res=V,m.usedParams=this.getUsedParamsDetails(o),m):V}if(s){const V=Array.isArray(K),q=V?[]:{},re=V?_:g;for(const W in K)if(Object.prototype.hasOwnProperty.call(K,W)){const Z=`${re}${s}${W}`;S&&!y?q[W]=this.translate(Z,{...o,defaultValue:Gt(v)?v[W]:void 0,joinArrays:!1,ns:c}):q[W]=this.translate(Z,{...o,joinArrays:!1,ns:c}),q[W]===Z&&(q[W]=K[W])}y=q}}else if(E&&x($)&&Array.isArray(y))y=y.join($),y&&(y=this.extendTranslation(y,t,o,n));else{let V=!1,q=!1;!this.isValidLookup(y)&&S&&(V=!0,y=v),this.isValidLookup(y)||(q=!0,y=a);const W=(o.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&q?void 0:y,Z=S&&v!==y&&this.options.updateMissing;if(q||V||Z){if(this.logger.log(Z?"updateKey":"missingKey",l,u,a,Z?v:y),s){const Q=this.resolve(a,{...o,keySeparator:!1});Q&&Q.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let ne=[];const X=this.languageUtils.getFallbackCodes(this.options.fallbackLng,o.lng||this.language);if(this.options.saveMissingTo==="fallback"&&X&&X[0])for(let Q=0;Q<X.length;Q++)ne.push(X[Q]);else this.options.saveMissingTo==="all"?ne=this.languageUtils.toResolveHierarchy(o.lng||this.language):ne.push(o.lng||this.language);const ce=(Q,w,A)=>{const I=S&&A!==y?A:W;this.options.missingKeyHandler?this.options.missingKeyHandler(Q,u,w,I,Z,o):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(Q,u,w,I,Z,o),this.emit("missingKey",Q,u,w,y)};this.options.saveMissing&&(this.options.saveMissingPlurals&&h?ne.forEach(Q=>{const w=this.pluralResolver.getSuffixes(Q,o);j&&o[`defaultValue${this.options.pluralSeparator}zero`]&&w.indexOf(`${this.options.pluralSeparator}zero`)<0&&w.push(`${this.options.pluralSeparator}zero`),w.forEach(A=>{ce([Q],a+A,o[`defaultValue${A}`]||v)})}):ce(ne,a,v))}y=this.extendTranslation(y,t,o,m,n),q&&y===a&&this.options.appendNamespaceToMissingKey&&(y=`${u}${d}${a}`),(q||V)&&this.options.parseMissingKeyHandler&&(y=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${u}${d}${a}`:a,V?y:void 0,o))}return i?(m.res=y,m.usedParams=this.getUsedParamsDetails(o),m):y}extendTranslation(t,r,n,o,i){if(this.i18nFormat?.parse)t=this.i18nFormat.parse(t,{...this.options.interpolation.defaultVariables,...n},n.lng||this.language||o.usedLng,o.usedNS,o.usedKey,{resolved:o});else if(!n.skipInterpolation){n.interpolation&&this.interpolator.init({...n,interpolation:{...this.options.interpolation,...n.interpolation}});const c=x(t)&&(n?.interpolation?.skipOnVariables!==void 0?n.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let u;if(c){const l=t.match(this.interpolator.nestingRegexp);u=l&&l.length}let d=n.replace&&!x(n.replace)?n.replace:n;if(this.options.interpolation.defaultVariables&&(d={...this.options.interpolation.defaultVariables,...d}),t=this.interpolator.interpolate(t,d,n.lng||this.language||o.usedLng,n),c){const l=t.match(this.interpolator.nestingRegexp),f=l&&l.length;u<f&&(n.nest=!1)}!n.lng&&o&&o.res&&(n.lng=this.language||o.usedLng),n.nest!==!1&&(t=this.interpolator.nest(t,(...l)=>i?.[0]===l[0]&&!n.context?(this.logger.warn(`It seems you are nesting recursively key: ${l[0]} in key: ${r[0]}`),null):this.translate(...l,r),n)),n.interpolation&&this.interpolator.reset()}const s=n.postProcess||this.options.postProcess,a=x(s)?[s]:s;return t!=null&&a?.length&&n.applyPostProcessor!==!1&&(t=rn.handle(a,t,r,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...o,usedParams:this.getUsedParamsDetails(n)},...n}:n,this)),t}resolve(t,r={}){let n,o,i,s,a;return x(t)&&(t=[t]),Array.isArray(t)&&(t=t.map(c=>typeof c=="function"?je(c,{...this.options,...r}):c)),t.forEach(c=>{if(this.isValidLookup(n))return;const u=this.extractFromKey(c,r),d=u.key;o=d;let l=u.namespaces;this.options.fallbackNS&&(l=l.concat(this.options.fallbackNS));const f=r.count!==void 0&&!x(r.count),m=f&&!r.ordinal&&r.count===0,y=r.context!==void 0&&(x(r.context)||typeof r.context=="number")&&r.context!=="",g=r.lngs?r.lngs:this.languageUtils.toResolveHierarchy(r.lng||this.language,r.fallbackLng);l.forEach(_=>{this.isValidLookup(n)||(a=_,!on[`${g[0]}-${_}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(a)&&(on[`${g[0]}-${_}`]=!0,this.logger.warn(`key "${o}" for languages "${g.join(", ")}" won't get resolved as namespace "${a}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),g.forEach(R=>{if(this.isValidLookup(n))return;s=R;const $=[d];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys($,d,R,_,r);else{let h;f&&(h=this.pluralResolver.getSuffix(R,r.count,r));const S=`${this.options.pluralSeparator}zero`,N=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(f&&(r.ordinal&&h.indexOf(N)===0&&$.push(d+h.replace(N,this.options.pluralSeparator)),$.push(d+h),m&&$.push(d+S)),y){const k=`${d}${this.options.contextSeparator||"_"}${r.context}`;$.push(k),f&&(r.ordinal&&h.indexOf(N)===0&&$.push(k+h.replace(N,this.options.pluralSeparator)),$.push(k+h),m&&$.push(k+S))}}let E;for(;E=$.pop();)this.isValidLookup(n)||(i=E,n=this.getResource(R,_,E,r))}))})}),{res:n,usedKey:o,exactUsedKey:i,usedLng:s,usedNS:a}}isValidLookup(t){return t!==void 0&&!(!this.options.returnNull&&t===null)&&!(!this.options.returnEmptyString&&t==="")}getResource(t,r,n,o={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(t,r,n,o):this.resourceStore.getResource(t,r,n,o)}getUsedParamsDetails(t={}){const r=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],n=t.replace&&!x(t.replace);let o=n?t.replace:t;if(n&&typeof t.count<"u"&&(o.count=t.count),this.options.interpolation.defaultVariables&&(o={...this.options.interpolation.defaultVariables,...o}),!n){o={...o};for(const i of r)delete o[i]}return o}static hasDefaultValue(t){const r="defaultValue";for(const n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&r===n.substring(0,r.length)&&t[n]!==void 0)return!0;return!1}}class sn{constructor(t){this.options=t,this.supportedLngs=this.options.supportedLngs||!1,this.logger=me.create("languageUtils")}getScriptPartFromCode(t){if(t=Ze(t),!t||t.indexOf("-")<0)return null;const r=t.split("-");return r.length===2||(r.pop(),r[r.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(r.join("-"))}getLanguagePartFromCode(t){if(t=Ze(t),!t||t.indexOf("-")<0)return t;const r=t.split("-");return this.formatLanguageCode(r[0])}formatLanguageCode(t){if(x(t)&&t.indexOf("-")>-1){let r;try{r=Intl.getCanonicalLocales(t)[0]}catch{}return r&&this.options.lowerCaseLng&&(r=r.toLowerCase()),r||(this.options.lowerCaseLng?t.toLowerCase():t)}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}isSupportedCode(t){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}getBestMatchFromCodes(t){if(!t)return null;let r;return t.forEach(n=>{if(r)return;const o=this.formatLanguageCode(n);(!this.options.supportedLngs||this.isSupportedCode(o))&&(r=o)}),!r&&this.options.supportedLngs&&t.forEach(n=>{if(r)return;const o=this.getScriptPartFromCode(n);if(this.isSupportedCode(o))return r=o;const i=this.getLanguagePartFromCode(n);if(this.isSupportedCode(i))return r=i;r=this.options.supportedLngs.find(s=>{if(s===i)return s;if(!(s.indexOf("-")<0&&i.indexOf("-")<0)&&(s.indexOf("-")>0&&i.indexOf("-")<0&&s.substring(0,s.indexOf("-"))===i||s.indexOf(i)===0&&i.length>1))return s})}),r||(r=this.getFallbackCodes(this.options.fallbackLng)[0]),r}getFallbackCodes(t,r){if(!t)return[];if(typeof t=="function"&&(t=t(r)),x(t)&&(t=[t]),Array.isArray(t))return t;if(!r)return t.default||[];let n=t[r];return n||(n=t[this.getScriptPartFromCode(r)]),n||(n=t[this.formatLanguageCode(r)]),n||(n=t[this.getLanguagePartFromCode(r)]),n||(n=t.default),n||[]}toResolveHierarchy(t,r){const n=this.getFallbackCodes((r===!1?[]:r)||this.options.fallbackLng||[],t),o=[],i=s=>{s&&(this.isSupportedCode(s)?o.push(s):this.logger.warn(`rejecting language code not found in supportedLngs: ${s}`))};return x(t)&&(t.indexOf("-")>-1||t.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&i(this.formatLanguageCode(t)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&i(this.getScriptPartFromCode(t)),this.options.load!=="currentOnly"&&i(this.getLanguagePartFromCode(t))):x(t)&&i(this.formatLanguageCode(t)),n.forEach(s=>{o.indexOf(s)<0&&i(this.formatLanguageCode(s))}),o}}const an={zero:0,one:1,two:2,few:3,many:4,other:5},cn={select:e=>e===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class Ri{constructor(t,r={}){this.languageUtils=t,this.options=r,this.logger=me.create("pluralResolver"),this.pluralRulesCache={}}clearCache(){this.pluralRulesCache={}}getRule(t,r={}){const n=Ze(t==="dev"?"en":t),o=r.ordinal?"ordinal":"cardinal",i=JSON.stringify({cleanedCode:n,type:o});if(i in this.pluralRulesCache)return this.pluralRulesCache[i];let s;try{s=new Intl.PluralRules(n,{type:o})}catch{if(typeof Intl>"u")return this.logger.error("No Intl support, please use an Intl polyfill!"),cn;if(!t.match(/-|_/))return cn;const c=this.languageUtils.getLanguagePartFromCode(t);s=this.getRule(c,r)}return this.pluralRulesCache[i]=s,s}needsPlural(t,r={}){let n=this.getRule(t,r);return n||(n=this.getRule("dev",r)),n?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(t,r,n={}){return this.getSuffixes(t,n).map(o=>`${r}${o}`)}getSuffixes(t,r={}){let n=this.getRule(t,r);return n||(n=this.getRule("dev",r)),n?n.resolvedOptions().pluralCategories.sort((o,i)=>an[o]-an[i]).map(o=>`${this.options.prepend}${r.ordinal?`ordinal${this.options.prepend}`:""}${o}`):[]}getSuffix(t,r,n={}){const o=this.getRule(t,n);return o?`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:""}${o.select(r)}`:(this.logger.warn(`no plural rule found for: ${t}`),this.getSuffix("dev",r,n))}}const un=(e,t,r,n=".",o=!0)=>{let i=hi(e,t,r);return!i&&o&&x(r)&&(i=Ht(e,r,n),i===void 0&&(i=Ht(t,r,n))),i},Wt=e=>e.replace(/\$/g,"$$$$");class dn{constructor(t={}){this.logger=me.create("interpolator"),this.options=t,this.format=t?.interpolation?.format||(r=>r),this.init(t)}init(t={}){t.interpolation||(t.interpolation={escapeValue:!0});const{escape:r,escapeValue:n,useRawValueToEscape:o,prefix:i,prefixEscaped:s,suffix:a,suffixEscaped:c,formatSeparator:u,unescapeSuffix:d,unescapePrefix:l,nestingPrefix:f,nestingPrefixEscaped:m,nestingSuffix:y,nestingSuffixEscaped:g,nestingOptionsSeparator:_,maxReplaces:R,alwaysFormat:$}=t.interpolation;this.escape=r!==void 0?r:$i,this.escapeValue=n!==void 0?n:!0,this.useRawValueToEscape=o!==void 0?o:!1,this.prefix=i?Pe(i):s||"{{",this.suffix=a?Pe(a):c||"}}",this.formatSeparator=u||",",this.unescapePrefix=d?"":l||"-",this.unescapeSuffix=this.unescapePrefix?"":d||"",this.nestingPrefix=f?Pe(f):m||Pe("$t("),this.nestingSuffix=y?Pe(y):g||Pe(")"),this.nestingOptionsSeparator=_||",",this.maxReplaces=R||1e3,this.alwaysFormat=$!==void 0?$:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const t=(r,n)=>r?.source===n?(r.lastIndex=0,r):new RegExp(n,"g");this.regexp=t(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=t(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=t(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(t,r,n,o){let i,s,a;const c=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},u=m=>{if(m.indexOf(this.formatSeparator)<0){const R=un(r,c,m,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(R,void 0,n,{...o,...r,interpolationkey:m}):R}const y=m.split(this.formatSeparator),g=y.shift().trim(),_=y.join(this.formatSeparator).trim();return this.format(un(r,c,g,this.options.keySeparator,this.options.ignoreJSONStructure),_,n,{...o,...r,interpolationkey:g})};this.resetRegExp();const d=o?.missingInterpolationHandler||this.options.missingInterpolationHandler,l=o?.interpolation?.skipOnVariables!==void 0?o.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:m=>Wt(m)},{regex:this.regexp,safeValue:m=>this.escapeValue?Wt(this.escape(m)):Wt(m)}].forEach(m=>{for(a=0;i=m.regex.exec(t);){const y=i[1].trim();if(s=u(y),s===void 0)if(typeof d=="function"){const _=d(t,i,o);s=x(_)?_:""}else if(o&&Object.prototype.hasOwnProperty.call(o,y))s="";else if(l){s=i[0];continue}else this.logger.warn(`missed to pass in variable ${y} for interpolating ${t}`),s="";else!x(s)&&!this.useRawValueToEscape&&(s=Kr(s));const g=m.safeValue(s);if(t=t.replace(i[0],g),l?(m.regex.lastIndex+=s.length,m.regex.lastIndex-=i[0].length):m.regex.lastIndex=0,a++,a>=this.maxReplaces)break}}),t}nest(t,r,n={}){let o,i,s;const a=(c,u)=>{const d=this.nestingOptionsSeparator;if(c.indexOf(d)<0)return c;const l=c.split(new RegExp(`${Pe(d)}[ ]*{`));let f=`{${l[1]}`;c=l[0],f=this.interpolate(f,s);const m=f.match(/'/g),y=f.match(/"/g);((m?.length??0)%2===0&&!y||(y?.length??0)%2!==0)&&(f=f.replace(/'/g,'"'));try{s=JSON.parse(f),u&&(s={...u,...s})}catch(g){return this.logger.warn(`failed parsing options string in nesting for key ${c}`,g),`${c}${d}${f}`}return s.defaultValue&&s.defaultValue.indexOf(this.prefix)>-1&&delete s.defaultValue,c};for(;o=this.nestingRegexp.exec(t);){let c=[];s={...n},s=s.replace&&!x(s.replace)?s.replace:s,s.applyPostProcessor=!1,delete s.defaultValue;const u=/{.*}/.test(o[1])?o[1].lastIndexOf("}")+1:o[1].indexOf(this.formatSeparator);if(u!==-1&&(c=o[1].slice(u).split(this.formatSeparator).map(d=>d.trim()).filter(Boolean),o[1]=o[1].slice(0,u)),i=r(a.call(this,o[1].trim(),s),s),i&&o[0]===t&&!x(i))return i;x(i)||(i=Kr(i)),i||(this.logger.warn(`missed to resolve ${o[1]} for nesting ${t}`),i=""),c.length&&(i=c.reduce((d,l)=>this.format(d,l,n.lng,{...n,interpolationkey:o[1].trim()}),i.trim())),t=t.replace(o[0],i),this.regexp.lastIndex=0}return t}}const Oi=e=>{let t=e.toLowerCase().trim();const r={};if(e.indexOf("(")>-1){const n=e.split("(");t=n[0].toLowerCase().trim();const o=n[1].substring(0,n[1].length-1);t==="currency"&&o.indexOf(":")<0?r.currency||(r.currency=o.trim()):t==="relativetime"&&o.indexOf(":")<0?r.range||(r.range=o.trim()):o.split(";").forEach(s=>{if(s){const[a,...c]=s.split(":"),u=c.join(":").trim().replace(/^'+|'+$/g,""),d=a.trim();r[d]||(r[d]=u),u==="false"&&(r[d]=!1),u==="true"&&(r[d]=!0),isNaN(u)||(r[d]=parseInt(u,10))}})}return{formatName:t,formatOptions:r}},pn=e=>{const t={};return(r,n,o)=>{let i=o;o&&o.interpolationkey&&o.formatParams&&o.formatParams[o.interpolationkey]&&o[o.interpolationkey]&&(i={...i,[o.interpolationkey]:void 0});const s=n+JSON.stringify(i);let a=t[s];return a||(a=e(Ze(n),o),t[s]=a),a(r)}},bi=e=>(t,r,n)=>e(Ze(r),n)(t);class Ni{constructor(t={}){this.logger=me.create("formatter"),this.options=t,this.init(t)}init(t,r={interpolation:{}}){this.formatSeparator=r.interpolation.formatSeparator||",";const n=r.cacheInBuiltFormats?pn:bi;this.formats={number:n((o,i)=>{const s=new Intl.NumberFormat(o,{...i});return a=>s.format(a)}),currency:n((o,i)=>{const s=new Intl.NumberFormat(o,{...i,style:"currency"});return a=>s.format(a)}),datetime:n((o,i)=>{const s=new Intl.DateTimeFormat(o,{...i});return a=>s.format(a)}),relativetime:n((o,i)=>{const s=new Intl.RelativeTimeFormat(o,{...i});return a=>s.format(a,i.range||"day")}),list:n((o,i)=>{const s=new Intl.ListFormat(o,{...i});return a=>s.format(a)})}}add(t,r){this.formats[t.toLowerCase().trim()]=r}addCached(t,r){this.formats[t.toLowerCase().trim()]=pn(r)}format(t,r,n,o={}){const i=r.split(this.formatSeparator);if(i.length>1&&i[0].indexOf("(")>1&&i[0].indexOf(")")<0&&i.find(a=>a.indexOf(")")>-1)){const a=i.findIndex(c=>c.indexOf(")")>-1);i[0]=[i[0],...i.splice(1,a)].join(this.formatSeparator)}return i.reduce((a,c)=>{const{formatName:u,formatOptions:d}=Oi(c);if(this.formats[u]){let l=a;try{const f=o?.formatParams?.[o.interpolationkey]||{},m=f.locale||f.lng||o.locale||o.lng||n;l=this.formats[u](a,m,{...d,...o,...f})}catch(f){this.logger.warn(f)}return l}else this.logger.warn(`there was no format function for ${u}`);return a},t)}}const Pi=(e,t)=>{e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)};class Ti extends ft{constructor(t,r,n,o={}){super(),this.backend=t,this.store=r,this.services=n,this.languageUtils=n.languageUtils,this.options=o,this.logger=me.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=o.maxParallelReads||10,this.readingCalls=0,this.maxRetries=o.maxRetries>=0?o.maxRetries:5,this.retryTimeout=o.retryTimeout>=1?o.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(n,o.backend,o)}queueLoad(t,r,n,o){const i={},s={},a={},c={};return t.forEach(u=>{let d=!0;r.forEach(l=>{const f=`${u}|${l}`;!n.reload&&this.store.hasResourceBundle(u,l)?this.state[f]=2:this.state[f]<0||(this.state[f]===1?s[f]===void 0&&(s[f]=!0):(this.state[f]=1,d=!1,s[f]===void 0&&(s[f]=!0),i[f]===void 0&&(i[f]=!0),c[l]===void 0&&(c[l]=!0)))}),d||(a[u]=!0)}),(Object.keys(i).length||Object.keys(s).length)&&this.queue.push({pending:s,pendingCount:Object.keys(s).length,loaded:{},errors:[],callback:o}),{toLoad:Object.keys(i),pending:Object.keys(s),toLoadLanguages:Object.keys(a),toLoadNamespaces:Object.keys(c)}}loaded(t,r,n){const o=t.split("|"),i=o[0],s=o[1];r&&this.emit("failedLoading",i,s,r),!r&&n&&this.store.addResourceBundle(i,s,n,void 0,void 0,{skipCopy:!0}),this.state[t]=r?-1:2,r&&n&&(this.state[t]=0);const a={};this.queue.forEach(c=>{yi(c.loaded,[i],s),Pi(c,t),r&&c.errors.push(r),c.pendingCount===0&&!c.done&&(Object.keys(c.loaded).forEach(u=>{a[u]||(a[u]={});const d=c.loaded[u];d.length&&d.forEach(l=>{a[u][l]===void 0&&(a[u][l]=!0)})}),c.done=!0,c.errors.length?c.callback(c.errors):c.callback())}),this.emit("loaded",a),this.queue=this.queue.filter(c=>!c.done)}read(t,r,n,o=0,i=this.retryTimeout,s){if(!t.length)return s(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:t,ns:r,fcName:n,tried:o,wait:i,callback:s});return}this.readingCalls++;const a=(u,d)=>{if(this.readingCalls--,this.waitingReads.length>0){const l=this.waitingReads.shift();this.read(l.lng,l.ns,l.fcName,l.tried,l.wait,l.callback)}if(u&&d&&o<this.maxRetries){setTimeout(()=>{this.read.call(this,t,r,n,o+1,i*2,s)},i);return}s(u,d)},c=this.backend[n].bind(this.backend);if(c.length===2){try{const u=c(t,r);u&&typeof u.then=="function"?u.then(d=>a(null,d)).catch(a):a(null,u)}catch(u){a(u)}return}return c(t,r,a)}prepareLoading(t,r,n={},o){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),o&&o();x(t)&&(t=this.languageUtils.toResolveHierarchy(t)),x(r)&&(r=[r]);const i=this.queueLoad(t,r,n,o);if(!i.toLoad.length)return i.pending.length||o(),null;i.toLoad.forEach(s=>{this.loadOne(s)})}load(t,r,n){this.prepareLoading(t,r,{},n)}reload(t,r,n){this.prepareLoading(t,r,{reload:!0},n)}loadOne(t,r=""){const n=t.split("|"),o=n[0],i=n[1];this.read(o,i,"read",void 0,void 0,(s,a)=>{s&&this.logger.warn(`${r}loading namespace ${i} for language ${o} failed`,s),!s&&a&&this.logger.log(`${r}loaded namespace ${i} for language ${o}`,a),this.loaded(t,s,a)})}saveMissing(t,r,n,o,i,s={},a=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(r)){this.logger.warn(`did not save key "${n}" as the namespace "${r}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(n==null||n==="")){if(this.backend?.create){const c={...s,isUpdate:i},u=this.backend.create.bind(this.backend);if(u.length<6)try{let d;u.length===5?d=u(t,r,n,o,c):d=u(t,r,n,o),d&&typeof d.then=="function"?d.then(l=>a(null,l)).catch(a):a(null,d)}catch(d){a(d)}else u(t,r,n,o,a,c)}!t||!t[0]||this.store.addResource(t[0],r,n,o)}}}const zt=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:e=>{let t={};if(typeof e[1]=="object"&&(t=e[1]),x(e[1])&&(t.defaultValue=e[1]),x(e[2])&&(t.tDescription=e[2]),typeof e[2]=="object"||typeof e[3]=="object"){const r=e[3]||e[2];Object.keys(r).forEach(n=>{t[n]=r[n]})}return t},interpolation:{escapeValue:!0,format:e=>e,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),ln=e=>(x(e.ns)&&(e.ns=[e.ns]),x(e.fallbackLng)&&(e.fallbackLng=[e.fallbackLng]),x(e.fallbackNS)&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs?.indexOf?.("cimode")<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),typeof e.initImmediate=="boolean"&&(e.initAsync=e.initImmediate),e),mt=()=>{},Li=e=>{Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(r=>{typeof e[r]=="function"&&(e[r]=e[r].bind(e))})},fn="__i18next_supportNoticeShown",Di=()=>!!(typeof globalThis<"u"&&globalThis[fn]||typeof process<"u"&&process.env&&process.env.I18NEXT_NO_SUPPORT_NOTICE||typeof process<"u"&&process.env&&process.env.NODE_ENV==="production"),Ci=()=>{typeof globalThis<"u"&&(globalThis[fn]=!0)},qi=e=>!!(e?.modules?.backend?.name?.indexOf("Locize")>0||e?.modules?.backend?.constructor?.name?.indexOf("Locize")>0||e?.options?.backend?.backends&&e.options.backend.backends.some(t=>t?.name?.indexOf("Locize")>0||t?.constructor?.name?.indexOf("Locize")>0)||e?.options?.backend?.projectId||e?.options?.backend?.backendOptions&&e.options.backend.backendOptions.some(t=>t?.projectId));class ut extends ft{constructor(t={},r){if(super(),this.options=ln(t),this.services={},this.logger=me,this.modules={external:[]},Li(this),r&&!this.isInitialized&&!t.isClone){if(!this.options.initAsync)return this.init(t,r),this;setTimeout(()=>{this.init(t,r)},0)}}init(t={},r){this.isInitializing=!0,typeof t=="function"&&(r=t,t={}),t.defaultNS==null&&t.ns&&(x(t.ns)?t.defaultNS=t.ns:t.ns.indexOf("translation")<0&&(t.defaultNS=t.ns[0]));const n=zt();this.options={...n,...this.options,...ln(t)},this.options.interpolation={...n.interpolation,...this.options.interpolation},t.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=t.keySeparator),t.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=t.nsSeparator),typeof this.options.overloadTranslationOptionHandler!="function"&&(this.options.overloadTranslationOptionHandler=n.overloadTranslationOptionHandler),this.options.showSupportNotice!==!1&&!qi(this)&&!Di()&&(typeof console<"u"&&typeof console.info<"u"&&console.info("\u{1F310} i18next is made possible by our own product, Locize \u2014 consider powering your project with managed localization (AI, CDN, integrations): https://locize.com \u{1F499}"),Ci());const o=u=>u?typeof u=="function"?new u:u:null;if(!this.options.isClone){this.modules.logger?me.init(o(this.modules.logger),this.options):me.init(null,this.options);let u;this.modules.formatter?u=this.modules.formatter:u=Ni;const d=new sn(this.options);this.store=new tn(this.options.resources,this.options);const l=this.services;l.logger=me,l.resourceStore=this.store,l.languageUtils=d,l.pluralResolver=new Ri(d,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==n.interpolation.format&&this.logger.deprecate("init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting"),u&&(!this.options.interpolation.format||this.options.interpolation.format===n.interpolation.format)&&(l.formatter=o(u),l.formatter.init&&l.formatter.init(l,this.options),this.options.interpolation.format=l.formatter.format.bind(l.formatter)),l.interpolator=new dn(this.options),l.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},l.backendConnector=new Ti(o(this.modules.backend),l.resourceStore,l,this.options),l.backendConnector.on("*",(m,...y)=>{this.emit(m,...y)}),this.modules.languageDetector&&(l.languageDetector=o(this.modules.languageDetector),l.languageDetector.init&&l.languageDetector.init(l,this.options.detection,this.options)),this.modules.i18nFormat&&(l.i18nFormat=o(this.modules.i18nFormat),l.i18nFormat.init&&l.i18nFormat.init(this)),this.translator=new Ft(this.services,this.options),this.translator.on("*",(m,...y)=>{this.emit(m,...y)}),this.modules.external.forEach(m=>{m.init&&m.init(this)})}if(this.format=this.options.interpolation.format,r||(r=mt),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const u=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);u.length>0&&u[0]!=="dev"&&(this.options.lng=u[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(u=>{this[u]=(...d)=>this.store[u](...d)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(u=>{this[u]=(...d)=>(this.store[u](...d),this)});const a=Ke(),c=()=>{const u=(d,l)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),a.resolve(l),r(d,l)};if(this.languages&&!this.isInitialized)return u(null,this.t.bind(this));this.changeLanguage(this.options.lng,u)};return this.options.resources||!this.options.initAsync?c():setTimeout(c,0),a}loadResources(t,r=mt){let n=r;const o=x(t)?t:this.language;if(typeof t=="function"&&(n=t),!this.options.resources||this.options.partialBundledLanguages){if(o?.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return n();const i=[],s=a=>{if(!a||a==="cimode")return;this.services.languageUtils.toResolveHierarchy(a).forEach(u=>{u!=="cimode"&&i.indexOf(u)<0&&i.push(u)})};o?s(o):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(c=>s(c)),this.options.preload?.forEach?.(a=>s(a)),this.services.backendConnector.load(i,this.options.ns,a=>{!a&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),n(a)})}else n(null)}reloadResources(t,r,n){const o=Ke();return typeof t=="function"&&(n=t,t=void 0),typeof r=="function"&&(n=r,r=void 0),t||(t=this.languages),r||(r=this.options.ns),n||(n=mt),this.services.backendConnector.reload(t,r,i=>{o.resolve(),n(i)}),o}use(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return t.type==="backend"&&(this.modules.backend=t),(t.type==="logger"||t.log&&t.warn&&t.error)&&(this.modules.logger=t),t.type==="languageDetector"&&(this.modules.languageDetector=t),t.type==="i18nFormat"&&(this.modules.i18nFormat=t),t.type==="postProcessor"&&rn.addPostProcessor(t),t.type==="formatter"&&(this.modules.formatter=t),t.type==="3rdParty"&&this.modules.external.push(t),this}setResolvedLanguage(t){if(!(!t||!this.languages)&&!(["cimode","dev"].indexOf(t)>-1)){for(let r=0;r<this.languages.length;r++){const n=this.languages[r];if(!(["cimode","dev"].indexOf(n)>-1)&&this.store.hasLanguageSomeTranslations(n)){this.resolvedLanguage=n;break}}!this.resolvedLanguage&&this.languages.indexOf(t)<0&&this.store.hasLanguageSomeTranslations(t)&&(this.resolvedLanguage=t,this.languages.unshift(t))}}changeLanguage(t,r){this.isLanguageChangingTo=t;const n=Ke();this.emit("languageChanging",t);const o=a=>{this.language=a,this.languages=this.services.languageUtils.toResolveHierarchy(a),this.resolvedLanguage=void 0,this.setResolvedLanguage(a)},i=(a,c)=>{c?this.isLanguageChangingTo===t&&(o(c),this.translator.changeLanguage(c),this.isLanguageChangingTo=void 0,this.emit("languageChanged",c),this.logger.log("languageChanged",c)):this.isLanguageChangingTo=void 0,n.resolve((...u)=>this.t(...u)),r&&r(a,(...u)=>this.t(...u))},s=a=>{!t&&!a&&this.services.languageDetector&&(a=[]);const c=x(a)?a:a&&a[0],u=this.store.hasLanguageSomeTranslations(c)?c:this.services.languageUtils.getBestMatchFromCodes(x(a)?[a]:a);u&&(this.language||o(u),this.translator.language||this.translator.changeLanguage(u),this.services.languageDetector?.cacheUserLanguage?.(u)),this.loadResources(u,d=>{i(d,u)})};return!t&&this.services.languageDetector&&!this.services.languageDetector.async?s(this.services.languageDetector.detect()):!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(s):this.services.languageDetector.detect(s):s(t),n}getFixedT(t,r,n){const o=(i,s,...a)=>{let c;typeof s!="object"?c=this.options.overloadTranslationOptionHandler([i,s].concat(a)):c={...s},c.lng=c.lng||o.lng,c.lngs=c.lngs||o.lngs,c.ns=c.ns||o.ns,c.keyPrefix!==""&&(c.keyPrefix=c.keyPrefix||n||o.keyPrefix);const u={...this.options,...c};typeof c.keyPrefix=="function"&&(c.keyPrefix=je(c.keyPrefix,u));const d=this.options.keySeparator||".";let l;return c.keyPrefix&&Array.isArray(i)?l=i.map(f=>(typeof f=="function"&&(f=je(f,u)),`${c.keyPrefix}${d}${f}`)):(typeof i=="function"&&(i=je(i,u)),l=c.keyPrefix?`${c.keyPrefix}${d}${i}`:i),this.t(l,c)};return x(t)?o.lng=t:o.lngs=t,o.ns=r,o.keyPrefix=n,o}t(...t){return this.translator?.translate(...t)}exists(...t){return this.translator?.exists(...t)}setDefaultNamespace(t){this.options.defaultNS=t}hasLoadedNamespace(t,r={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const n=r.lng||this.resolvedLanguage||this.languages[0],o=this.options?this.options.fallbackLng:!1,i=this.languages[this.languages.length-1];if(n.toLowerCase()==="cimode")return!0;const s=(a,c)=>{const u=this.services.backendConnector.state[`${a}|${c}`];return u===-1||u===0||u===2};if(r.precheck){const a=r.precheck(this,s);if(a!==void 0)return a}return!!(this.hasResourceBundle(n,t)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||s(n,t)&&(!o||s(i,t)))}loadNamespaces(t,r){const n=Ke();return this.options.ns?(x(t)&&(t=[t]),t.forEach(o=>{this.options.ns.indexOf(o)<0&&this.options.ns.push(o)}),this.loadResources(o=>{n.resolve(),r&&r(o)}),n):(r&&r(),Promise.resolve())}loadLanguages(t,r){const n=Ke();x(t)&&(t=[t]);const o=this.options.preload||[],i=t.filter(s=>o.indexOf(s)<0&&this.services.languageUtils.isSupportedCode(s));return i.length?(this.options.preload=o.concat(i),this.loadResources(s=>{n.resolve(),r&&r(s)}),n):(r&&r(),Promise.resolve())}dir(t){if(t||(t=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language)),!t)return"rtl";try{const o=new Intl.Locale(t);if(o&&o.getTextInfo){const i=o.getTextInfo();if(i&&i.direction)return i.direction}}catch{}const r=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],n=this.services?.languageUtils||new sn(zt());return t.toLowerCase().indexOf("-latn")>1?"ltr":r.indexOf(n.getLanguagePartFromCode(t))>-1||t.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(t={},r){const n=new ut(t,r);return n.createInstance=ut.createInstance,n}cloneInstance(t={},r=mt){const n=t.forkResourceStore;n&&delete t.forkResourceStore;const o={...this.options,...t,isClone:!0},i=new ut(o);if((t.debug!==void 0||t.prefix!==void 0)&&(i.logger=i.logger.clone(t)),["store","services","language"].forEach(a=>{i[a]=this[a]}),i.services={...this.services},i.services.utils={hasLoadedNamespace:i.hasLoadedNamespace.bind(i)},n){const a=Object.keys(this.store.data).reduce((c,u)=>(c[u]={...this.store.data[u]},c[u]=Object.keys(c[u]).reduce((d,l)=>(d[l]={...c[u][l]},d),c[u]),c),{});i.store=new tn(a,o),i.services.resourceStore=i.store}if(t.interpolation){const c={...zt().interpolation,...this.options.interpolation,...t.interpolation},u={...o,interpolation:c};i.services.interpolator=new dn(u)}return i.translator=new Ft(i.services,o),i.translator.on("*",(a,...c)=>{i.emit(a,...c)}),i.init(o,r),i.translator.options=o,i.translator.backendConnector.services.utils={hasLoadedNamespace:i.hasLoadedNamespace.bind(i)},i}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const ie=ut.createInstance(),Ui=ie.createInstance;ie.dir,ie.init,ie.loadResources,ie.reloadResources,ie.use,ie.changeLanguage,ie.getFixedT,ie.t,ie.exists,ie.setDefaultNamespace,ie.hasLoadedNamespace,ie.loadNamespaces,ie.loadLanguages;const mn={locale:"en-US",messages:{"operator.rows":"rows","operator.$sum":"Total {operandName}","operator.$avg":"Average {operandName}","operator.$min":"Minimum {operandName}","operator.$max":"Maximum {operandName}","operator.$count":"{operandName} count","operator.$count.rows":"Row count","operator.$countDistinct":"Distinct {operandName} count","operator.$add":"{inputNames}","operator.$add.empty":"Sum of {operandName}","operator.$subtract":"{input0} minus {input1}","operator.$subtract.fallback":"{operandName} difference","operator.$multiply":"{inputNames}","operator.$multiply.empty":"Product of {operandName}","operator.$divide":"{input0} divided by {input1}","operator.$divide.fallback":"{operandName} ratio","operator.$concat":"Combined {inputNames}","operator.$concat.empty":"Combined {operandName}","operator.$abs":"Absolute {operandName}","operator.$substring":"{operandName} substring","operator.$case":"{operandName} category","operator.$constant":"Constant","operator.$sql":"Calculated value","operator.$rowNumber":"Row number","operator.$rank":"{operandName} rank","operator.$accumulate":"Cumulative {operandName}","operator.$hierarchyLevel":"{operandName}{levelSuffix} level","operator.$least":"Least of {inputNames}","operator.$greatest":"Greatest of {inputNames}","operator.$dateBucket":"{operandName} by {granularity}","operator.$periodBoundary.start":"{operandName} at period start","operator.$periodBoundary.end":"{operandName} at period end","operator.$periodValue.start":"{operandName} at period start","operator.$periodValue.end":"{operandName} at period end","operator.$periodShift":"{operandName} {comparison} baseline","operator.$periodGrowth":"{operandName} {comparison} growth","operator.$periodDifference":"{operandName} {comparison} difference","operator.$averagePerPeriod":"Average {operandName} per {granularity}","operator.$newly":"New {operandName}","operator.$shareOfTotal":"{operandName} share of total","component.numerator":"{outputName} numerator","component.denominator":"{outputName} denominator","component.current":"{outputName} current","component.previous":"{outputName} previous","component.start":"{outputName} start","component.end":"{outputName} end","period.comparison":"period-over-period","period.current":"current-period","period.yearOverYear":"year-over-year","period.monthOverMonth":"month-over-month","period.weekOverWeek":"week-over-week","time.granularity.second":"second","time.granularity.minute":"minute","time.granularity.hour":"hour","time.granularity.day":"day","time.granularity.week":"week","time.granularity.month":"month","time.granularity.quarter":"quarter","time.granularity.year":"year","time.granularity.period":"period","error.PRED_PROPERTY_REQUIRED.$shareOfTotal":"$shareOfTotal requires a property","sql.timeWatermark":"Resolve time watermark to keep year-over-year and period-over-period comparison ranges consistent","sql.entityExpansion":"Expand entities to obtain more information","sql.computation":"Numeric computation","sql.semanticResolution":"Semantic resolution"}},yn={locale:"zh-CN",messages:{"operator.rows":"\u6570\u636E\u884C","operator.$sum":"\u603B{operandName}","operator.$avg":"\u5E73\u5747{operandName}","operator.$min":"{operandName}\u6700\u5C0F\u503C","operator.$max":"{operandName}\u6700\u5927\u503C","operator.$count":"{operandName}\u6570\u91CF","operator.$count.rows":"\u884C\u6570","operator.$countDistinct":"{operandName}\u53BB\u91CD\u8BA1\u6570","operator.$add":"{inputNames}","operator.$add.empty":"{operandName}\u6C42\u548C","operator.$subtract":"{input0}\u51CF\u53BB{input1}","operator.$subtract.fallback":"{operandName}\u5DEE\u503C","operator.$multiply":"{inputNames}","operator.$multiply.empty":"{operandName}\u4E58\u79EF","operator.$divide":"{input0}\u9664\u4EE5{input1}","operator.$divide.fallback":"{operandName}\u6BD4\u503C","operator.$concat":"{inputNames}\u62FC\u63A5\u503C","operator.$concat.empty":"{operandName}\u62FC\u63A5\u503C","operator.$abs":"{operandName}\u7EDD\u5BF9\u503C","operator.$substring":"{operandName}\u5B50\u4E32","operator.$case":"{operandName}\u5206\u7C7B","operator.$constant":"\u5E38\u91CF","operator.$sql":"\u8BA1\u7B97\u503C","operator.$rowNumber":"\u884C\u53F7","operator.$rank":"{operandName}\u6392\u540D","operator.$accumulate":"{operandName}\u7D2F\u8BA1\u503C","operator.$hierarchyLevel":"{operandName}{level}\u5C42\u7EA7","operator.$least":"{inputNames}\u4E2D\u7684\u6700\u65E9\u503C","operator.$greatest":"{inputNames}\u4E2D\u7684\u6700\u665A\u503C","operator.$dateBucket":"{operandName}\uFF08\u6309{granularity}\uFF09","operator.$periodBoundary.start":"{operandName}\u671F\u521D","operator.$periodBoundary.end":"{operandName}\u671F\u672B","operator.$periodValue.start":"{operandName}\u671F\u521D\u503C","operator.$periodValue.end":"{operandName}\u671F\u672B\u503C","operator.$periodShift":"{operandName}{comparison}\u57FA\u671F\u503C","operator.$periodGrowth":"{operandName}{comparison}\u589E\u957F\u7387","operator.$periodDifference":"{operandName}{comparison}\u5DEE\u503C","operator.$averagePerPeriod":"{operandName}{granularity}\u5747\u503C","operator.$newly":"\u65B0\u589E{operandName}","operator.$shareOfTotal":"{operandName}\u5360\u6BD4","component.numerator":"{outputName}\u5206\u5B50","component.denominator":"{outputName}\u5206\u6BCD","component.current":"{outputName}\u672C\u671F","component.previous":"{outputName}\u4E0A\u671F","component.start":"{outputName}\u5F00\u59CB","component.end":"{outputName}\u7ED3\u675F","period.comparison":"\u540C\u671F","period.current":"\u672C\u671F","period.yearOverYear":"\u540C\u6BD4","period.monthOverMonth":"\u73AF\u6BD4","period.weekOverWeek":"\u5468\u73AF\u6BD4","time.granularity.second":"\u79D2","time.granularity.minute":"\u5206\u949F","time.granularity.hour":"\u5C0F\u65F6","time.granularity.day":"\u65E5","time.granularity.week":"\u5468","time.granularity.month":"\u6708","time.granularity.quarter":"\u5B63\u5EA6","time.granularity.year":"\u5E74","time.granularity.period":"\u5468\u671F","error.PRED_PROPERTY_REQUIRED.$shareOfTotal":"$shareOfTotal\u9700\u8981pred\u53C2\u6570","sql.timeWatermark":"\u8BA1\u7B97\u6570\u636E\u6700\u540E\u65F6\u95F4\uFF0C\u4ECE\u800C\u4FDD\u8BC1\u540C\u6BD4\u3001\u73AF\u6BD4\u7684\u6BD4\u8F83\u533A\u95F4\u4E00\u81F4","sql.entityExpansion":"\u5B9E\u4F53\u5C55\u5F00\uFF0C\u7528\u4E8E\u83B7\u5F97\u66F4\u591A\u4FE1\u606F","sql.computation":"\u6570\u503C\u8BA1\u7B97","sql.semanticResolution":"\u8BED\u4E49\u89E3\u6790"}},ji=[yn,mn],Xe=e=>e.trim().toLowerCase(),ki=e=>e?"locale"in e?[e]:e:[],Mi=e=>{if(typeof e!="object"||e===null||Array.isArray(e))return!1;const t=e;return typeof t.locale=="string"&&t.locale.trim().length>0&&typeof t.messages=="object"&&t.messages!==null&&!Array.isArray(t.messages)};class Kt{definitions=new Map;i18n;constructor(t){this.i18n=Ui(),this.i18n.init({initAsync:!1,fallbackLng:"zh-CN",defaultNS:"translation",keySeparator:!1,showSupportNotice:!1,interpolation:{escapeValue:!1,prefix:"{",suffix:"}"}}),this.register(ji),this.register(t)}register(t){for(const r of ki(t)){const n=r;if(!Mi(n))throw new TypeError("Locale definition must have a non-empty locale");const o=n,i=this.definitions.get(Xe(o.locale)),s={locale:o.locale,messages:Object.freeze({...i?.messages,...o.messages})};this.definitions.set(Xe(o.locale),s),this.i18n.addResourceBundle(o.locale,"translation",s.messages,!0,!0)}return this}resolve(t="zh-CN"){const r=this.definitions.get(Xe(t));if(r)return r;const n=Xe(t).split("-")[0];return[...this.definitions.entries()].find(([i])=>i.split("-")[0]===n)?.[1]??this.definitions.get("zh-cn")}has(t){return this.definitions.has(Xe(t))}translate(t,r,n,o){const i=this.resolve(t);return this.i18n.t(r,{lng:i.locale,defaultValue:n??r,...o??{}})}translator(t="zh-CN"){return(r,n,o)=>this.translate(t,r,n,o)}}const yt=e=>new Kt(e),ht=new Kt;class p extends Error{code;details;constructor(t,r,n){super(r),this.code=t,this.details=n,this.name="SemanticDBError"}localizedMessage(t="zh-CN",r=ht){if(this.code==="PRED_PROPERTY_REQUIRED"&&this.message==="$shareOfTotal requires a property")return r.translate(t,"error.PRED_PROPERTY_REQUIRED.$shareOfTotal",this.message,this.details);if(this.code==="PROPERTY_NOT_FOUND"&&t.toLowerCase().startsWith("en")){const n=this.details?.schemaId,o=this.details?.schemaName,i=this.details?.property,s=this.details?.propertyName;if(typeof n=="string"&&typeof o=="string"&&typeof i=="string"&&typeof s=="string")return`Property not found in Schema: ${o}(${n}): ${s}`}return this.message}}J.extend(dt),J.extend(pt);const xi=new Set(["year","quarter","month","week"]),Jt=e=>e.format("YYYY-MM-DD HH:mm:ss"),Zt=(e,t)=>e.operator&&t(e.operator).kind==="aggregate"?!0:(e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred)?Zt(e.pred,t):!1)||Array.isArray(e.pred)&&e.pred.some(r=>typeof r!="string"&&Zt(r,t)),gt=(e,t,r)=>{if(e.kind==="window"||e.kind==="cumulative")throw new p("ACCUMULATE_WINDOW_UNSUPPORTED","$accumulate cannot contain another window expression");if(e.kind==="ordinal-decode")return{...e,input:gt(e.input,t,r)};if(e.kind==="ordinal-encode")return{kind:"cumulative",function:"sum",input:e,...r};if(e.kind!=="operator")return{kind:"cumulative",function:"sum",input:e,...r};const n=t.getOperator(e.operator);if(n.kind==="component")throw new p("ACCUMULATE_OPERATOR_UNSUPPORTED",`$accumulate cannot contain component operator ${e.operator}`);if(n.kind==="aggregate"){if(e.operator==="$avg"){const s={...e,operator:"$sum"},a={...e,operator:"$count"};return{kind:"operator",operator:"$divide",args:{},inputs:[{kind:"cumulative",function:"sum",input:s,...r},{kind:"cumulative",function:"sum",input:a,...r}]}}const i={$sum:"sum",$count:"sum",$min:"min",$max:"max"}[e.operator];if(!i)throw new p("ACCUMULATE_OPERATOR_UNSUPPORTED",`Aggregate operator ${e.operator} does not declare cumulative semantics`);return{kind:"cumulative",function:i,input:e,...r}}if(n.kind!=="scalar")throw new p("ACCUMULATE_OPERATOR_UNSUPPORTED",`$accumulate cannot contain ${e.operator}`);return{...e,...e.input?{input:gt(e.input,t,r)}:{},...e.inputs?{inputs:e.inputs.map(o=>gt(o,t,r))}:{}}},Vi=e=>{if(!e.input||e.inputs.length>0||e.pred.query)throw new p("INVALID_ACCUMULATE_INPUT","$accumulate requires exactly one nested pred and does not accept pred.query");if(e.inputProperty?.comparable&&e.input.kind!=="ordinal-decode")throw new p("ACCUMULATE_COMPARABLE_OPERATOR_REQUIRED","$accumulate over a comparable category requires an explicit $min or $max metric");const t=e.args.partitionBy??[],r=e.args.orderBy;if(!Array.isArray(t)||t.some(o=>typeof o!="string"))throw new p("INVALID_ACCUMULATE_ARGS","$accumulate partitionBy must be an array of groupby names");if(!Array.isArray(r)||r.length===0)throw new p("INVALID_ACCUMULATE_ARGS","$accumulate requires a non-empty args.orderBy array");const n=r.map(o=>{if(typeof o!="object"||o===null||Array.isArray(o))throw new p("INVALID_ACCUMULATE_ARGS","$accumulate orderBy items require pred and optional direction");const{pred:i,direction:s="asc",...a}=o;if(typeof i!="string"||s!=="asc"&&s!=="desc"||Object.keys(a).length>0)throw new p("INVALID_ACCUMULATE_ARGS","$accumulate orderBy items require only a string pred and asc/desc direction");return{expression:e.resolveKey(i),direction:s==="asc"?"ASC":"DESC"}});return gt(e.input,e,{partitionBy:t.map(o=>e.resolveKey(String(o))),orderBy:n})},vi=e=>{if(e.groupByNames.length===0)return;if(typeof e.pred.pred!="object"||Array.isArray(e.pred.pred)||!Zt(e.pred.pred,e.getOperator))throw new p("ACCUMULATE_AGGREGATE_REQUIRED","$accumulate over a grouped physical relation requires an aggregate expression");const t=e.pred.args?.partitionBy,r=e.pred.args?.orderBy;if(t!==void 0&&!Array.isArray(t)||!Array.isArray(r)||r.length===0||r.some(i=>typeof i!="object"||i===null||Array.isArray(i)||typeof i.pred!="string"||Object.keys(i).some(s=>s!=="pred"&&s!=="direction")||i.direction!==void 0&&i.direction!=="asc"&&i.direction!=="desc"))return;const n=[...t??[],...r.map(i=>i.pred)];if(n.some(i=>typeof i!="string"))return;const o=n.map(i=>e.resolveGroupName(String(i)));if(o.length!==e.groupByNames.length||new Set(o).size!==e.groupByNames.length||e.groupByNames.some(i=>!o.includes(i)))throw new p("INCOMPLETE_ACCUMULATE_DIMENSIONS","$accumulate partitionBy and orderBy must cover every groupby item exactly once",{expected:e.groupByNames,received:o})},Bi=(e,t,r)=>{if(e.from||e.having)throw new p("ACCUMULATE_PERIOD_UNSUPPORTED","$accumulate args.period currently requires a physical LogicForm without from or having");if((e.preds?.length??0)!==t.length)throw new p("ACCUMULATE_PERIOD_UNSUPPORTED","$accumulate args.period cannot currently be mixed with non-period projections");const n=e.query&&Object.entries(e.query).find(([,h])=>{if(typeof h!="object"||h===null||Array.isArray(h))return!1;const S=h;return typeof S.$gte=="string"&&typeof S.$lte=="string"});if(!n)throw new p("ACCUMULATE_PERIOD_QUERY_REQUIRED","$accumulate args.period requires one bounded date query identifying the target period");const[o,i]=n,s=i,a=J(String(s.$gte)),c=J(String(s.$lte));if(!a.isValid()||!c.isValid())throw new p("ACCUMULATE_PERIOD_QUERY_REQUIRED","Target date range is invalid");const u=t.map(h=>{if(!h.name)throw new p("MISSING_PRED_NAME","$accumulate args.period requires normalized names");return h.name}),d=r==="week"?a.startOf("isoWeek"):a.startOf(r),l={...e.query,[o]:{...s,$gte:Jt(d)}},f=new Set([...(e.groupby??[]).map(({name:h})=>h),...(e.preds??[]).map(({name:h})=>h)]),m=h=>{let S=h;for(;f.has(S);)S=`_${S}`;return f.add(S),S},y=m("__accumulate_period"),g=t.map((h,S)=>m(`__accumulate_metric_${S}`)),_=(e.groupby??[]).map(({name:h})=>String(h)),R=r==="year"||r==="quarter"?"month":"day",$={version:e.version,...e.schema?{schema:e.schema}:{},query:l,groupby:[...e.groupby??[],{operator:"$dateBucket",pred:o,args:{granularity:R},name:y}],preds:t.map((h,S)=>({...h.pred,name:g[S]??`__accumulate_metric_${S}`}))},E={version:e.version,from:$,preds:[..._.map(h=>({pred:h,name:h})),{pred:y,name:y},...t.map((h,S)=>({operator:"$accumulate",pred:g[S]??`__accumulate_metric_${S}`,args:{partitionBy:_,orderBy:[{pred:y,direction:"asc"}]},name:u[S]??`accumulate_${S}`}))]};return{version:e.version,from:E,query:{[y]:{$gte:Jt(a),$lte:Jt(c)}},preds:[..._.map(h=>({pred:h,name:h})),...u.map(h=>({pred:h,name:h}))],...e.sort?{sort:e.sort}:{},...e.limit!==void 0?{limit:e.limit}:{},...e.page!==void 0?{page:e.page}:{},...e.output?{output:e.output}:{},...e.representation?{representation:e.representation}:{}}},Fi={name:"$accumulate",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`Cumulative ${e}`:`${e}\u7D2F\u8BA1\u503C`,kind:"logical",normalizePred({pred:e}){const t=e.args?.period;if(t!==void 0&&(typeof t!="string"||!xi.has(t)))throw new p("INVALID_ACCUMULATE_ARGS","$accumulate args.period must be year, quarter, month, or week");if(t!==void 0&&(e.args?.partitionBy!==void 0||e.args?.orderBy!==void 0))throw new p("INVALID_ACCUMULATE_ARGS","$accumulate args.period cannot be combined with partitionBy or orderBy");return e},planExpression:Vi,validatePlan:vi,rewriteLogicform({logicform:e,schema:t}){const r=(e.preds??[]).filter(s=>s.operator==="$accumulate"&&s.args?.period!==void 0);if(r.length===0)return;const n=r[0]?.args?.period;if(r.some(s=>s.args?.period!==n))throw new p("ACCUMULATE_PERIOD_UNSUPPORTED","All $accumulate args.period projections in one LogicForm must use the same period");const o=new Set(Object.keys(e.query??{}));if(t.properties.filter(s=>s.primal_type==="date"&&o.has(s.name)).length!==1)throw new p("ACCUMULATE_PERIOD_QUERY_REQUIRED","$accumulate args.period requires exactly one queried date property");return Bi(e,r,n)},getOutputProperty({name:e,inputProperty:t}){return t?{...t,name:e,isArray:!1}:{name:e,type:"number",primal_type:"number",isArray:!1}}},Yi={name:"$abs",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`Absolute ${e}`:`${e}\u7EDD\u5BF9\u503C`,kind:"scalar",toSQL({expression:e}){if(!e)throw new p("PRED_PROPERTY_REQUIRED","$abs requires a pred");return`ABS(${e})`},getOutputProperty({name:e,inputProperty:t}){if(!t)throw new p("PRED_PROPERTY_REQUIRED","$abs requires a pred");return{...t,name:e,isArray:!1}}},ke=(e,t,r,n=r)=>{const o=t.expressions??[];if(o.length<r||o.length>n)throw new p("INVALID_OPERATOR_COMPONENTS",`${e} requires ${r===n?String(r):`${r}-${n}`} pred inputs`);return o},$t=e=>({name:e,type:"number",primal_type:"number",isArray:!1}),Qi={name:"$add",defaultName:({operandName:e,inputNames:t,locale:r})=>r.toLowerCase().startsWith("en")?t.length>0?t.join(" plus "):`Sum of ${e}`:t.length>0?t.join("\u52A0"):`${e}\u6C42\u548C`,kind:"scalar",requiresProperty:!1,toSQL(e){return`(${ke("$add",e,2,Number.POSITIVE_INFINITY).join(" + ")})`},getOutputProperty({name:e,inputProperties:t}){const r=t?.[0];return r?{...r,name:e,isArray:!1}:$t(e)}},Y=e=>structuredClone(e),Hi=(e,t)=>{const r=t[e];if(!r)throw new p("SCHEMA_NOT_FOUND",`Schema not found: ${e}`,{schemaId:e});if("_id"in r||"_sid"in r)throw new p("LEGACY_SCHEMA_ID_NOT_ALLOWED","Schema must use id instead of _id; _sid is not supported",{schemaId:e});if("sid"in r)throw new p("SCHEMA_SID_NOT_ALLOWED","Schema must not declare sid",{schemaId:e});if(r.id!==e)throw new p("SCHEMA_ID_MISMATCH",`Schema registry key ${e} does not match schema.id ${r.id}`,{registryKey:e,schemaId:r.id});return r},Gi=(e,t)=>{const r=e.properties.find(n=>n.id===t)??e.properties.find(n=>n.name===t);if(!r)throw new p("PROPERTY_NOT_FOUND",`Property not found in ${e.id}: ${t}`,{schemaId:e.id,property:t});return r},Wi=e=>{const t=e.properties.flatMap(r=>[[r.name,r.id],[r.id,r.id]]);return Object.freeze(Object.fromEntries(t))},hn=(e,t)=>e.properties.some(r=>r!==t&&r.id===t.name)?t.id:t.name,zi=(e,t)=>e.properties.flatMap(r=>[...t.startsWith(`${r.id}_`)?[{property:r,prefix:r.id}]:[],...r.name!==r.id&&t.startsWith(`${r.name}_`)?[{property:r,prefix:r.name}]:[]]).sort((r,n)=>n.prefix.length-r.prefix.length||(n.prefix===n.property.id?1:0)-(r.prefix===r.property.id?1:0)),z=(e,t,r)=>{const n=e.properties.find(o=>o.id===t)??e.properties.find(o=>o.name===t);if(n)return{canonicalName:hn(e,n),canonicalId:n.id,schema:e,property:n,relations:[]};for(const{property:o,prefix:i}of zi(e,t)){if(o.primal_type!=="entity"&&o.primal_type!=="object"||!o.ref)continue;if(!r)throw new p("SCHEMA_RESOLVER_REQUIRED",`Resolving property path ${t} requires a Schema resolver`);const s=r(o.ref),a=z(s,t.slice(i.length+1),r);return{canonicalName:`${hn(e,o)}_${a.canonicalName}`,canonicalId:`${o.id}_${a.canonicalId}`,schema:a.schema,property:a.property,relations:[{sourceSchema:e,property:o,targetSchema:s},...a.relations]}}throw new p("PROPERTY_NOT_FOUND",`\u5728 Schema\uFF1A${e.name}(${e.id})\u4E2D\u672A\u627E\u5230\u5C5E\u6027: ${t}`,{schemaId:e.id,schemaName:e.name,property:t,propertyName:t})},Xt=(e,t)=>e.name===t||e.id===t,Ki=(e,t,r)=>{const n=new Set,o=[e];for(;o.length>0;){const i=o.shift();if(!i||n.has(i.name))continue;n.add(i.name);const s=[...i.hierarchy?.up?r.properties.filter(a=>Xt(a,i.hierarchy?.up??"")):[],...r.properties.filter(a=>a.hierarchy?.down!==void 0&&Xt(i,a.hierarchy.down))];if(s.some(a=>Xt(t,a.name)))return!0;o.push(...s)}return!1},gn=(e,t,r,n)=>{if(e.operator||typeof e.pred!="string"||t.length===0)return!1;let o;try{o=z(r,e.pred,n)}catch{return!1}return o.property.isArray||o.property.primal_type==="entity"||o.property.primal_type==="object"||o.relations.some(({property:i})=>i.isArray)?!1:t.some(i=>{if(i.operator||typeof i.pred!="string")return!1;let s;try{s=z(r,i.pred,n)}catch{return!1}if(s.property.isArray)return!1;if(s.relations.length===0&&o.relations.length===0)return Ki(s.property,o.property,r);if(s.relations.length!==0||o.relations.length===0)return!1;const[a]=o.relations;return s.property.name===a?.property.name})},Ji=({source:e,properties:t})=>{const r=e.hierarchy;if(!Array.isArray(r))return r===void 0?{}:{hierarchy:r};let n=e.hierarchy_property;if(typeof n!="string"||n.length===0){const s=t.filter(({type:c})=>c==="ID");if(s.length!==1)throw new p("LEGACY_HIERARCHY_ID_PROPERTY_REQUIRED","Legacy Schema hierarchy without hierarchy_property must contain exactly one ID property",{idPropertyCount:s.length});const a=s[0];n=a?.id??a?.name}const o=r.map(s=>{if(typeof s!="object"||s===null||Array.isArray(s))return;const a=s;if(!(typeof a.name!="string"||!Number.isInteger(a.code_length)))return{name:a.name,...Array.isArray(a.syno)?{syno:a.syno}:{},codeLength:a.code_length}});if(o.some(s=>s===void 0))return{};const i=r[0];return{hierarchy:{property:n,storage:i?.use_full_length===!0?"zero-padded":"compact",levels:o}}},Zi=e=>{if(!e.hierarchy)return;const t=e.properties.find(({name:r})=>r===e.hierarchy?.property);if(!t)throw new p("HIERARCHY_PROPERTY_NOT_FOUND",`Schema hierarchy.property does not exist: ${e.hierarchy.property}`,{schemaId:e.id,property:e.hierarchy.property});return t},Xi=(e,t,r)=>{const n=z(e,t,r);if(n.property.primal_type!=="entity"&&n.property.primal_type!=="object")return{schema:n.schema,reference:n.canonicalName,relation:!1};if(n.property.isArray)throw new p("ARRAY_HIERARCHY_RELATION_UNSUPPORTED",`$hierarchyLevel cannot group an array relation: ${n.canonicalName}`);if(!n.property.ref||!r)throw new p("SCHEMA_RESOLVER_REQUIRED",`$hierarchyLevel requires a Schema resolver for relation ${n.canonicalName}`);return{schema:r(n.property.ref),reference:n.canonicalName,relation:!0}},es={name:"$hierarchyLevel",defaultName:({operandName:e,args:t,locale:r})=>{const n=typeof t.level=="string"?t.level:"";return r.toLowerCase().startsWith("en")?`${e}${n?` ${n}`:""} level`:`${e}${n}\u5C42\u7EA7`},kind:"scalar",planInput({reference:e,args:t,schema:r,resolveSchema:n}){const o=Object.keys(t).filter(m=>m!=="level");if(o.length>0||typeof t.level!="string"||t.level.length===0)throw new p("INVALID_HIERARCHY_LEVEL_ARGS","$hierarchyLevel args must contain exactly one non-empty level string",{unsupportedArgs:o});const i=Xi(r,e,n),s=i.schema.hierarchy;if(!s)throw new p("SCHEMA_HIERARCHY_REQUIRED",`Schema ${i.schema.id} does not declare hierarchy`,{schemaId:i.schema.id});const a=i.schema.properties.find(({name:m})=>m===s.property);if(!a)throw new p("HIERARCHY_PROPERTY_NOT_FOUND",`Schema hierarchy.property does not exist: ${s.property}`);if(!i.relation&&a.name!==z(r,e,n).property.name)throw new p("HIERARCHY_PROPERTY_REQUIRED",`$hierarchyLevel pred must be an object relation or hierarchy property ${a.name}`);let c=0;const u=s.levels.find(m=>(c+=m.codeLength,m.name===t.level||m.syno?.includes(t.level)));if(!u)throw new p("HIERARCHY_LEVEL_NOT_FOUND",`Schema ${i.schema.id} does not declare hierarchy level: ${t.level}`,{schemaId:i.schema.id,level:t.level});const d=s.levels.reduce((m,y)=>m+y.codeLength,0),l=i.schema.properties.filter(({type:m})=>m==="ID");return{reference:i.relation&&l.length===1&&l[0]?.name===a.name?i.reference:i.relation?`${i.reference}_${a.name}`:i.reference,args:{level:u.name,codeLength:c,totalLength:d,storage:s.storage}}},toSQL({expression:e,args:t,sql:r}){if(!e)throw new Error("$hierarchyLevel requires a hierarchy pred");const n=t.codeLength,o=t.totalLength,i=t.storage;if(!Number.isInteger(n)||!Number.isInteger(o)||Number(n)<=0||Number(o)<Number(n)||i!=="compact"&&i!=="zero-padded")throw new p("INVALID_HIERARCHY_LEVEL_PLAN","$hierarchyLevel must be resolved by the planner before SQL compilation");const s=r.substring(e,1,Number(n)),a=Number(o)-Number(n);return i==="zero-padded"&&a>0?r.concat([s,r.value("0".repeat(a))]):s},getOutputProperty({name:e}){return{name:e,type:"string",primal_type:"string",isArray:!1}}},ts={keys:["hierarchy"],resolve(e,t){if("hierarchy_property"in e)throw new p("LEGACY_HIERARCHY_PROPERTY_NOT_ALLOWED","Schema hierarchy must declare hierarchy.property instead of hierarchy_property");const r=e.hierarchy;if(r===void 0)return{};if(typeof r!="object"||r===null||Array.isArray(r))throw new p("INVALID_HIERARCHY","Schema hierarchy must be an object containing property, levels, and optional storage");const n=r,o=Object.keys(n).filter(f=>f!=="property"&&f!=="storage"&&f!=="levels");if(o.length>0)throw new p("UNSUPPORTED_HIERARCHY_FIELD","Schema hierarchy only supports property, storage, and levels",{unsupportedKeys:o});const i=n.property===void 0?(()=>{const f=t.filter(m=>m.type==="ID");if(f.length!==1)throw new p("HIERARCHY_ID_PROPERTY_REQUIRED","Schema hierarchy.property may be omitted only when the Schema has exactly one ID Property",{idPropertyCount:f.length});return f[0]})():void 0;if(n.property!==void 0&&(typeof n.property!="string"||n.property.length===0))throw new p("HIERARCHY_PROPERTY_REQUIRED","Schema hierarchy.property must be a non-empty property name or id when provided");const s=i??t.find(f=>f.name===n.property||f.id===n.property);if(!s)throw new p("HIERARCHY_PROPERTY_NOT_FOUND",`Schema hierarchy.property does not exist: ${n.property}`,{property:n.property});if(s.primal_type!=="string")throw new p("INVALID_HIERARCHY_PROPERTY",`Hierarchy property ${s.name} must have primal_type string`,{property:s.name,primal_type:s.primal_type});const a=n.storage??"compact";if(a!=="compact"&&a!=="zero-padded")throw new p("INVALID_HIERARCHY_STORAGE","Schema hierarchy.storage must be compact or zero-padded");if(!Array.isArray(n.levels)||n.levels.length===0)throw new p("HIERARCHY_LEVELS_REQUIRED","Schema hierarchy.levels must be a non-empty array");const c=new Set,u=new Set,d=n.levels.map((f,m)=>{if(typeof f!="object"||f===null||Array.isArray(f))throw new p("INVALID_HIERARCHY_LEVEL",`Hierarchy level ${m} must be an object`);const y=f,g=Object.keys(y).filter(R=>R!=="name"&&R!=="syno"&&R!=="codeLength");if(g.length>0)throw new p("UNSUPPORTED_HIERARCHY_LEVEL_FIELD",`Hierarchy level ${m} only supports name, syno, and codeLength`,{unsupportedKeys:g});if(typeof y.name!="string"||y.name.length===0)throw new p("INVALID_HIERARCHY_LEVEL",`Hierarchy level ${m} name must not be empty`);if(c.has(y.name)||u.has(y.name))throw new p("DUPLICATE_HIERARCHY_LEVEL",`Duplicate hierarchy level name: ${y.name}`);if(!Number.isInteger(y.codeLength)||Number(y.codeLength)<=0)throw new p("INVALID_HIERARCHY_CODE_LENGTH",`Hierarchy level ${y.name} codeLength must be a positive integer`);if(y.syno!==void 0&&(!Array.isArray(y.syno)||y.syno.some(R=>typeof R!="string"||R.length===0)))throw new p("INVALID_HIERARCHY_SYNONYMS",`Hierarchy level ${y.name} syno must contain only non-empty strings`);const _=y.syno??[];for(const R of _){if(R===y.name||c.has(R)||u.has(R))throw new p("DUPLICATE_HIERARCHY_LEVEL",`Duplicate hierarchy level alias: ${R}`);u.add(R)}return c.add(y.name),{name:y.name,..._.length>0?{syno:[..._]}:{},codeLength:Number(y.codeLength)}});return{hierarchy:{property:s.name,storage:a,levels:d}}}},rs=Object.freeze({name:"hierarchy",schemaMetadata:ts,legacySchemaKeys:["hierarchy_property"],normalizeLegacySchema:Ji,resolveEntityFilterProperty:Zi,operators:[es]}),$n=Object.freeze([rs]),wt=(e=[])=>{const t=[...$n,...e],r=new Set,n=new Set,o=new Set;for(const i of t){if(!i.name)throw new p("INVALID_PLUGIN","Plugin name must not be empty");if(r.has(i.name))throw new p("PLUGIN_ALREADY_REGISTERED",`Plugin is already registered: ${i.name}`,{plugin:i.name});r.add(i.name);for(const s of[...i.schemaMetadata?.keys??[],...i.legacySchemaKeys??[]]){if(!s)throw new p("INVALID_PLUGIN_METADATA_KEY","Plugin metadata key must not be empty");if(n.has(s))throw new p("PLUGIN_METADATA_KEY_ALREADY_REGISTERED",`Plugin Schema metadata key is already registered: ${s}`,{key:s,plugin:i.name});n.add(s)}for(const s of i.operators??[]){if(o.has(s.name))throw new p("PLUGIN_OPERATOR_ALREADY_REGISTERED",`Plugin Operator is already registered: ${s.name}`,{operator:s.name,plugin:i.name});o.add(s.name)}}return Object.freeze(t)},er=e=>typeof e=="string"&&e.length>0&&e!=="placeholder"||typeof e=="number"&&Number.isSafeInteger(e),ns=e=>{const t=e.properties.filter(({type:r})=>r==="ID");if(t.length!==1)throw new p("ENTITY_ID_PROPERTY_REQUIRED",`Schema ${e.id} must contain exactly one ID property to use entity_id`,{schemaId:e.id,idPropertyCount:t.length});return t[0]},tr=(e,t=[])=>{for(const r of wt(t)){const n=r.resolveEntityFilterProperty?.(e);if(n)return n}return ns(e)},rr=e=>{if(e.name)return e.name;throw new p("MISSING_PRED_NAME","A normalized groupby PredItem must have a name")},nr=e=>typeof e.pred=="string"?e.pred:void 0,os=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),is={second:"\u79D2",minute:"\u5206\u949F",hour:"\u5C0F\u65F6",day:"\u65E5",week:"\u5468",month:"\u6708",quarter:"\u5B63\u5EA6",year:"\u5E74"},ss={year:"\u5E74",quarter:"\u5B63\u5EA6",month:"\u6708",week:"\u5468",day:"\u65E5",hour:"\u65F6",minute:"\u5206",second:"\u79D2"},or=(e,t,r)=>{const n=t.toLowerCase().startsWith("en"),o=e.time;if(!os(o))return r?.("period.comparison",n?"period-over-period":"\u540C\u671F")??(n?"period-over-period":"\u540C\u671F");if(typeof o.granularity=="string"&&typeof o.offset=="number"){if(o.offset===-1&&o.granularity==="year")return r?.("period.yearOverYear",n?"year-over-year":"\u540C\u6BD4")??(n?"year-over-year":"\u540C\u6BD4");if(o.offset===-1&&o.granularity==="month")return r?.("period.monthOverMonth",n?"month-over-month":"\u73AF\u6BD4")??(n?"month-over-month":"\u73AF\u6BD4");if(o.offset===-1&&o.granularity==="week")return r?.("period.weekOverWeek",n?"week-over-week":"\u5468\u73AF\u6BD4")??(n?"week-over-week":"\u5468\u73AF\u6BD4");if(o.offset===0)return r?.("period.current",n?"current-period":"\u672C\u671F")??(n?"current-period":"\u672C\u671F");const s=Math.abs(o.offset),a=o.offset<0?"before":"after";return n?`${s} ${o.granularity}${s===1?"":"s"} ${a}`:`\u8F83${a==="before"?"\u524D":"\u540E"}${s}${is[o.granularity]??"\u671F"}`}const i=Object.entries(o).map(([s,a])=>n?`${s} ${String(a)}`:`${String(a)}${ss[s]??s}`).join(n?", ":"");return n?`compared with ${i}`:`\u5BF9\u6BD4${i}`};J.extend(dt),J.extend(pt);const as=["second","minute","hour","day","week","month","quarter","year"],cs=new Set(as),ir=["year","quarter","month","week","day","hour","minute","second"],wn=e=>Object.prototype.toString.call(e)==="[object Object]",_e=e=>{throw new p("INVALID_PERIOD_SHIFT_ARGS",e)},us=e=>{const t=e.time;wn(t)||_e("$periodShift requires args.time");const r=t;if("granularity"in r||"offset"in r)return(typeof r.granularity!="string"||!cs.has(r.granularity)||!Number.isInteger(r.offset)||Object.keys(r).some(a=>a!=="granularity"&&a!=="offset"))&&_e("Relative period shift time requires only granularity and an integer offset"),r;const o=Object.entries(r);(o.length===0||o.some(([a,c])=>!ir.includes(a)||!Number.isInteger(c)))&&_e("Absolute period shift time requires integer calendar components"),typeof r.year!="number"&&_e("Absolute period shift time requires year");const i={quarter:[1,4],month:[1,12],week:[1,53],day:[1,31],hour:[0,23],minute:[0,59],second:[0,59]};for(const[a,[c,u]]of Object.entries(i)){const d=r[a];d!==void 0&&(Number(d)<c||Number(d)>u)&&_e(`Invalid absolute period shift ${a}: ${JSON.stringify(d)}`)}return["quarter","month","week"].filter(a=>a in r).length>1&&_e("Absolute period shift time cannot mix quarter, month, and week"),"day"in r&&!("month"in r)&&_e("Absolute period shift day requires month"),r},An=(e,t,r)=>t==="month"?e.month(r-1):t==="day"?e.date(r):t==="week"?e.isoWeek(r):t==="quarter"?e.quarter(r):e.set(t,r),ds=(e,t)=>{if("granularity"in t){const n=t.granularity==="week"?"week":t.granularity;return e.add(t.offset,n)}let r=e;for(const n of ir){const o=t[n];typeof o=="number"&&(r=An(r,n,o))}return r},sr=(e,t)=>e instanceof Date?t.toDate():typeof e!="string"?e:t.format(e.includes(":")?"YYYY-MM-DD HH:mm:ss":"YYYY-MM-DD"),ps=(e,t,r,n,o)=>(e.groupby??[]).filter(i=>{const s=nr(i);return s?z(t,s,r).property.primal_type==="date":!1}).map(i=>{const s=i.operator==="$dateBucket"?i.args?.granularity:void 0,a="granularity"in n?n.granularity:s??"day",c="granularity"in n?-n.offset:o.originalAnchor&&o.shiftedAnchor?o.originalAnchor.diff(o.shiftedAnchor,a):0;return{name:rr(i),granularity:a,offset:c}}),ar=(e,t,r)=>{if(Array.isArray(e))return e.map(i=>ar(i,t,r));if(wn(e))return Object.fromEntries(Object.entries(e).map(([i,s])=>[i,ar(s,t,r)]));if(!(e instanceof Date)&&typeof e!="string")return e;const n=J(e);if(!n.isValid())return e;const o=ds(n,t);return r.originalAnchor??=n,r.shiftedAnchor??=o,r.shiftedValues+=1,sr(e,o)},ls=(e,t,r,n,o)=>{const i=new Set,s=c=>Object.fromEntries(Object.entries(c).map(([u,d])=>{if((u==="$and"||u==="$or")&&Array.isArray(d))return[u,d.map(f=>s(f))];const l=z(t,u,r);return l.property.primal_type!=="date"?[u,d]:(i.add(l.canonicalName),[u,ar(d,n,o)])})),a=s(e);if(i.size===0||o.shiftedValues===0)throw new p("PERIOD_SHIFT_TIME_QUERY_REQUIRED","$periodShift requires a concrete date condition in the LogicForm query");if(i.size>1)throw new p("AMBIGUOUS_PERIOD_SHIFT_TIME","$periodShift query contains more than one date property",{properties:[...i]});return a},Te=e=>{const t=e.filter(r=>r!==void 0);if(t.length!==0)return t.length===1?t[0]:{$and:t}},Se=e=>[...e.query?[e.query]:[],...e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred)?Se(e.pred):[],...Array.isArray(e.pred)?e.pred.flatMap(r=>typeof r=="string"?[]:Se(r)):[]],fs=(e,t,r)=>{if(!(e instanceof Date)&&typeof e!="string")return e;const n=J(e);if(!n.isValid())return e;if("granularity"in t)return sr(e,n.add(-t.offset,t.granularity));if(!r.originalAnchor)return e;let o=n;for(const i of ir)if(t[i]!==void 0){const s=i==="month"?r.originalAnchor.month()+1:i==="day"?r.originalAnchor.date():i==="week"?r.originalAnchor.isoWeek():i==="quarter"?r.originalAnchor.quarter():r.originalAnchor.get(i);o=An(o,i,s)}return sr(e,o)},cr=({logicform:e,pred:t,outputName:r,schema:n,resolveSchema:o})=>{const i=t.pred;(!i||typeof i!="object"||Array.isArray(i))&&_e("$periodShift pred must be a nested metric");const s=us(t.args??{}),a={shiftedValues:0},c=Te([e.query,...Se(t)]);if(!c)throw new p("PERIOD_SHIFT_TIME_QUERY_REQUIRED","$periodShift requires a date condition in the LogicForm query");const u=ls(c,n,o,s,a),d=Y(i);d.name=r,delete d.query;const l=Y(e);l.query=u,l.preds=[d],delete l.having,delete l.sort,delete l.limit,delete l.page;const f=new Set((e.groupby??[]).filter(m=>{const y=nr(m);return y?z(n,y,o).property.primal_type==="date":!1}).map(rr));return{kind:"query",logicform:l,groupKeyShifts:ps(e,n,o,s,a),mapResult:m=>m.map(y=>{const g={...y};for(const _ of f)g[_]=fs(g[_],s,a);return g})}},ms={name:"$periodShift",defaultName:({operandName:e,args:t,locale:r,t:n})=>{const o=or(t,r,n),i=r.toLowerCase().startsWith("en")?`${e} ${o} baseline`:`${e}${o}\u57FA\u671F\u503C`;return n?.("operator.$periodShift",i,{operandName:e,comparison:o})??i},kind:"component",createComponent:cr,getOutputProperty({name:e,inputProperty:t}){if(!t)throw new Error("$periodShift requires a nested metric");return{...t,name:e,isArray:!1}}},ys=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&!(e instanceof Date),At=e=>typeof e=="string"||typeof e=="number"||e instanceof Date,En=(e,t)=>{const r=e.properties.find(({type:n})=>n==="timestamp");if(!r)throw new p("TIMESTAMP_PROPERTY_REQUIRED",`${t} requires a timestamp property in the Schema`);return r},_n=(e,t)=>{if(At(e)){t.start??=e,t.end??=e;return}if(!ys(e))return;const r=e.$eq;At(r)&&(t.start??=r,t.end??=r);const n=e.$gte??e.$gt,o=e.$lte??e.$lt;At(n)&&(t.start??=n),At(o)&&(t.end??=o);for(const i of["$and","$or"]){const s=e[i];if(Array.isArray(s))for(const a of s)_n(a,t)}},hs=(e,t,r,n)=>{const o=En(t,n),i=new Set,s={},a=(l,f)=>{for(const[m,y]of Object.entries(l)){if((m==="$and"||m==="$or")&&Array.isArray(y)){for(const _ of y)a(_,f||m==="$or");continue}if(m.startsWith("$"))continue;const g=z(t,m,r);if(g.property.type==="timestamp"){if(f)throw new p("AMBIGUOUS_TIME_QUERY",`${n} does not support timestamp conditions inside $or`);i.add(g.canonicalName),_n(y,s)}}};if(a(e,!1),i.size!==1)throw new p(i.size===0?"TIME_QUERY_REQUIRED":"AMBIGUOUS_TIME_QUERY",`${n} requires a concrete condition on the Schema timestamp property`);const c=[...i][0];if(!c||c!==o.name)throw new p("AMBIGUOUS_TIME_QUERY",`${n} requires the Schema timestamp property: ${o.name}`);const u=l=>{const f=[];for(const[m,y]of Object.entries(l)){if((m==="$and"||m==="$or")&&Array.isArray(y)){const g=y.map(_=>u(_)).filter(_=>_!==void 0);g.length>0&&f.push([m,g]);continue}!m.startsWith("$")&&z(t,m,r).property.type==="timestamp"||f.push([m,y])}return f.length>0?Object.fromEntries(f):void 0},d=u(e);return{property:o,propertyName:c,...s.start!==void 0?{start:s.start}:{},...s.end!==void 0?{end:s.end}:{},...d?{queryWithoutTime:d}:{}}},Sn=(e,t,r,n,o)=>{const i=Te([e,...Se(t)]);if(!i)throw new p("TIME_QUERY_REQUIRED",`${o} requires a timestamp query`);return hs(i,r,n,o)},In=(e,t,r)=>Te([e,{[t]:r}]),gs=new Set(["day","week","month","quarter","year"]),$s={day:"\u65E5",week:"\u5468",month:"\u6708",quarter:"\u5B63\u5EA6",year:"\u5E74"},ws=e=>{if(typeof e!="string"||!gs.has(e))throw new p("INVALID_AVERAGE_PER_PERIOD_ARGS","$averagePerPeriod args.granularity must be day, week, month, quarter, or year");return e},Rn=e=>{const t=Y(e);return delete t.having,delete t.sort,delete t.limit,delete t.page,t},ur=e=>{const t=Y(e);return delete t.query,t.pred&&typeof t.pred=="object"&&!Array.isArray(t.pred)&&(t.pred=ur(t.pred)),Array.isArray(t.pred)&&(t.pred=t.pred.map(r=>typeof r=="string"?r:ur(r))),t},As={name:"$averagePerPeriod",defaultName:({operandName:e,args:t,locale:r})=>r.toLowerCase().startsWith("en")?`Average ${e} per ${typeof t.granularity=="string"?t.granularity:"period"}`:`${e}${$s[String(t.granularity)]??"\u5468\u671F"}\u5747\u503C`,kind:"component",createComponent({logicform:e,pred:t,schema:r,outputName:n,t:o}){if(!t.pred||typeof t.pred!="object"||Array.isArray(t.pred))throw new p("INVALID_AVERAGE_PER_PERIOD_INPUT","$averagePerPeriod pred must be a nested metric");const i=ws(t.args?.granularity),s=En(r,"$averagePerPeriod"),a=ur(t.pred),c=Te([e.query,...Se(t)]),u=Rn(e);u.preds=[{...a,name:"__avg_period_num__"}],c&&(u.query=c);const d=Rn(e);d.preds=[{operator:"$countDistinct",pred:{operator:"$dateBucket",pred:s.name,args:{granularity:i},name:"__avg_period_bucket__"},name:"__avg_period_den__"}],c&&(d.query=c);const l=o("component.numerator",`${n}\u5206\u5B50`,{outputName:n}),f=o("component.denominator",`${n}\u5206\u6BCD`,{outputName:n});return{components:[{name:l,logicform:u},{name:f,logicform:d}],expression:`${l} / NULLIF(${f}, 0)`}},getOutputProperty({name:e,inputProperty:t}){if(!t)throw new Error("$averagePerPeriod requires a nested metric");return{...t,name:e,isArray:!1}}},Es={name:"$avg",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`Average ${e}`:`\u5E73\u5747${e}`,kind:"aggregate",toSQL(e){const{column:t,sql:r}=e;if(!t)throw new Error("$avg requires a column");return r.aggregateFunction("avg",t)},getOutputProperty({name:e,property:t,inputProperty:r}){const n=t??r;if(!n)throw new Error("$avg requires a property");return{name:e,type:n.type,primal_type:n.primal_type,isArray:!1}}},_s=e=>{if(e.mode!=="auto")return;const t=e.buckets;if(!Number.isInteger(t)||t<2||t>100)throw new p("INVALID_CASE_ARGS","$case auto mode requires args.buckets to be an integer between 2 and 100");if(Object.hasOwn(e,"cases"))throw new p("INVALID_CASE_ARGS","$case auto mode cannot define args.cases");for(const r of["min","max"])if(e[r]!==void 0&&typeof e[r]!="number"||e[r]!==void 0&&!Number.isFinite(e[r]))throw new p("INVALID_CASE_ARGS",`$case auto mode ${r} must be finite number`);if(e.min===void 0!=(e.max===void 0))throw new p("INVALID_CASE_ARGS","$case auto mode requires both min and max");return t},Ss=e=>{if(!Array.isArray(e)||e.length===0)throw new p("INVALID_CASE_ARGS","$case requires a non-empty args.cases array");return e.map(t=>{if(typeof t!="object"||t===null||!("when"in t)||!("then"in t))throw new p("INVALID_CASE_ARGS","Each $case item requires when and then");const r=t;return{when:r.when,then:r.then}})},Is={name:"$case",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`${e} category`:`${e}\u5206\u7C7B`,kind:"scalar",toSQL({expression:e,args:t,sql:r}){if(!e)throw new p("PRED_PROPERTY_REQUIRED","$case requires a pred");const n=_s(t);if(n!==void 0){const s=t.min===void 0?`MIN(${e}) OVER ()`:r.value(t.min),a=t.max===void 0?`MAX(${e}) OVER ()`:r.value(t.max),c=`(${a} - ${s})`,u=Array.from({length:n-1},(d,l)=>{const f=`${s} + ${c} * ${l+1} / ${n}`;return`WHEN ${e} < ${f} THEN ${r.value(l)}`});return`CASE WHEN ${s} = ${a} THEN ${r.value(0)} ${u.join(" ")} ELSE ${r.value(n-1)} END`}const o=Ss(t.cases).map(({when:s,then:a})=>`WHEN ${r.condition(e,s)} THEN ${r.value(a)}`),i=Object.hasOwn(t,"default")?` ELSE ${r.value(t.default)}`:"";return`CASE ${o.join(" ")}${i} END`},getOutputProperty({name:e}){return{name:e,type:"category",primal_type:"string",isArray:!1}}},Rs={name:"$concat",defaultName:({operandName:e,inputNames:t,locale:r})=>r.toLowerCase().startsWith("en")?t.length>0?`Combined ${t.join(" and ")}`:`Combined ${e}`:t.length>0?`${t.join("\u4E0E")}\u62FC\u63A5\u503C`:`${e}\u62FC\u63A5\u503C`,kind:"scalar",requiresProperty:!1,toSQL(e){return e.sql.concat(ke("$concat",e,1,Number.POSITIVE_INFINITY))},getOutputProperty({name:e}){return{name:e,type:"string",primal_type:"string",isArray:!1}}},Os={name:"$count",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?e==="rows"?"Row count":`${e} count`:e==="\u6570\u636E\u884C"?"\u884C\u6570":`${e}\u6570\u91CF`,kind:"aggregate",requiresProperty:!1,toSQL(e){const{column:t,sql:r}=e;return r.aggregateFunction("count",t)},getOutputProperty({name:e}){return{name:e,type:"int",primal_type:"number",isArray:!1}}},bs={name:"$countDistinct",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`Distinct ${e} count`:`${e}\u53BB\u91CD\u8BA1\u6570`,kind:"aggregate",toSQL(e){const{column:t,sql:r}=e;if(!t)throw new Error("$countDistinct requires a column");return r.aggregateFunction("count",`DISTINCT ${t}`)},getOutputProperty({name:e}){return{name:e,type:"int",primal_type:"number",isArray:!1}}},Ns=new Set(["hour","day","week","month","quarter","year"]),Ps={hour:"\u5C0F\u65F6",day:"\u65E5",week:"\u5468",month:"\u6708",quarter:"\u5B63\u5EA6",year:"\u5E74"},On=e=>{if(typeof e!="string"||!Ns.has(e))throw new p("INVALID_DATE_BUCKET_ARGS","$dateBucket args.granularity must be hour, day, week, month, quarter, or year");return e},Ts={name:"$dateBucket",defaultName:({operandName:e,args:t,locale:r})=>r.toLowerCase().startsWith("en")?`${e} by ${typeof t.granularity=="string"?t.granularity:"time"}`:`${e}\uFF08\u6309${Ps[String(t.granularity)]??"\u65F6\u95F4"}\uFF09`,kind:"scalar",toSQL({expression:e,args:t,sql:r}){if(!e)throw new Error("$dateBucket requires a date pred");return r.dateBucket(e,On(t.granularity))},getOutputProperty({name:e,inputProperty:t,args:r}){if(!t||t.primal_type!=="date")throw new p("DATE_BUCKET_DATE_REQUIRED","$dateBucket requires a date-valued pred");const n=On(r.granularity);return{...t,name:e,type:"date",primal_type:"date",isArray:!1,granularity:n}}},Ls={name:"$divide",defaultName:({operandName:e,inputNames:t,locale:r})=>r.toLowerCase().startsWith("en")?t.length>=2?`${t[0]} divided by ${t[1]}`:`${e} ratio`:t.length>=2?`${t[0]}\u9664\u4EE5${t[1]}`:`${e}\u6BD4\u503C`,kind:"scalar",requiresProperty:!1,toSQL(e){const[t,r]=ke("$divide",e,2);return`(${t} / NULLIF(${r}, 0))`},getOutputProperty({name:e}){return $t(e)}},Ds=e=>{if(!(!e.inputProperty?.comparable||!e.input))return{kind:"ordinal-decode",comparable:e.inputProperty.comparable,input:{kind:"operator",operator:"$max",args:e.args,...e.pred.query?{query:e.planQuery(e.pred.query)}:{},input:{kind:"ordinal-encode",input:e.input,comparable:e.inputProperty.comparable}}}},Cs={name:"$max",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`Maximum ${e}`:`${e}\u6700\u5927\u503C`,kind:"aggregate",planExpression:Ds,toSQL(e){const{column:t,sql:r}=e;if(!t)throw new Error("$max requires a column");return r.aggregateFunction("max",t)},getOutputProperty({name:e,property:t,inputProperty:r}){const n=t??r;if(!n)throw new Error("$max requires a property");return{name:e,type:n.type,primal_type:n.primal_type,isArray:!1,...n.granularity?{granularity:n.granularity}:{},...n.comparable?{comparable:n.comparable}:{}}}},qs=e=>{if(!(!e.inputProperty?.comparable||!e.input))return{kind:"ordinal-decode",comparable:e.inputProperty.comparable,input:{kind:"operator",operator:"$min",args:e.args,...e.pred.query?{query:e.planQuery(e.pred.query)}:{},input:{kind:"ordinal-encode",input:e.input,comparable:e.inputProperty.comparable}}}},Us={name:"$min",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`Minimum ${e}`:`${e}\u6700\u5C0F\u503C`,kind:"aggregate",planExpression:qs,toSQL(e){const{column:t,sql:r}=e;if(!t)throw new Error("$min requires a column");return r.aggregateFunction("min",t)},getOutputProperty({name:e,property:t,inputProperty:r}){const n=t??r;if(!n)throw new Error("$min requires a property");return{name:e,type:n.type,primal_type:n.primal_type,isArray:!1,...n.granularity?{granularity:n.granularity}:{},...n.comparable?{comparable:n.comparable}:{}}}},js={name:"$multiply",defaultName:({operandName:e,inputNames:t,locale:r})=>r.toLowerCase().startsWith("en")?t.length>0?t.join(" times "):`Product of ${e}`:t.length>0?t.join("\u4E58\u4EE5"):`${e}\u4E58\u79EF`,kind:"scalar",requiresProperty:!1,toSQL(e){return`(${ke("$multiply",e,2,Number.POSITIVE_INFINITY).join(" * ")})`},getOutputProperty({name:e}){return $t(e)}},ks=e=>{const t=Y(e);return delete t.having,delete t.sort,delete t.limit,delete t.page,t},dr=e=>{const t=Y(e);return delete t.query,t.pred&&typeof t.pred=="object"&&!Array.isArray(t.pred)&&(t.pred=dr(t.pred)),Array.isArray(t.pred)&&(t.pred=t.pred.map(r=>typeof r=="string"?r:dr(r))),t},Ms={name:"$newly",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`New ${e}`:`\u65B0\u589E${e}`,kind:"component",createComponent({logicform:e,pred:t,schema:r,resolveSchema:n,outputName:o,t:i}){if(!t.pred||typeof t.pred!="object"||Array.isArray(t.pred))throw new p("INVALID_NEWLY_INPUT","$newly pred must be a nested metric");if((e.groupby??[]).some(l=>{const f=nr(l);return f?z(r,f,n).property.type==="timestamp":!1}))throw new p("NEWLY_TIME_GROUPBY_UNSUPPORTED","$newly does not support grouping by the timestamp property");const s=Sn(e.query,t,r,n,"$newly");if(s.start===void 0||s.end===void 0)throw new p("NEWLY_RANGE_REQUIRED","$newly requires both start and end timestamp bounds");const a=dr(t.pred),c=(l,f)=>{const m=ks(e);return m.query=In(s.queryWithoutTime,s.propertyName,{$lte:l}),m.preds=[{...a,name:f}],m},u=i("component.end",`${o}\u7ED3\u675F`,{outputName:o}),d=i("component.start",`${o}\u5F00\u59CB`,{outputName:o});return{components:[{name:u,logicform:c(s.end,"__newly_end__")},{name:d,logicform:c(s.start,"__newly_start__")}],expression:`${u} - COALESCE(${d}, 0)`}},getOutputProperty({name:e,inputProperty:t}){if(!t)throw new Error("$newly requires a nested metric");return{...t,name:e,isArray:!1}}},xs=e=>{const t=Y(e);return delete t.having,delete t.sort,delete t.limit,delete t.page,t},pr=e=>{const t=Y(e);return delete t.query,t.pred&&typeof t.pred=="object"&&!Array.isArray(t.pred)&&(t.pred=pr(t.pred)),Array.isArray(t.pred)&&(t.pred=t.pred.map(r=>typeof r=="string"?r:pr(r))),t},Vs={name:"$periodValue",defaultName:({operandName:e,args:t,locale:r})=>r.toLowerCase().startsWith("en")?`${e} at period ${t.boundary==="start"?"start":"end"}`:`${e}${t.boundary==="start"?"\u671F\u521D\u503C":"\u671F\u672B\u503C"}`,kind:"component",observationPolicy({pred:e}){const t=e.args?.boundary;if(t!=="start"&&t!=="end")throw new p("INVALID_PERIOD_BOUNDARY_ARGS","$periodValue args.boundary must be start or end",{boundary:t});return{boundary:t,implicit:!1}},createComponent({logicform:e,pred:t,outputName:r,schema:n,resolveSchema:o}){if(!t.pred||typeof t.pred!="object"||Array.isArray(t.pred))throw new p("INVALID_PERIOD_BOUNDARY_INPUT","$periodValue pred must be a nested metric");const i=t.args?.boundary;if(i!=="start"&&i!=="end")throw new p("INVALID_PERIOD_BOUNDARY_ARGS","$periodValue args.boundary must be start or end");const s=Sn(e.query,t,n,o,"$periodValue"),a=i==="start"?s.start:s.end;if(a===void 0)throw new p("PERIOD_BOUNDARY_RANGE_REQUIRED",`$periodValue cannot resolve the ${i} of the timestamp query`);const c={version:e.version,schema:n.id,query:{[s.propertyName]:{$lte:a}},preds:[{operator:"$max",pred:s.propertyName,name:"__period_boundary_date__"}]},u=xs(e);return u.query=In(s.queryWithoutTime,s.propertyName,c),u.preds=[{...pr(t.pred),name:r}],{kind:"query",logicform:u}},getOutputProperty({name:e,inputProperty:t}){if(!t)throw new Error("$periodValue requires a nested metric");return{...t,name:e,isArray:!1}}},vs=e=>{const t=Y(e);return delete t.having,delete t.sort,delete t.limit,delete t.page,t},Bs=({logicform:e,pred:t,outputName:r,locale:n,t:o,schema:i,resolveSchema:s})=>{if(!t.pred||typeof t.pred!="object"||Array.isArray(t.pred))throw new Error("$periodDifference pred must be a nested metric");const a=Y(t.pred);a.name="__period_diff_current__";const c=vs(e);c.preds=[a];const u=Te([e.query,...Se(t)]);u&&(c.query=u);const d={pred:Y(t.pred),...t.args?{args:t.args}:{}},l=cr({logicform:e,pred:d,outputName:"__period_diff_prev__",schema:i,resolveSchema:s});if(!("logicform"in l))throw new Error("$periodDifference period shift must produce a query component");const f=o("component.current",`${r}\u672C\u671F`,{outputName:r}),m=o("component.previous",`${r}\u4E0A\u671F`,{outputName:r});return{components:[{name:f,logicform:c},{name:m,logicform:l.logicform,...l.groupKeyShifts?{groupKeyShifts:l.groupKeyShifts}:{}}],expression:`${f} - ${m}`}},Fs={name:"$periodDifference",defaultName:({operandName:e,args:t,locale:r,t:n})=>{const o=or(t,r,n),i=r.toLowerCase().startsWith("en")?`${e} ${o} difference`:`${e}${o}\u5DEE\u503C`;return n?.("operator.$periodDifference",i,{operandName:e,comparison:o})??i},kind:"component",createComponent:Bs,getOutputProperty({name:e,inputProperty:t}){if(!t)throw new Error("$periodDifference requires a nested metric");return{...t,name:e,isArray:!1}}},Ys=e=>{const t=Y(e);return delete t.having,delete t.sort,delete t.limit,delete t.page,t},Qs=({logicform:e,pred:t,outputName:r,locale:n,t:o,schema:i,resolveSchema:s})=>{if(!t.pred||typeof t.pred!="object"||Array.isArray(t.pred))throw new Error("$periodGrowth pred must be a nested metric");const a=Y(t.pred);a.name="__period_growth_current__";const c=Ys(e);c.preds=[a];const u=Te([e.query,...Se(t)]);u&&(c.query=u);const d={pred:Y(t.pred),...t.args?{args:t.args}:{}},l=cr({logicform:e,pred:d,outputName:"__period_growth_prev__",schema:i,resolveSchema:s});if(!("logicform"in l))throw new Error("$periodGrowth period shift must produce a query component");const f=o("component.current",`${r}\u672C\u671F`,{outputName:r}),m=o("component.previous",`${r}\u4E0A\u671F`,{outputName:r});return{components:[{name:f,logicform:c},{name:m,logicform:l.logicform,...l.groupKeyShifts?{groupKeyShifts:l.groupKeyShifts}:{}}],expression:`${f} / NULLIF(ABS(${m}), 0) - 1`}},Hs={name:"$periodGrowth",defaultName:({operandName:e,args:t,locale:r,t:n})=>{const o=or(t,r,n),i=r.toLowerCase().startsWith("en")?`${e} ${o} growth`:`${e}${o}\u589E\u957F\u7387`;return n?.("operator.$periodGrowth",i,{operandName:e,comparison:o})??i},kind:"component",createComponent:Qs,getOutputProperty({name:e}){return{name:e,type:"percentage",primal_type:"number",isArray:!1}}},Gs={name:"$sum",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`Total ${e}`:`\u603B${e}`,kind:"aggregate",toSQL(e){const{column:t,sql:r}=e;if(!t)throw new Error("$sum requires a column");return r.aggregateFunction("sum",t)},getOutputProperty({name:e,property:t,inputProperty:r}){const n=t??r;if(!n)throw new Error("$sum requires a property");return{name:e,type:n.type,primal_type:n.primal_type,isArray:!1}}},Ws={name:"$subtract",defaultName:({operandName:e,inputNames:t,locale:r})=>r.toLowerCase().startsWith("en")?t.length>=2?`${t[0]} minus ${t[1]}`:`${e} difference`:t.length>=2?`${t[0]}\u51CF\u53BB${t[1]}`:`${e}\u5DEE\u503C`,kind:"scalar",requiresProperty:!1,toSQL(e){const[t,r]=ke("$subtract",e,2);return`(${t} - ${r})`},getOutputProperty({name:e,inputProperties:t}){const r=t?.[0];return r?{...r,name:e,isArray:!1}:$t(e)}},bn=e=>{const t=Y(e);return delete t.having,delete t.sort,delete t.limit,delete t.page,t},lr=e=>{const t=Y(e);return delete t.query,t.pred&&typeof t.pred=="object"&&!Array.isArray(t.pred)&&(t.pred=lr(t.pred)),Array.isArray(t.pred)&&(t.pred=t.pred.map(r=>typeof r=="string"?r:lr(r))),t},zs={name:"$shareOfTotal",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`${e} share of total`:`${e}\u5360\u6BD4`,kind:"component",createComponent({logicform:e,pred:t,outputName:r,t:n}){if(!t.pred||typeof t.pred!="object"||Array.isArray(t.pred))throw new p("INVALID_SHARE_OF_TOTAL_INPUT","$shareOfTotal pred must be a nested metric");const o=t.args?.dimension;if(o!==void 0&&typeof o!="string")throw new p("INVALID_SHARE_OF_TOTAL_ARGS","$shareOfTotal args.dimension must be a groupby pred or output name");const i=e.groupby??[],s=o===void 0?i.length-1:i.findIndex(y=>typeof y.pred=="string"&&y.pred===o||rr(y)===o);if(o!==void 0&&s<0)throw new p("SHARE_OF_TOTAL_DIMENSION_NOT_FOUND",`$shareOfTotal dimension is not grouped: ${o}`);const a=i.filter((y,g)=>g!==s),c=lr(t.pred),u=bn(e);u.preds=[{...c,name:"__share_numerator__"}];const d=Te([e.query,...Se(t)]);d&&(u.query=d);const l=bn(e);l.groupby=a,l.preds=[{...c,name:"__share_denominator__"}];const f=n("component.numerator",`${r}\u5206\u5B50`,{outputName:r}),m=n("component.denominator",`${r}\u5206\u6BCD`,{outputName:r});return{components:[{name:f,logicform:u},{name:m,logicform:l}],expression:`${f} / NULLIF(${m}, 0)`}},getOutputProperty({name:e}){return{name:e,type:"percentage",primal_type:"number",isArray:!1}}},Ks={name:"$substring",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`${e} substring`:`${e}\u5B50\u4E32`,kind:"scalar",toSQL({expression:e,args:t,sql:r}){if(!e)throw new p("PRED_PROPERTY_REQUIRED","$substring requires a pred");const{start:n,length:o}=t;if(!Number.isInteger(n)||Number(n)<0||!Number.isInteger(o)||Number(o)<1)throw new p("INVALID_SUBSTRING_ARGS","$substring requires a non-negative integer start and a positive integer length");return r.substring(e,Number(n)+1,Number(o))},getOutputProperty({name:e}){return{name:e,type:"string",primal_type:"string",isArray:!1}}},Nn=(e,t,r,n="$sql")=>{if(typeof e!="string"||e.trim().length===0)throw new p("INVALID_SQL_ARGS",`${n} requires a non-empty args.sql expression`);let o="",i=0,s;for(let a=0;a<e.length;a+=1){const c=e[a];if(!c)continue;if(s){o+=c,c===s&&(e[a+1]===s?(o+=s,a+=1):s=void 0);continue}if(c==="'"||c==='"'||c==="`"){s=c,o+=c;continue}const u=e.slice(a,a+2);if(c===";"||u==="--"||u==="/*")throw new p("INVALID_SQL_EXPRESSION",`${n} accepts one expression and does not allow statements or SQL comments`);if(c==="?"){if(i>=t.length)throw new p("INVALID_SQL_PARAMETERS",`${n} contains more placeholders than args.parameters values`);o+=r(t[i]),i+=1;continue}o+=c}if(s)throw new p("INVALID_SQL_EXPRESSION",`${n} contains an unterminated quote`);if(i!==t.length)throw new p("INVALID_SQL_PARAMETERS",`${n} args.parameters contains more values than SQL placeholders`);return o},Js=new Set(["boolean","date","number","entity","object","string"]),Zs=e=>{if(e===void 0)return[];if(!Array.isArray(e))throw new p("INVALID_SQL_ARGS","$sql args.parameters must be an array");return e},Xs=(e,t)=>{const r=t.type,n=t.primal_type;if(typeof r!="string"||r.length===0||!Js.has(n))throw new p("INVALID_SQL_OUTPUT","$sql requires args.type and a valid args.primal_type");if(t.isArray!==void 0&&typeof t.isArray!="boolean")throw new p("INVALID_SQL_OUTPUT","$sql args.isArray must be boolean");if(t.ref!==void 0&&typeof t.ref!="string")throw new p("INVALID_SQL_OUTPUT","$sql args.ref must be a Schema id");return{name:e,type:r,primal_type:n==="object"?"entity":n,isArray:t.isArray===!0,...typeof t.ref=="string"?{ref:t.ref}:{}}},ea={name:"$sql",defaultName:({locale:e})=>e.toLowerCase().startsWith("en")?"Calculated value":"\u8BA1\u7B97\u503C",kind:"scalar",requiresProperty:!1,toSQL({args:e,expression:t,expressions:r,sql:n}){if(t||r&&r.length>0)throw new p("INVALID_SQL_INPUT","$sql does not accept pred; put the expression in args.sql");return Nn(e.sql,Zs(e.parameters),o=>n.value(o))},getOutputProperty({name:e,args:t,inputProperty:r,inputProperties:n}){if(r||n&&n.length>0)throw new p("INVALID_SQL_INPUT","$sql does not accept pred; put the expression in args.sql");return Xs(e,t)}},ta=e=>{const t=new Set,r=n=>{for(const[o,i]of Object.entries(n)){if(o==="$and"||o==="$or"){for(const s of i)r(s);continue}t.add(o)}};return r(e),[...t]},ra=e=>typeof e.pred!="string"?e:{...e,pred:{operator:"$sum",pred:e.pred,name:`${e.pred}\u5408\u8BA1`}},Et=(e,t)=>{if(e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred))return e.pred.operator&&t?.(e.pred.operator).kind==="component"?e.pred:Et(e.pred,t);if(Array.isArray(e.pred)){for(const r of e.pred)if(typeof r!="string"){const n=Et(r,t);if(n)return n}}},na=(e,t,r)=>{const n=`__rank_component_${t.name??"value"}__`,o=c=>c===r?n:Array.isArray(c)?c.map(o):!c||typeof c!="object"?c:Object.fromEntries(Object.entries(c).map(([u,d])=>[u,o(d)])),i=Y(e);i.preds=[{...Y(r),name:n}],delete i.having,delete i.sort,delete i.limit,delete i.limitBy,delete i.page,delete i.output,delete i.representation;const s=Y(e);s.from=i;const a=[];for(const c of e.groupby??[]){const u=c.name??(typeof c.pred=="string"?c.pred:void 0);u&&a.push({pred:u,name:u})}return s.preds=[...a,...(e.preds??[]).map(c=>o(c))],delete s.groupby,s},oa=(e,t,r)=>{const n=e.preds;if(n.filter(d=>d.operator==="$rank"&&d.query).length!==1)throw new p("AMBIGUOUS_RANK_TARGET","A LogicForm without groupby must contain exactly one $rank pred.query target");const i=ta(r),[s]=i;if(i.length!==1||!s)throw new p("AMBIGUOUS_RANK_DIMENSION","$rank pred.query must reference exactly one property when groupby is omitted",{properties:i});const a=Y(e);a.groupby=[{pred:s,name:s}],a.preds=n.map(d=>{if(d.name!==t.name)return d;const l={...d};return delete l.query,ra(l)}),delete a.sort,delete a.limit,delete a.limitBy,delete a.page,delete a.output,delete a.representation;const c=n.map(({name:d})=>d).filter(d=>!!d),u=Y(e);return u.from=a,u.query=r,u.preds=[{pred:s,name:s},...c.map(d=>({pred:d,name:d}))],delete u.groupby,delete u.having,delete u.entity_id,delete u.propertyResolve,u},ia={name:"$rank",defaultName:({operandName:e,locale:t})=>t.toLowerCase().startsWith("en")?`${e} rank`:`${e}\u6392\u540D`,kind:"window",windowFunction:"rank",rewriteLogicform({logicform:e,getOperator:t}){const r=e.groupby?.length?e.preds?.map(o=>Et(o,t)).find(Boolean):void 0;if(r){const o=e.preds?.find(i=>Et(i,t)===r);if(o)return na(e,o,r)}if(e.groupby?.length)return;const n=e.preds?.find(o=>o.operator==="$rank"&&o.query);return n?.query?oa(e,n,n.query):void 0},validatePlan({pred:e,groupByNames:t}){if(!e.pred||Array.isArray(e.pred))throw new p("INVALID_WINDOW_OPERATOR_INPUT","$rank requires exactly one pred");if(t.length===0&&!e.query&&typeof e.pred!="string")throw new p("RANK_GROUPBY_OR_TARGET_REQUIRED","$rank requires groupby or a pred.query target used to infer the ranking dimension")},getOutputProperty({name:e}){return{name:e,type:"int",primal_type:"number",isArray:!1}}},sa={name:"$rowNumber",defaultName:({locale:e})=>e.toLowerCase().startsWith("en")?"Row number":"\u884C\u53F7",kind:"window",windowFunction:"rowNumber",getOutputProperty({name:e}){return{name:e,type:"int",primal_type:"number",isArray:!1}}},aa=new Set(["string","number","boolean","date","entity","object"]),fr=e=>{if(e==="timestamp"||e==="date")return{type:e,primal_type:"date"};if(typeof e=="string"&&aa.has(e))return{type:e,primal_type:e};throw new p("INVALID_CONSTANT_TYPE","$constant args.type must be timestamp, date, string, number, boolean, entity, or object")},ca={name:"$constant",defaultName:({locale:e})=>e.toLowerCase().startsWith("en")?"Constant":"\u5E38\u91CF",kind:"scalar",requiresProperty:!1,normalizePred({pred:e}){if(e.pred!==void 0)throw new p("INVALID_CONSTANT_INPUT","$constant does not accept pred");return fr(e.args?.type),e},toSQL({args:e,sql:t}){return fr(e.type),t.value(e.value,e.type)},getOutputProperty({name:e,args:t}){return{name:e,...fr(t.type),isArray:!1}}},ua={name:"$periodBoundary",defaultName:({operandName:e,args:t,locale:r})=>r.toLowerCase().startsWith("en")?`${e} at period ${t.boundary==="start"?"start":"end"}`:`${e}${t.boundary==="start"?"\u671F\u521D":"\u671F\u672B"}`,kind:"scalar",toSQL({expression:e,args:t,sql:r}){if(!e)throw new p("PRED_PROPERTY_REQUIRED","$periodBoundary requires pred");const n=t.boundary;if(n!=="start"&&n!=="end")throw new p("INVALID_PERIOD_BOUNDARY_ARGS","$periodBoundary args.boundary must be start or end");const o=t.granularity;if(typeof o!="string")throw new p("END_OF_PERIOD_GRANULARITY_REQUIRED","$periodBoundary requires the input Property granularity");const i=r.dateBucket(e,o);return r.datePeriodBoundary?r.datePeriodBoundary(e,o,n):n==="start"?i:r.dateShift(r.dateShift(i,o,1),"second",-1)},planExpression({input:e,inputProperty:t,args:r}){if(!e)return;const n=t?.granularity??r.granularity;return{kind:"operator",operator:"$periodBoundary",input:e,args:{...r,granularity:n}}},normalizePred({pred:e,schema:t}){if(!e.pred||Array.isArray(e.pred))throw new p("INVALID_PERIOD_BOUNDARY_INPUT","$periodBoundary requires one pred");if(typeof e.pred=="string"){const r=t.properties.find(({id:n,name:o})=>n===e.pred||o===e.pred);return{...e,args:{...e.args,granularity:r?.granularity}}}return e},getOutputProperty({name:e,inputProperty:t,args:r}){if(!t||t.primal_type!=="date")throw new p("PERIOD_BOUNDARY_DATE_REQUIRED","$periodBoundary requires a date-valued pred");const n=t.granularity??r.granularity;if(typeof n!="string")throw new p("END_OF_PERIOD_GRANULARITY_REQUIRED","$periodBoundary requires the input Property granularity");return{...t,name:e,granularity:n,isArray:!1}}},Pn="__scalarExtremumInputs",mr=e=>{if(e.schema)return e.schema;if(e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred))return mr(e.pred);if(Array.isArray(e.pred)){const t=[...new Set(e.pred.flatMap(r=>typeof r=="string"?[]:mr(r)??[]))];if(t.length===1)return t[0]}},da=e=>{const t=Y(e);return delete t.from,delete t.having,delete t.sort,delete t.limit,delete t.limitBy,delete t.page,delete t.representation,delete t.output,t},pa=(e,t)=>{if(t.args?.[Pn]===!0||!Array.isArray(t.pred))return;if(e.preds?.length!==1)throw new p("SCALAR_EXTREMUM_SINGLE_PROJECTION_REQUIRED",`${t.operator} with multiple pred inputs must be the only LogicForm projection`);const r=t.pred.map((o,i)=>{const s=typeof o=="string"?{pred:o}:Y(o),a=s.name??`__scalar_extremum_input_${i}__`,c=s.schema??mr(s);return{...s,name:a,...c?{schema:c}:{}}}),n=da(e);return n.preds=r,{version:e.version,from:n,preds:[{operator:t.operator,pred:r.map(({name:o})=>o),...t.name?{name:t.name}:{},args:{...t.args,[Pn]:!0}}],...e.having?{having:e.having}:{},...e.sort?{sort:e.sort}:{},...e.limit!==void 0?{limit:e.limit}:{},...e.page!==void 0?{page:e.page}:{},...e.output?{output:e.output}:{},...e.representation?{representation:e.representation}:{}}},la=(e,t)=>{const r=e==="$least"?"MIN":"MAX",n=t.map(o=>`SELECT ${o} AS value`).join(" UNION ALL ");return`(SELECT ${r}(value) FROM (${n}) AS __scalar_extremum_values)`},fa=(e,t,r)=>{const[n,...o]=r??[];if(!n)throw new p("INVALID_OPERATOR_INPUTS",`${e} requires pred inputs`);if(o.some(({primal_type:i})=>i!==n.primal_type))throw new p("INCOMPATIBLE_OPERATOR_INPUTS",`${e} pred inputs must have the same primal type`);return{...n,name:t,isArray:!1}},Tn=e=>({name:e,defaultName:({inputNames:t,locale:r})=>r.toLowerCase().startsWith("en")?`${e==="$least"?"Least":"Greatest"} of ${t.join(", ")}`:`${t.join("\u3001")}\u4E2D\u7684${e==="$least"?"\u6700\u65E9\u503C":"\u6700\u665A\u503C"}`,kind:"scalar",requiresProperty:!1,normalizePred({pred:t}){if(!Array.isArray(t.pred)||t.pred.length<2)throw new p("INVALID_OPERATOR_INPUTS",`${e} requires at least two pred inputs`);return t},rewriteLogicform({logicform:t}){const r=t.preds?.[0];return r?.operator===e?pa(t,r):void 0},toSQL(t){const r=ke(e,t,2,Number.POSITIVE_INFINITY);return t.sql.scalarExtremum?.(e==="$least"?"least":"greatest",r)??la(e,r)},getOutputProperty({name:t,inputProperties:r}){return fa(e,t,r)}}),ma=Tn("$least"),ya=Tn("$greatest"),Ln=Object.freeze([Fi,Gs,Os,bs,Es,Us,Cs,ms,Hs,Fs,As,Vs,Ms,Qi,Ws,js,Ls,Yi,zs,Is,Rs,Ks,Ts,ea,ia,sa,ca,ua,ma,ya]),ha={name:"boolean",primalType:"boolean",hydrateResult(e){return typeof e=="number"?e===1:e}},ga={name:"category",primalType:"string"},$a={name:"currency",primalType:"number"},wa={name:"date",primalType:"date"},Aa={name:"duration",primalType:"number"},Ea={name:"end_date",primalType:"date"},Dn=(e,{property:t,requestEntity:r})=>!t.ref||e===void 0||e===null||typeof e=="object"&&!Array.isArray(e)?e:r(t.ref,e),_a={name:"object",primalType:"object",hydrateResult:Dn},Sa={name:"entity",primalType:"entity",hydrateResult:Dn},Ia={name:"file",primalType:"string"},Ra={name:"humanName",primalType:"string"},Oa={name:"ID",primalType:"string"},ba={name:"image",primalType:"string"},Na={name:"int",primalType:"number"},Pa={name:"name",primalType:"string"},Ta={name:"number",primalType:"number"},La={name:"order",primalType:"number"},Da={name:"percentage",primalType:"number"},Ca={name:"start_date",primalType:"date"},qa={name:"string",primalType:"string"},Ua={name:"timestamp",primalType:"date"},yr=Object.freeze([Oa,qa,Pa,Ra,ga,ba,Ia,Ta,Na,$a,Da,Aa,La,ha,Ua,wa,Ca,Ea,Sa,_a]),ja=(e,t,r)=>{if(typeof e=="function")return e;if(typeof e!="string"||e.trim().length===0)return;const n=new Function(`return (${e})`)();if(typeof n!="function")throw new TypeError(`Operator ${r} ${t} must resolve to a function`);return n},Cn=e=>{if(typeof e!="object"||e===null||Array.isArray(e))throw new TypeError("Operator definition must be an object");const t=e,r=t.name,n=typeof r=="string"?r:"",o=t.type,i=new Set(["defaultName","getOutputProperty","planInput","normalizePred","planExpression","observationPolicy","validatePlan","rewriteLogicform","requiresPerPeriodEvaluation","toSQL","evaluate","createComponent"]),s=Object.fromEntries(Object.entries(t).filter(([a])=>!i.has(a)));s.name=r;for(const a of i){const c=ja(t[a],a,n);c&&(s[a]=c)}if(!s.getOutputProperty&&typeof o=="string"){const a=yr.find(({name:c})=>c===o);if(!a)throw new TypeError(`Semantic type is not registered: ${o}`);s.getOutputProperty=()=>({name:n,type:o,primal_type:a.primalType,isArray:!1})}return s};class qn{#e=new Map;constructor(t=[]){for(const r of t)this.register(r)}register(t){const r=Cn(t);if(!r.name)throw new p("INVALID_OPERATOR","Operator name must not be empty");if(typeof r.defaultName!="function")throw new p("INVALID_OPERATOR",`Operator must implement defaultName: ${r.name}`);if(this.#e.has(r.name))throw new p("OPERATOR_ALREADY_REGISTERED",`Operator is already registered: ${r.name}`,{operator:r.name});const n=r;if(!(n.kind==="scalar"&&(typeof n.toSQL=="function"||typeof n.evaluate=="function")||n.kind==="aggregate"&&typeof n.toSQL=="function"||n.kind==="component"&&typeof n.createComponent=="function"||n.kind==="window"&&typeof n.windowFunction=="string"||n.kind==="logical"&&typeof n.planExpression=="function"))throw new p("INVALID_OPERATOR",`Operator kind and implementation do not match: ${r.name}`);return this.#e.set(r.name,r),this}get(t){const r=this.#e.get(t);if(!r)throw new p("OPERATOR_NOT_FOUND",`Operator is not registered: ${t}`,{operator:t});return r}requiresPerPeriodEvaluation(t,r){return this.get(t).requiresPerPeriodEvaluation?.(r)??!1}has(t){return this.#e.has(t)}definitions(){return[...this.#e.values()]}}const ka=Object.freeze([...Ln,...$n.flatMap(({operators:e})=>e??[])]),Ie=(e=[])=>new qn([...Ln,...wt(e).flatMap(({operators:t})=>t??[])]),Ma=(e,t)=>{const r=Gi(e,t);return{schemaId:e.id,propertyId:r.id,propertyName:r.name,physicalColumn:r.udf?.sql??r.id}},Un=(e,t,r)=>{const n=e.fieldReferences?.[r];return n?{schemaId:n.schemaId,propertyId:n.propertyId??n.column,propertyName:n.property,physicalColumn:n.sql??n.column}:Ma(t,r)},et=(e,t,r,n)=>{if(e.kind==="column")return{sources:[{schemaId:e.schemaId??r.id,propertyId:e.propertyId??e.column,propertyName:e.property,physicalColumn:e.column}],transformations:["projection"]};if(e.kind==="property-sql")return{sources:[{schemaId:e.schemaId,propertyId:e.propertyId,propertyName:e.property,physicalColumn:e.sql}],transformations:["property-sql"]};if(e.kind==="array-element")return{sources:[{schemaId:e.schemaId,propertyId:e.property,propertyName:e.property,physicalColumn:e.property}],transformations:["array-expand"]};if(e.kind==="window"){const c=[e.input,...e.partitionBy].map(u=>et(u,t,r,n));return{sources:c.flatMap(({sources:u})=>u),transformations:[...c.flatMap(({transformations:u})=>u).filter(u=>u!=="projection"),`window:${e.function}`]}}if(e.kind==="cumulative"){const c=[e.input,...e.partitionBy,...e.orderBy.map(({expression:u})=>u)].map(u=>et(u,t,r,n));return{sources:c.flatMap(({sources:u})=>u),transformations:[...c.flatMap(({transformations:u})=>u).filter(u=>u!=="projection"),`window:cumulative:${e.function}`]}}if(e.kind==="ordinal-encode"||e.kind==="ordinal-decode"){const c=et(e.input,t,r,n);return{sources:c.sources,transformations:[...c.transformations.filter(u=>u!=="projection"),`ordinal:${e.kind==="ordinal-encode"?"encode":"decode"}`]}}const o=[...e.input?[e.input]:[],...e.inputs??[]].map(c=>et(c,t,r,n)),i={sources:o.flatMap(({sources:c})=>c),transformations:o.flatMap(({transformations:c})=>c)},s=n.get(e.operator),a=new Set([...e.property?[e.property]:[],...s.dependencies??[],..._t(e.query)]);return{sources:[...i.sources,...[...a].filter(c=>!i.sources.some(u=>u.propertyName===c)).map(c=>Un(t,r,c))],transformations:[...i.transformations.filter(c=>c!=="projection"),`operator:${e.operator}`]}};function _t(e){if(!e)return[];const t=[];for(const[r,n]of Object.entries(e))if((r==="$and"||r==="$or")&&Array.isArray(n))for(const o of n)typeof o=="object"&&o!==null&&!Array.isArray(o)&&t.push(..._t(o));else r.startsWith("$")||t.push(r);return t}const we=e=>e.kind==="window"?[...we(e.input),...e.partitionBy.flatMap(we)]:e.kind==="cumulative"?[...we(e.input),...e.partitionBy.flatMap(we),...e.orderBy.flatMap(({expression:t})=>we(t))]:e.kind==="ordinal-encode"||e.kind==="ordinal-decode"?we(e.input):e.kind==="operator"?[..._t(e.query),...e.input?we(e.input):[],...(e.inputs??[]).flatMap(we)]:[],jn=(e,t,r,n=Ie())=>{if(e.subplans){const o=e.subplans.map(i=>jn(i,t,r,n));return{source:{schemaId:t.id,schemaName:t.name,physicalTable:o.map(({source:i})=>i.physicalTable).join(", "),provider:r.kind},outputs:e.projections.map(({name:i})=>{const s=o.flatMap(({outputs:a})=>a.filter(c=>c.name===i));return{name:i,sources:s.flatMap(({sources:a})=>a),transformations:[...new Set([...s.flatMap(({transformations:a})=>a),"compose"])]}}),filters:o.flatMap(({filters:i})=>i)}}return{source:{schemaId:t.id,schemaName:t.name,physicalTable:e.source,provider:r.kind},outputs:e.projections.map(o=>({name:o.name,...et(o.expression,e,t,n)})),filters:[...new Set([..._t(e.query),...e.projections.flatMap(({expression:o})=>we(o))])].map(o=>Un(e,t,o))}},ye=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&typeof e.version=="string"&&(typeof e.schema=="string"||typeof e.from=="object"),xa=/^(\d{2}):(\d{2})(?::(\d{2}))?$/,kn=e=>{const t=xa.exec(e);if(!t)return;const r=Number(t[1]),n=Number(t[2]),o=Number(t[3]??0);if(!(r>23||n>59||o>59))return{hour:r,minute:n,second:o}},Va=e=>{const t=e.freshness;if(t){if(t.mode==="ttl"){if(!Number.isInteger(t.ttlSeconds)||t.ttlSeconds<=0)throw new p("INVALID_SOURCE_FRESHNESS","TTL freshness requires a positive integer ttlSeconds");return}if(t.mode==="daily"){if(!kn(t.expireAt))throw new p("INVALID_SOURCE_FRESHNESS","Daily freshness expireAt must use HH:mm or HH:mm:ss");if(t.timeZone)try{new Intl.DateTimeFormat("en-US",{timeZone:t.timeZone}).format()}catch{throw new p("INVALID_SOURCE_FRESHNESS",`Invalid freshness timeZone: ${t.timeZone}`)}}}};class hr{#e=new Map;constructor(t=[]){for(const r of t)this.register(r)}register(t){if(!t.schemaId)throw new p("INVALID_SCHEMA_MAPPING","Schema mapping schemaId must not be empty");if(!t.source)throw new p("INVALID_SCHEMA_MAPPING","Schema mapping source must not be empty");if(t.sourceSql!==void 0&&t.sourceSql.trim().length===0)throw new p("INVALID_SCHEMA_MAPPING","Schema mapping sourceSql must not be empty");if(t.id!==void 0&&!t.id)throw new p("INVALID_SCHEMA_MAPPING","Schema mapping id must not be empty");if(t.connectionId.trim().length===0)throw new p("INVALID_SCHEMA_MAPPING","Schema mapping connectionId must not be empty");if(t.priority!==void 0&&!Number.isFinite(t.priority))throw new p("INVALID_SCHEMA_MAPPING","Schema mapping priority must be finite");for(const o of t.mappings??[]){if(o.mappingType==="property"&&(!o.sourceColumn||!o.propertyTarget?.length))throw new p("INVALID_SCHEMA_MAPPING","Schema mapping property items require sourceColumn and propertyTarget");if(o.mappingType==="predItem"&&(!o.sourceColumn||!o.predItem?.operator||typeof o.predItem.pred!="string"))throw new p("INVALID_SCHEMA_MAPPING","Schema mapping PredItem items require sourceColumn and predItem operator/pred")}Va(t);const r=this.#e.get(t.schemaId)??[],n=t.id??t.source;if(r.some(o=>(o.id??o.source)===n||o.source===t.source))throw new p("SCHEMA_MAPPING_ALREADY_REGISTERED",`Schema mapping is already registered: ${t.schemaId}:${n}`,{schemaId:t.schemaId,mappingId:n});return this.#e.set(t.schemaId,[...r,t]),this}get(t){const r=this.list(t);if(r.length===1)return r[0];const n=r.filter(o=>(o.mappings??[]).length===0);if(n.length===1)return n[0];throw new p("SCHEMA_MAPPING_AMBIGUOUS",`Schema ${t} has multiple mappings and requires LogicForm-based selection`,{schemaId:t,mappingIds:r.map(o=>o.id??o.source)})}list(t){const r=this.#e.get(t);if(!r||r.length===0)throw new p("SCHEMA_MAPPING_NOT_FOUND",`Schema mapping is not registered: ${t}`,{schemaId:t});return r}findSource(t,r){return this.#e.get(t)?.find(n=>n.source===r)}}const va=e=>{if(e.tablePath?.trim())return e.tablePath;const t=[e.physicalDatabase,e.physicalSchema,e.physicalTable].filter(r=>!!r?.trim());if(t.length>0)return t.join(".");if(e.sourceSql?.trim())return e.sourceSql;throw new p("INVALID_SCHEMA_MAPPING",`YiAsk Schema mapping ${e.id} has no physical source`)},Ba=e=>{if(!e.schemaSid||!e.datasourceSid)throw new p("INVALID_SCHEMA_MAPPING","YiAsk Schema mapping requires schemaSid and datasourceSid");if(e.enabled===!1)throw new p("INVALID_SCHEMA_MAPPING",`YiAsk Schema mapping is disabled: ${e.id}`);const t=[];for(const r of e.mappings){if(r.mappingType==="property"){if(!r.sourceColumn||!r.propertyTarget?.length)continue;t.push(r);continue}r.mappingType==="predItem"&&(!r.sourceColumn||!r.predItem?.operator||typeof r.predItem.pred!="string"||t.push(r))}return{id:String(e.id),schemaId:e.schemaSid,connectionId:e.datasourceSid,source:va(e),...e.sourceSql?{sourceSql:e.sourceSql}:{},mappings:t}},Fa=(e,t)=>!!(e&&t?.temporalSemantics==="snapshot"&&e.type!=="timestamp"),gr="$periodValue",Ya=(e,t)=>{const r=t?.observationPolicy?.({pred:e});if(r)return{operator:gr,...r};if(t?.kind==="aggregate")throw new p("OBSERVATION_REQUIRES_PERIOD_BOUNDARY",`Observation metrics must use ${gr}; ${t.name} describes a time range`,{operator:t.name});return{operator:gr,boundary:"end",implicit:!0}},Qa=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),St=(e,t,r)=>{const n=e instanceof Date?e.getTime():typeof e=="string"||typeof e=="number"?new Date(e).getTime():Number.NaN;if(Number.isNaN(n))throw new p(`${r.codePrefix}_PERIOD_INVALID_BOUND`,`${r.label} period ${t} must be a date`,{owner:t,value:e});return n},Re=(e,t=2)=>String(e).padStart(t,"0"),Mn=e=>`${Re(e.getFullYear(),4)}-${Re(e.getMonth()+1)}-${Re(e.getDate())} ${Re(e.getHours())}:${Re(e.getMinutes())}:${Re(e.getSeconds())}.`+Re(e.getMilliseconds(),3),Ha=(e,t)=>{if(!Qa(e)){const a=St(e,"point",t);return{lower:a,upper:a}}const r=e.$eq;if(r!==void 0){const a=St(r,"$eq",t);return{lower:a,upper:a}}const n=e.$gte??e.$gt,o=e.$lte??e.$lt;if(n===void 0||o===void 0)throw new p(`${t.codePrefix}_PERIOD_BOUNDS_REQUIRED`,`${t.label} period grouping requires both a lower and an upper time bound`);const i=St(n,e.$gte!==void 0?"$gte":"$gt",t)+(e.$gte===void 0?1:0),s=St(o,e.$lte!==void 0?"$lte":"$lt",t)-(e.$lte===void 0?1:0);if(i>s)throw new p(`${t.codePrefix}_PERIOD_INVALID_RANGE`,`${t.label} period grouping requires the lower bound to precede the upper bound`,{lower:n,upper:o});return{lower:i,upper:s}},xn=(e,t)=>{const{lower:r,upper:n}=Ha(e,t),o=new Date(r).getFullYear(),i=new Date(n).getFullYear();if(i-o+1>1e4)throw new p(`${t.codePrefix}_PERIOD_LIMIT_EXCEEDED`,`${t.label} period grouping cannot generate more than 10000 periods`);return Array.from({length:i-o+1},(s,a)=>{const c=o+a,u=new Date(c,0,1,0,0,0,0),d=new Date(Math.min(new Date(c,11,31,23,59,59,999).getTime(),n));return{label:`${Re(c,4)}-01-01 00:00:00.000`,start:Mn(u),end:Mn(d)}})},Ga=(e,t)=>e.groupby?.find(r=>typeof r.pred=="string"&&r.pred===t.name),Wa=(e,t)=>e&&Object.fromEntries(Object.entries(e).filter(([r])=>r!==t.name)),za=(e,t)=>{if(t.temporalSemantics!=="snapshot")return;const r=t.properties.find(({type:d})=>d==="timestamp");if(!r)return;const n=Ga(e,r),o=e.preds??[],i=o.filter(({operator:d})=>d==="$periodValue");if(!n||i.length===0)return;if(n.operator!=="$dateBucket"||n.args?.granularity!=="year")throw new p("OBSERVATION_PERIOD_GRANULARITY_UNSUPPORTED","Grouped observation period values currently require $dateBucket with year granularity",{property:r.name});if(i.length!==o.length)throw new p("OBSERVATION_PERIOD_METRICS_REQUIRED","A grouped observation query cannot mix $periodValue with ordinary projections");const s=i.map(d=>{const l=d.args?.boundary;if(l!=="start"&&l!=="end")throw new p("INVALID_PERIOD_BOUNDARY_ARGS","$periodValue args.boundary must be start or end",{boundary:l});if(!d.pred||typeof d.pred!="object"||Array.isArray(d.pred))throw new p("INVALID_PERIOD_BOUNDARY_INPUT","$periodValue pred must be a nested metric");return{pred:d,effectivePred:{...d.pred,...d.name?{name:d.name}:{}}}});if(new Set(i.map(({args:d})=>d?.boundary)).size!==1)throw new p("OBSERVATION_PERIOD_BOUNDARY_MISMATCH","Grouped observation metrics in one query must use the same period boundary");const c=i[0]?.args?.boundary,u=e.query?.[r.name];if(u===void 0)throw new p("OBSERVATION_PERIOD_BOUNDS_REQUIRED",`Grouped observation values on ${r.name} require a bounded query`,{property:r.name});return{group:n,timestamp:r,boundary:c,metrics:s,periods:xn(u,{codePrefix:"OBSERVATION",label:"Observation"}).map(d=>({label:d.label,asOf:d[c]}))}},Ka={name:"observation",resolveProjection({pred:e,schema:t,sourceProperty:r,outputProperty:n,operator:o}){if(!r||!Fa(r,t))return;const i=r,s=Ya(e,o);return{outputProperty:{...n,temporal:{kind:"period-boundary",boundary:s.boundary,sourceProperty:i.name}}}}},It=(e,t)=>{const r=e.filter(n=>n.type===t);return r.length===1?r[0]:void 0},tt=e=>{if(e.type!=="entity"||e.temporalSemantics==="snapshot")return;const t=It(e.properties,"ID"),r=It(e.properties,"timestamp"),n=It(e.properties,"start_date"),o=It(e.properties,"end_date");return t&&r&&n&&o?{id:t,timestamp:r,start:n,end:o}:void 0},Ja=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Za=e=>Ja(e)?e.$lte??e.$lt??e.$eq:e,Vn=(e,t)=>{if(!e)return e;const r=Object.fromEntries(Object.entries(e).map(([a,c])=>[a,(a==="$and"||a==="$or")&&Array.isArray(c)?c.map(u=>Vn(u,t)):c])),n=Object.entries(e).find(([a])=>a===t.timestamp.name);if(!n)return r;const[,o]=n,i=Za(o);if(i===void 0)throw new p("VALIDITY_POINT_IN_TIME_REQUIRED",`Valid-time query on ${t.timestamp.name} requires an upper bound or a point in time`,{property:t.timestamp.name});return{...Object.fromEntries(Object.entries(r).filter(([a])=>a!==t.timestamp.name)),[t.start.name]:e[t.start.name]??{$lte:i},[t.end.name]:e[t.end.name]??{$or:[{$exists:!1},{$gt:i}]}}},vn=(e,t)=>e.groupby?.find(r=>typeof r.pred=="string"&&r.pred===t.timestamp.name),Xa=(e,t)=>vn(e,t)!==void 0,ec=(e,t)=>e&&Object.fromEntries(Object.entries(e).filter(([n])=>n!==t.timestamp.name)),tc=(e,t)=>{const r=vn(e,t);if(!r)return;if(r.operator!=="$dateBucket"||r.args?.granularity!=="year")throw new p("VALIDITY_PERIOD_GRANULARITY_UNSUPPORTED","Valid-time period grouping currently requires $dateBucket with year granularity",{property:t.timestamp.name});const n=e.query?.[t.timestamp.name];if(n===void 0)throw new p("VALIDITY_PERIOD_BOUNDS_REQUIRED",`Valid-time period grouping on ${t.timestamp.name} requires a bounded query`,{property:t.timestamp.name});return{group:r,granularity:"year",periods:xn(n,{codePrefix:"VALIDITY",label:"Valid-time"}).map(({label:o,end:i})=>({label:o,asOf:i}))}},Bn=(e,t)=>!!(e&&Object.entries(e).some(([r,n])=>t.has(r)||(r==="$and"||r==="$or")&&Array.isArray(n)&&n.some(o=>typeof o=="object"&&o!==null&&Bn(o,t)))),rc={name:"validity",resolveQuery({logicform:e,schema:t,query:r}){const n=tt(t);if(!n)return r;if(Xa(e,n))return ec(r,n);const i=Bn(r,new Set([n.timestamp.name,n.start.name,n.end.name]))?r:{...r,[n.timestamp.name]:{$lte:new Date().toISOString()}};return Vn(i,n)},resolveProjection({schema:e,outputProperty:t}){if(tt(e))return{outputProperty:{...t,temporal:{kind:"validity"}}}}};class Fn{#e=new Map;constructor(t=[]){for(const r of t)this.register(r)}register(t){if(!t.name)throw new p("INVALID_SEMANTIC_RULE","Semantic rule name must not be empty");if(this.#e.has(t.name))throw new p("SEMANTIC_RULE_ALREADY_REGISTERED",`Semantic rule is already registered: ${t.name}`,{rule:t.name});return this.#e.set(t.name,t),this}resolveProjection(t){return[...this.#e.values()].reduce((r,n)=>n.resolveProjection?.({...t,outputProperty:r})?.outputProperty??r,t.outputProperty)}resolveQuery(t){return[...this.#e.values()].reduce((r,n)=>n.resolveQuery?.({...t,...r?{query:r}:{}})??r,t.query)}rules(){return[...this.#e.values()]}}const Yn=()=>new Fn([Ka,rc]),Qn=e=>e.id??e.source,Rt=(e,t)=>{if(e===t)return!0;if(e instanceof Date||t instanceof Date)return e instanceof Date&&t instanceof Date&&e.getTime()===t.getTime();if(Array.isArray(e)||Array.isArray(t))return Array.isArray(e)&&Array.isArray(t)&&e.length===t.length&&e.every((o,i)=>Rt(o,t[i]));if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;const r=Object.entries(e),n=t;return r.length===Object.keys(n).length&&r.every(([o,i])=>Object.prototype.hasOwnProperty.call(n,o)&&Rt(i,n[o]))},Me=e=>{if(!e)return[];const t=[];for(const[r,n]of Object.entries(e))if(n!==void 0){if(r==="$or")return;if(r==="$and"){if(!Array.isArray(n))return;for(const o of n){const i=Me(o);if(!i)return;t.push(...i)}continue}if(r.startsWith("$"))return;t.push({property:r,condition:n})}return t},$r=(e,t,r)=>{if(!e)return;const n={};for(const[o,i]of Object.entries(e))if(i!==void 0){if(o==="$and"&&Array.isArray(i)){const s=i.map(a=>$r(a,t,r)).filter(a=>a!==void 0);s.length>0&&(n[o]=s);continue}o!=="$or"&&t.some(s=>Ot(r,s.property,o)&&Rt(s.condition,i))||(n[o]=i)}return Object.keys(n).length>0?n:void 0},Le=(e,t)=>e.properties.find(({id:r,name:n})=>r===t||n===t),Ot=(e,t,r)=>t===r||Le(e,t)?.id===Le(e,r)?.id&&Le(e,t)!==void 0&&Le(e,r)!==void 0,ue=(e,t,r)=>{const n=Le(t,r);return n?(e.mappings??[]).find(i=>i.mappingType==="property"&&i.propertyTarget?.some(s=>Ot(t,s,r)))?.sourceColumn??((e.mappings??[]).some(i=>i.mappingType==="property")?void 0:n.id):void 0},wr=(e,t,r)=>!(e.mappings??[]).some(n=>n.mappingType==="property")||ue(e,t,r)!==void 0,Hn=(e,t,r)=>{if(!e||!(t.mappings??[]).some(i=>i.mappingType==="property"))return;const n=Me(e);if(!n)return"query contains an unsupported logical expression";const o=n.find(({property:i})=>!wr(t,r,i));return o?`query property is not available: ${o.property}`:void 0},bt=e=>[...typeof e.pred=="string"?[e.pred]:e.pred&&!Array.isArray(e.pred)?bt(e.pred):[],...Array.isArray(e.pred)?e.pred.flatMap(t=>typeof t=="string"?[t]:bt(t)):[]],nc=(e,t,r,n,o)=>{if(e.match.schema!==void 0&&e.match.schema!==n)return!1;const i=typeof t.pred=="string"?Le(r,t.pred):void 0,s=Le(r,e.match.pred),a=typeof t.pred=="string"&&Ot(r,t.pred,e.match.pred)&&!!(i&&s);if(t.operator!==e.match.operator||!a||Array.isArray(t.pred)||t.args&&Object.keys(t.args).length>0)return!1;const c=Me(e.match.query);return c!==void 0&&c.every(u=>o.some(d=>Ot(r,d.property,u.property)&&Rt(d.condition,u.condition)))},oc=(e,t,r)=>{const n=(r.mappings??[]).flatMap(l=>{if(l.mappingType!=="predItem"||!l.sourceColumn||!l.predItem||!l.predItem.operator||typeof l.predItem.pred!="string")return[];const f=l.predItem,m=f.operator,y=f.pred;return!m||typeof y!="string"?[]:[{match:{operator:m,pred:y,...f.schema?{schema:f.schema}:{},...f.query?{query:f.query}:{}},column:l.sourceColumn}]}),o=(r.mappings??[]).some(l=>l.mappingType==="property");if(n.length===0&&!o)return{mapping:r,logicform:e,predRewrites:[],priority:r.priority??0,specificity:0};const i=Me(e.query);if(!i&&n.length>0)return"query contains $or or another unsupported logical expression";const s=Y(e),a=[],c=[];for(const[l,f]of(e.preds??[]).entries()){const m=Me(f.query);if(!m&&n.length>0)return`PredItem ${l} query contains an unsupported logical expression`;if(n.length>0){const g=[...i??[],...m??[]],_=n.filter(h=>nc(h,f,t,f.schema??t.id,g));if(_.length===0)return`PredItem ${l} is not mapped`;if(_.length>1)return`PredItem ${l} matches multiple mapping rules`;const R=_[0],$=Me(R.match.query)??[];c.push(...$);const E=s.preds?.[l];if(E){const h=$r(E.query,$,t);h?E.query=h:delete E.query}a.push({predIndex:l,column:R.column});continue}const y=bt(f).find(g=>!wr(r,t,g));if(y)return`PredItem ${l} property is not available: ${y}`}const u=$r(s.query,c,t);u?s.query=u:delete s.query;const d=Hn(s.query,r,t);if(d)return d;for(const[l,f]of(s.preds??[]).entries()){const m=Hn(f.query,r,t);if(m)return`PredItem ${l} ${m}`}for(const l of s.groupby??[]){const m=bt(l).find(y=>!wr(r,t,y));if(m)return`groupby property is not available: ${m}`}return{mapping:r,logicform:s,predRewrites:a,priority:r.priority??0,specificity:a.length}},ic=(e,t,r)=>{const n=[],o=[];for(const a of r.list(t.id)){const c=oc(e,t,a);typeof c=="string"?o.push({mappingId:Qn(a),reason:c}):n.push(c)}if(n.length===0){const a=t.name&&t.name!==t.id?`${t.name}(${t.id})`:t.id;throw new p("QUERY_NOT_COVERED_BY_DATA_SOURCE",`Schema\u300C${a}\u300D\u5F53\u524D\u63A5\u5165\u7684\u6570\u636E\u4E0D\u652F\u6301\u6B64\u95EE\u9898\u3002\u5982\u9700\u652F\u6301\uFF0C\u9700\u8981\u63A5\u5165\u660E\u7EC6\u5C42\u6570\u636E\uFF0C\u8BF7\u8054\u7CFB\u6570\u636E\u7BA1\u7406\u5458\u3002`,{schemaId:t.id,requiredDataLayer:"detail",rejectedMappings:o})}n.sort((a,c)=>c.priority-a.priority||c.specificity-a.specificity);const i=n[0],s=n.filter(({priority:a,specificity:c})=>a===i.priority&&c===i.specificity);if(s.length>1)throw new p("SCHEMA_MAPPING_AMBIGUOUS",`Multiple Schema mappings cover the LogicForm for ${t.id}`,{schemaId:t.id,mappingIds:s.map(({mapping:a})=>Qn(a))});return i},sc=(e,t)=>`result:${e}:${t.map(({name:r,type:n,primal_type:o})=>`${r}:${n}:${o}`).join("|")}`,Gn=(e,t)=>{const r=(e.columnProperties??[]).map(n=>({...n,id:n.name}));return{id:sc(e.schemaId,e.columnProperties??[]),name:`${t.name} result`,type:t.type,temporalSemantics:"normal",properties:r}},Wn=(e,t)=>({...Gn(e,t),id:t.id,name:t.name,type:t.type}),Ar=e=>{if(!e.name)throw new p("MISSING_PRED_NAME","Planner requires every normalized PredItem to have a name");return e.name},ac=(e,t,r)=>{const n=new Set(r),o=(i,s)=>{if(!(ye(i)||i===null)){if(Array.isArray(i)){i.forEach(a=>o(a,s));return}if(typeof i=="object"){Object.entries(i).forEach(([a,c])=>{["args","$exists","$regex","$contains"].includes(a)||o(c,a)});return}if(!(s&&["args","$exists","$regex","$contains"].includes(s))&&(typeof i!="string"||!n.has(i)))throw new p("COMPARABLE_VALUE_NOT_FOUND",`Comparable category ${t} does not contain value: ${JSON.stringify(i)}`,{property:t,value:i})}};o(e)},cc=(e,t,r)=>{if(!t.udf)return{};const o=t.udf.sql.includes("$TS")?e.properties.find(({type:i})=>i==="timestamp")?.id:void 0;return{sql:t.udf.sql,...o?{timestampColumn:o}:{},...o&&r?{timestampQualifier:r}:{}}},zn=e=>e.sql?{kind:"property-sql",schemaId:e.schemaId,property:e.property,propertyId:e.column,sql:e.sql,qualifier:e.qualifier,...e.timestampColumn?{timestampColumn:e.timestampColumn}:{},...e.timestampQualifier?{timestampQualifier:e.timestampQualifier}:{}}:{kind:"column",...e},Kn=(e,t,r={})=>({name:e,type:t.type,primal_type:t.primal_type,isArray:t.isArray,...t.ref?{ref:t.ref}:{},...t.comparable?{comparable:t.comparable}:{},...r}),rt=(e,t,r,n,o,i,s,a,c="projection")=>{const u=Ar(e);if(c==="groupby"&&e.query)throw new p("GROUPBY_QUERY_NOT_ALLOWED","A groupby expression cannot define pred.query");if(!e.operator){if(typeof e.pred!="string")throw new p("PRED_PROPERTY_REQUIRED","A projection must reference a property");const $=r(e.pred);return{expression:zn($.field),outputProperty:Kn($.reference,$.property),sourceProperty:$.property,sourceField:$.field}}const d=t.get(e.operator);if(c==="groupby"&&d.kind!=="scalar")throw new p("OPERATOR_NOT_ALLOWED_IN_GROUPBY",`Operator ${e.operator} cannot be used in groupby`,{operator:e.operator});if(c==="groupby"&&!d.toSQL)throw new p("JAVASCRIPT_OPERATOR_NOT_ALLOWED_IN_GROUPBY",`JavaScript-only operator ${e.operator} cannot be used in groupby`,{operator:e.operator});if(d.planInput&&typeof e.pred!="string")throw new p("OPERATOR_DIRECT_PROPERTY_REQUIRED",`${e.operator} requires a direct property pred`);const l=d.planInput&&typeof e.pred=="string"?d.planInput({reference:e.pred,args:e.args??{},schema:s,...a?{resolveSchema:a}:{}}):void 0,f=l?.reference??e.pred,m=l?.args??e.args??{},y=f&&typeof f=="object"&&!Array.isArray(f)?rt(f,t,r,n,o,i,s,a,c):typeof f=="string"?rt({pred:f,name:f},t,r,n,o,i,s,a,c):void 0,g=Array.isArray(f)?f.map($=>rt(typeof $=="string"?{pred:$,name:$}:$,t,r,n,o,i,s,a,c)):[];if(d.requiresProperty!==!1&&!y&&g.length===0)throw new p("PRED_PROPERTY_REQUIRED",`${e.operator} requires a property`);const _=u,R=d.getOutputProperty?.({name:_,...y?.sourceProperty?{property:y.sourceProperty}:{},...y?{inputProperty:{...y.outputProperty,name:_}}:{},...g.length>0?{inputProperties:g.map(({outputProperty:$})=>$)}:{},args:m})??(y?Kn(_,y.outputProperty,{isArray:!1}):{name:_,type:"number",primal_type:"number",isArray:!1});if(d.planExpression){const $=d.planExpression({pred:e,...y?{input:y.expression,inputProperty:y.outputProperty}:{},inputs:g.map(({expression:E})=>E),args:m,resolveKey:o,getOperator:E=>t.get(E),planQuery:i});if($)return{expression:$,outputProperty:R,...y?.sourceProperty?{sourceProperty:y.sourceProperty}:{},...y?.sourceField?{sourceField:y.sourceField}:{}}}if(d.kind==="window"){if(!y||g.length>0||e.query)throw new p("INVALID_WINDOW_OPERATOR_INPUT",`${e.operator} requires exactly one nested pred and does not accept pred.query`);const $=e.args?.direction??"desc";if($!=="asc"&&$!=="desc")throw new p("INVALID_WINDOW_ARGS",`${e.operator} direction must be asc or desc`);const E=e.args?.partitionBy??[];if(!Array.isArray(E)||E.some(h=>typeof h!="string"))throw new p("INVALID_WINDOW_ARGS",`${e.operator} partitionBy must be an array of groupby names`);return{expression:{kind:"window",function:d.windowFunction,input:y.expression,partitionBy:E.map(h=>n(String(h))),direction:$==="asc"?"ASC":"DESC"},outputProperty:R}}return{expression:{kind:"operator",operator:e.operator,args:m,...e.query?{query:i(e.query)}:{},...y?{input:y.expression}:{},...g.length>0?{inputs:g.map(({expression:$})=>$)}:{},...y?.sourceProperty?{property:y.sourceProperty.name,column:y.sourceProperty.id}:{},...y?.sourceField?{qualifier:y.sourceField.qualifier,schemaId:y.sourceField.schemaId}:{}},outputProperty:R,...y?.sourceProperty?{sourceProperty:y.sourceProperty}:{},...y?.sourceField?{sourceField:y.sourceField}:{}}},uc=(e,t,r,n,o,i,s,a,c,u,d,l=e)=>{const f=Ar(e),m=typeof e.pred=="string"?e.pred:void 0,y=!u||!m?r:$=>{const E=r($);return $===m?{...E,field:{...E.field,column:u}}:E},g=d?{...e,operator:d}:e,_=rt(g,t,y,n,o,i,s,a),R=c?.resolveProjection({pred:l,schema:s,..._.sourceProperty?{sourceProperty:_.sourceProperty}:{},outputProperty:{..._.outputProperty,name:f},...l.operator?{operator:t.get(l.operator)}:{}})??{..._.outputProperty,name:f};return{name:f,expression:_.expression,outputProperty:R}},dc=e=>{const t=new Set;for(const r of e){if(r.name==="_id")throw new p("RESERVED_OUTPUT_NAME","Output name _id is reserved for executor-owned row identity");if(t.has(r.name))throw new p("DUPLICATE_OUTPUT_NAME",`Duplicate output name: ${r.name}`);t.add(r.name)}},Er=(e,t,r)=>{if(!e.schema||e.schema===t.id)return t;const n=r.resolveSchema?.(e.schema);if(!n)throw new p("SCHEMA_RESOLVER_REQUIRED",`Cannot plan nested LogicForm schema without a schema resolver: ${e.schema}`,{schemaId:e.schema});return n},pc=(e,t,r,n,o,i)=>{if(t.length<2)throw new p("COMPOSITION_REQUIRES_MULTIPLE_BRANCHES","A cross-Schema plan requires at least two branches");const s=t.map(g=>he(g,Er(g,r,i),n,o,i)),a=s[0]?.groupBy.map(({name:g})=>g)??[];for(const g of s){const _=g.groupBy.map(({name:R})=>R);if(_.length!==a.length||_.some((R,$)=>R!==a[$]))throw new p("INCOMPATIBLE_COMPOSITION_GROUPBY","All composed LogicForm objects must have the same groupby output names in the same order",{expected:a,received:_});if(g.rowIdentity.kind!==(a.length>0?"group":"singleton"))throw new p("UNSTABLE_COMPOSITION_IDENTITY","Composed LogicForm objects must be grouped or aggregate to a singleton row")}const c=[],u=[],d=new Map;s.forEach((g,_)=>{g.projections.forEach((R,$)=>{const E=a.includes(R.name),h=d.get(R.name);if(h!==void 0&&!E)throw new p("DUPLICATE_COMPOSITION_OUTPUT",`Composed LogicForm objects produce the same output: ${R.name}`,{name:R.name,childIndexes:[h,_]});if(h!==void 0)return;d.set(R.name,_),c.push({name:R.name,expression:{kind:"column",property:R.name,column:R.name}});const S=g.columnProperties?.[$];S&&u.push(S)})});const l=new Set(c.map(({name:g})=>g)),f=Object.entries(e.sort??{}).map(([g,_])=>{if(!l.has(g))throw new p("INVALID_SORT",`Sort field is not an output: ${g}`);const R=u.find($=>$.name===g);return{name:g,direction:_===1?"ASC":"DESC",...R?.comparable?{comparable:R.comparable}:{},...R?.comparable?{expression:{kind:"column",property:g,column:g}}:{}}}),m=e.limitBy===void 0||a.length<2?void 0:{count:e.limitBy,partitionBy:a.slice(0,-1),orderBy:f.length>0?f:(()=>{const g=a.at(-1)??"",_=u.find(R=>R.name===g);return[{name:g,direction:"ASC",..._?.comparable?{comparable:_.comparable}:{}}]})()},y=e.limitBy!==void 0&&a.length<2?{kind:"rows",page:1,pageSize:e.limitBy}:void 0;return{schemaId:r.id,source:"",subplans:s,fields:Object.fromEntries(c.map(({name:g})=>[g,g])),projections:c,columnProperties:u,groupBy:c.filter(({name:g})=>a.includes(g)),orderBy:f,rowIdentity:a.length>0?{kind:"group",names:a,separator:"_",nullLabel:"\u7A7A\u503C"}:{kind:"singleton"},...m?{groupLimit:m}:{},...y?{pagination:y}:{}}},he=(e,t,r=Ie(),n=new hr,o={})=>{const i=[...new Set((e.preds??[]).map(w=>w.schema).filter(w=>!!(w&&w!==t.id)))];if(i.length>0){const w=e.propertyResolve??{},A=[t.id,...i].map(I=>({...e,schema:I,preds:(e.preds??[]).filter(b=>(b.schema??t.id)===I).map(({schema:b,...T})=>T),...I===t.id||!e.query?{}:{query:Object.fromEntries(Object.entries(e.query).map(([b,T])=>{let P=b;try{P=z(t,b,o.resolveSchema).canonicalName}catch{}return[w[I]?.[b]??w[I]?.[P]??b,T]}))},...I!==t.id&&e.groupby?{groupby:e.groupby.map(b=>({...b,...typeof b.pred=="string"?{pred:w[I]?.[b.pred]??(()=>{try{return w[I]?.[z(t,b.pred,o.resolveSchema).canonicalName]??b.pred}catch{return b.pred}})()}:{}}))}:{}}));return pc(e,A,t,r,n,o)}for(const w of e.preds??[]){if(!w.operator)continue;const A=r.get(w.operator).rewriteLogicform?.({logicform:e,schema:t,getOperator:I=>r.get(I)});if(A)return he(A,t,r,n,o)}const s=o.semanticRegistry??Yn();if(e.from){const w=Er(e.from,t,o),A=he(e.from,w,r,n,o),I=Wn(A,t),b={...e};delete b.from,b.schema??=I.id;const T=he(b,I,r,n,o),P=new Set(T.projections.map(({name:U})=>U)),O=A.rowIdentity.kind==="group"&&A.rowIdentity.names.every(U=>P.has(U))||A.rowIdentity.kind==="singleton"?A.rowIdentity:{kind:"generated"};return{...T,source:A.source,sourcePlan:A,sourceLogicform:e.from,rowIdentity:O}}if(!e.schema)throw new p("LOGICFORM_SCHEMA_REQUIRED","A physical LogicForm must define schema");const a=ic(e,t,n);e=a.logicform;const c=new Map(a.predRewrites.map(({predIndex:w,column:A})=>[w,A])),u=tt(t),d=u?tc(e,u):void 0,l=za(e,t),f=s.resolveQuery({logicform:e,schema:t,...e.query?{query:e.query}:{}}),m=l?Wa(f,l.timestamp):f,y=t.id,g=new Map,_=new Map,R=new Map,$=w=>{const A=z(t,w,o.resolveSchema);let I=y;const b=[];for(const P of A.relations){b.push(P.property.name);const O=b.join("_"),U=O;if(!g.has(O)){const M=P.targetSchema.properties.filter(({type:Ee})=>Ee==="ID"),[C]=M;if(M.length!==1||!C)throw new p(P.targetSchema.temporalSemantics==="snapshot"?"SNAPSHOT_JOIN_REQUIRES_ID_AND_TIMESTAMP":"RELATION_TARGET_ID_REQUIRED",P.targetSchema.temporalSemantics==="snapshot"?`Snapshot Schema ${P.targetSchema.id} requires an ID Property when joined`:`Relation target ${P.targetSchema.id} must contain exactly one ID property`,{schemaId:P.targetSchema.id,count:M.length});const B=P.sourceSchema.id===t.id?a.mapping:n.get(P.sourceSchema.id),F=n.get(P.targetSchema.id),oe=ue(B,P.sourceSchema,P.property.name)??P.property.id,H=ue(F,P.targetSchema,C.name)??C.id,G=P.sourceSchema.properties.find(({type:Ee})=>Ee==="timestamp"),se=P.targetSchema.properties.find(({type:Ee})=>Ee==="timestamp"),pe=tt(P.targetSchema),le=G?ue(B,P.sourceSchema,G.name)??G.id:void 0,Ne=se?ue(F,P.targetSchema,se.name)??se.id:void 0;if(P.targetSchema.temporalSemantics==="snapshot"){if(!se)throw new p("SNAPSHOT_JOIN_REQUIRES_ID_AND_TIMESTAMP",`Snapshot Schema ${P.targetSchema.id} requires an ID and timestamp Property when joined`,{schemaId:P.targetSchema.id});if(!G)throw new p("SNAPSHOT_JOIN_SOURCE_TIMESTAMP_REQUIRED",`Snapshot Schema ${P.targetSchema.id} cannot join from a Schema without a timestamp Property`,{schemaId:P.sourceSchema.id});const Ee=["second","minute","hour","day","week","month","quarter","year"],Yt=G.granularity??"day",Qt=se.granularity??"day";if(Ee.indexOf(Yt)>Ee.indexOf(Qt))throw new p("SNAPSHOT_JOIN_GRANULARITY_TOO_COARSE",`Cannot join ${P.targetSchema.id} snapshot granularity ${Qt} to coarser source granularity ${Yt}`,{sourceSchemaId:P.sourceSchema.id,targetSchemaId:P.targetSchema.id,sourceGranularity:Yt,targetGranularity:Qt})}if(pe&&!G)throw new p("VALIDITY_JOIN_SOURCE_TIMESTAMP_REQUIRED",`Valid-time Schema ${P.targetSchema.id} cannot join from a Schema without a timestamp Property`,{schemaId:P.sourceSchema.id});const Ue=P.property.isArray?O:void 0;Ue&&!_.has(Ue)&&_.set(Ue,{path:Ue,sourceAlias:I,sourceColumn:oe,...P.property.udf?{sourceSql:P.property.udf.sql,...le?{sourceTimestampColumn:le}:{}}:{},alias:`__array_${O}`}),g.set(O,{kind:"left",path:O,sourceAlias:I,sourceColumn:oe,...P.property.udf?{sourceSql:P.property.udf.sql,...le?{sourceTimestampColumn:le}:{}}:{},targetSchemaId:P.targetSchema.id,targetSource:F.source,...F.sourceSql?{targetSourceSql:F.sourceSql}:{},targetAlias:U,targetColumn:H,...Ue?{sourceArrayExpansionPath:Ue}:{},...C.udf?{targetSql:C.udf.sql,...Ne?{targetTimestampColumn:Ne}:{}}:{},...P.targetSchema.temporalSemantics==="snapshot"&&le?{sourceTimestampColumn:le,sourceTimestampGranularity:G?.granularity??"day"}:{},...P.targetSchema.temporalSemantics==="snapshot"&&Ne?{targetTimestampColumn:Ne,targetTimestampGranularity:se?.granularity??"day"}:{},...pe&&le?{sourceTimestampColumn:le,targetValidityStartColumn:ue(F,P.targetSchema,pe.start.name)??pe.start.id,targetValidityEndColumn:ue(F,P.targetSchema,pe.end.name)??pe.end.id}:{}})}I=U}const T={schemaId:A.schema.id,property:A.property.name,propertyId:A.property.id,column:A.relations.length===0?ue(a.mapping,t,A.canonicalName)??A.property.id:A.property.id,qualifier:I,...A.property.isArray?{isArray:!0}:{},...A.property.comparable?{comparable:A.property.comparable}:{},...cc(A.relations.length>0?t:A.schema,A.property,A.relations.length>0?y:I)};return R.set(A.canonicalName,T),{reference:A.canonicalName,schema:A.schema,property:A.property,field:T}},E=w=>{if(w)for(const[A,I]of Object.entries(w))if((A==="$and"||A==="$or")&&Array.isArray(I))for(const b of I)typeof b=="object"&&b!==null&&!Array.isArray(b)&&E(b);else A.startsWith("$")||$(A)},h=w=>{if(ye(w)){const A=Er(w,t,o),I=he(w,A,r,n,o);if(I.projections.length!==1)throw new p("SUBQUERY_SINGLE_COLUMN_REQUIRED",`Query LogicForm must output exactly one column, received ${I.projections.length}`,{schemaId:w.schema,projectionCount:I.projections.length});return{kind:"logicform-subquery",plan:I}}return Array.isArray(w)?w.map(h):typeof w!="object"||w===null||w instanceof Date?w:Object.fromEntries(Object.entries(w).map(([A,I])=>[A,h(I)]))},S=(w,A)=>{if(typeof A!="object"||A===null||Array.isArray(A))throw new p("INVALID_RECURSIVE_QUERY","$recursive must be normalized before planning");const I=A,b=$(w),T=typeof I.schema=="string"?I.schema:b.property.ref??b.schema.id,P=T===t.id?t:o.resolveSchema?.(T);if(!P)throw new p("SCHEMA_RESOLVER_REQUIRED",`$recursive requires Schema ${T}`);const O=P.properties.find(({id:C,name:B})=>C===I.idProperty||B===I.idProperty),U=P.properties.find(({id:C,name:B})=>C===I.parentProperty||B===I.parentProperty);if(!O)throw new p("RECURSIVE_ID_PROPERTY_REQUIRED",`$recursive ID property not found: ${String(I.idProperty)}`);if(!U)throw new p("RECURSIVE_PARENT_PROPERTY_REQUIRED",`$recursive parent property not found: ${String(I.parentProperty)}`);if(!Array.isArray(I.roots)||typeof I.includeSelf!="boolean")throw new p("INVALID_RECURSIVE_QUERY","$recursive must be normalized before planning");const M=n.get(T);return{kind:"recursive-query",schemaId:T,source:M.source,...M.sourceSql?{sourceSql:M.sourceSql}:{},idColumn:O.id,parentColumn:U.id,roots:I.roots,includeSelf:I.includeSelf}},N=w=>Object.fromEntries(Object.entries(w).map(([A,I])=>{if((A==="$and"||A==="$or")&&Array.isArray(I))return[A,I.map(T=>N(T))];if(typeof I=="object"&&I!==null&&!Array.isArray(I)&&Object.prototype.hasOwnProperty.call(I,"$recursive"))return[A,{$recursive:S(A,I.$recursive)}];const b=A.startsWith("$")?void 0:$(A).property.comparable;return[A,b?{kind:"ordinal-query",comparable:b,condition:h(I)}:h(I)]})),k=w=>{const A=b=>{if(!b||typeof b!="object")return!1;if(Array.isArray(b))return b.some(A);const T=b;return Object.prototype.hasOwnProperty.call(T,"$and")||Object.values(T).some(A)};if(A(w))return w;const I=new Set(Object.keys(w).flatMap(b=>{if(b.startsWith("$"))return[];const T=z(t,b,o.resolveSchema);return T.relations.length===1&&T.property.type==="ID"?[T.relations[0]?.property.name]:[]}));return Object.fromEntries(Object.entries(w).map(([b,T])=>{if(b==="$and"||b==="$or")return Array.isArray(T)?[b,T.map(H=>typeof H=="object"&&H!==null&&!Array.isArray(H)?k(H):H)]:[b,T];if(b.startsWith("$"))return[b,T];const P=z(t,b,o.resolveSchema);if(P.relations.length===0)return[b,T];if(P.property.udf?.sql.includes("$TS")===!0||P.relations.some(({property:H})=>H.udf?.sql.includes("$TS")===!0))return[b,T];const U=P.relations.map(({property:H})=>H.name).join("_");if(g.has(U))return[b,T];const[M]=P.relations;if(!M)return[b,T];if(I.has(M.property.name))return[b,T];const C=M.property.name,B=P.canonicalName.slice(C.length+1),F=M.targetSchema.properties.find(({type:H})=>H==="ID");if(!F)throw new p("RELATION_TARGET_ID_REQUIRED",`Relation target ${M.targetSchema.id} must contain an ID property`,{schemaId:M.targetSchema.id});if(P.relations.length===1&&P.property.id===F.id)return[M.property.id,T];const oe={version:e.version,schema:M.targetSchema.id,query:B?{[B]:T}:{},preds:[{pred:F.name,name:F.name}]};return[M.property.id,{$in:oe}]}))},j=(e.groupby??[]).map(w=>{const A=Ar(w);if(w.operator==="$case"&&w.args?.mode==="auto"&&(w.args.min===void 0||w.args.max===void 0))throw new p("AUTO_CASE_GROUPBY_REQUIRES_BOUNDS","$case auto mode in groupby requires explicit args.min and args.max");const I=rt(w,r,$,v,K,N,t,o.resolveSchema,"groupby");let b=I.expression;if(d?.group===w&&(b={kind:"column",schemaId:t.id,property:u?.timestamp.name??A,...u?.timestamp.id?{propertyId:u.timestamp.id}:{},column:"__period_start",qualifier:"__validity_periods"}),l?.group===w&&(b={kind:"column",schemaId:t.id,property:l.timestamp.name,propertyId:l.timestamp.id,column:"__period_start",qualifier:"__observation_periods"}),I.sourceProperty?.isArray&&I.sourceField){const T=`groupby:${A}`;_.set(T,{path:T,sourceAlias:I.sourceField.qualifier,sourceColumn:I.sourceField.column,...I.sourceField.sql?{sourceSql:I.sourceField.sql,...I.sourceField.timestampColumn?{sourceTimestampColumn:I.sourceField.timestampColumn}:{}}:{},alias:`__array_group_${_.size}`}),b={kind:"array-element",schemaId:I.sourceField.schemaId,property:I.sourceProperty.name,expansionPath:T}}return{name:A,expression:b,outputProperty:{...I.outputProperty,name:A,isArray:!1}}});function v(w){const A=(e.groupby??[]).findIndex(b=>typeof b.pred=="string"&&b.pred===w||b.name===w),I=A>=0?j[A]:void 0;if(!I)throw new p("WINDOW_PARTITION_NOT_GROUPED",`Window partition must reference a groupby item: ${w}`);return I.expression}function K(w){const A=(e.groupby??[]).findIndex(b=>typeof b.pred=="string"&&b.pred===w||b.name===w),I=A>=0?j[A]:void 0;return I?I.expression:zn($(w).field)}const D=w=>{w.operator&&r.get(w.operator).validatePlan?.({pred:w,groupByNames:j.map(({name:A})=>A),resolveGroupName:A=>{const I=(e.groupby??[]).findIndex(b=>b.name===A||typeof b.pred=="string"&&b.pred===A);return I>=0?j[I]?.name:void 0},getOperator:A=>r.get(A)}),w.pred&&typeof w.pred=="object"&&!Array.isArray(w.pred)&&D(w.pred);for(const A of Array.isArray(w.pred)?w.pred:[])D(typeof A=="string"?{pred:A}:A)};for(const w of e.preds??[])D(w);const L=[...j,...(e.preds??[]).map((w,A)=>{const b=l?.metrics.find(T=>T.pred===w)?.effectivePred??w;return uc(b,r,$,v,K,N,t,o.resolveSchema,s,c.get(A),gn(b,e.groupby??[],t,o.resolveSchema)?"$min":void 0,w)})],V=w=>Object.fromEntries(Object.entries(w).map(([A,I])=>{if((A==="$and"||A==="$or")&&Array.isArray(I))return[A,I.map(T=>V(T))];const b=L.find(({name:T})=>T===A)?.outputProperty.comparable;return b&&ac(I,A,b.values),[A,b?{kind:"ordinal-query",comparable:b,condition:h(I)}:h(I)]})),q=m?k(m):void 0;E(q);const re=w=>{E(w.query),w.pred&&typeof w.pred=="object"&&!Array.isArray(w.pred)&&re(w.pred);for(const A of Array.isArray(w.pred)?w.pred:[])re(typeof A=="string"?{pred:A}:A)};for(const w of e.preds??[])re(w);if(L.length===0)throw new p("EMPTY_PROJECTION","LogicForm must contain preds or groupby");dc(L);const W=new Set(L.map(({name:w})=>w)),Z=j.length>0?{kind:"group",names:j.map(({name:w})=>w),separator:"_",nullLabel:"\u7A7A\u503C"}:L.every(({expression:w})=>w.kind==="column")||L.some(({expression:w})=>w.kind==="property-sql"&&t.properties.some(({id:A,type:I})=>I==="ID"&&A===w.propertyId))?(()=>{const w=t.properties.find(({type:A})=>A==="ID");return w&&(o.canUsePropertyRowIdentity?.(t,w)??!0)?{kind:"property",column:w.id,internalName:"_id"}:{kind:"generated"}})():{kind:"singleton"},ne=Object.entries(e.sort??{}).map(([w,A])=>{if(!W.has(w))throw new p("INVALID_SORT",`Sort field is not an output: ${w}`);const I=L.find(b=>b.name===w);return{name:w,direction:A===1?"ASC":"DESC",...I?.outputProperty.comparable?{comparable:I.outputProperty.comparable,expression:I.expression}:{}}}),X=e.limit===void 0?void 0:e.limit>0&&e.limit<1?{kind:"ratio",page:e.page??1,ratio:e.limit}:{kind:"rows",page:e.page??1,pageSize:e.limit},ce=e.limitBy===void 0?void 0:{count:e.limitBy,partitionBy:j.slice(0,-1).map(({name:w})=>w),orderBy:ne.length>0?ne:(()=>{const w=j.at(-1);return[{name:w?.name??"",direction:"ASC",...w?.outputProperty.comparable?{comparable:w.outputProperty.comparable,expression:w.expression}:{}}]})()},Q=R.size===0&&g.size===0&&_.size===0&&!q&&j.length===0&&L.length>0&&L.every(({expression:w})=>w.kind==="operator"&&w.operator==="$constant");return{schemaId:t.id,source:Q?"":a.mapping.source,...!Q&&a.mapping.sourceSql?{sourceSql:a.mapping.sourceSql}:{},mappingId:a.mapping.id??a.mapping.source,sourceAlias:y,fields:{...Wi(t),...Object.fromEntries(t.properties.flatMap(w=>{const A=ue(a.mapping,t,w.name);return A?[[w.name,A],[w.id,A]]:[]}))},fieldReferences:Object.fromEntries(R),joins:[...g.values()],arrayExpansions:[..._.values()],...d&&u?{validityPeriods:{alias:"__validity_periods",labelColumn:"__period_start",asOfColumn:"__as_of",sourceAlias:y,startColumn:ue(a.mapping,t,u.start.name)??u.start.id,endColumn:ue(a.mapping,t,u.end.name)??u.end.id,periods:d.periods}}:{},...l?{observationPeriods:{alias:"__observation_periods",labelColumn:"__period_start",asOfColumn:"__as_of",sourceAlias:y,lookupAlias:"__observation_lookup",timestampColumn:ue(a.mapping,t,l.timestamp.name)??l.timestamp.id,periods:l.periods}}:{},projections:L.map(({name:w,expression:A})=>({name:w,expression:A})),columnProperties:L.map(({outputProperty:w})=>w),groupBy:j.map(({name:w,expression:A})=>({name:w,expression:A})),...q?{query:N(q)}:{},...e.having?{having:V(e.having)}:{},orderBy:ne,rowIdentity:Q?{kind:"singleton"}:Z,...X?{pagination:X}:{},...ce?{groupLimit:ce}:{}}},nt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&e.kind==="logicform-subquery"&&typeof e.plan=="object"&&e.plan!==null,Jn=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&e.kind==="recursive-query",lc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&e.kind==="ordinal-query";class fc{provider;parameterOffset;values=[];constructor(t,r=0){this.provider=t,this.parameterOffset=r}add(t){const r=this.parameterOffset+this.values.length;return this.values.push(t),this.provider.parameter(r,t)}get nextParameterOffset(){return this.parameterOffset+this.values.length}append(t){this.values.push(...t)}}const mc=(e,t)=>{const r=t.split(".");if(r.some(n=>n.length===0))throw new p("INVALID_SOURCE",`Invalid physical source: ${t}`);return r.map(n=>e.quoteIdentifier(n)).join(".")},_r=(e,t,r)=>r===void 0?mc(e,t):`(${r.trim().replace(/;+\s*$/,"")})`,ot=(e,t,r,n,o)=>{const i=Nn(e,[],String,`Property ${t} udf.sql`);if(!i.includes("$TS"))return i;if(!n)throw new p("PROPERTY_UDF_TIMESTAMP_REQUIRED",`Property ${t} udf.sql uses $TS but its evaluation context has no timestamp Property`,{property:t});const s=(o?`${r.quoteIdentifier(o)}.`:"")+r.quoteIdentifier(n);return i.replace(/\$TS/g,s)},ge=(e,t,r,n=!1,o,i,s,a)=>{const c=(u,d)=>n&&d?`${t.quoteIdentifier(d)}.${t.quoteIdentifier(u)}`:t.quoteIdentifier(u);switch(e.kind){case"array-element":if(!a)throw new p("ARRAY_EXPANSION_UNAVAILABLE","Array expansion compiler is unavailable");return a(e.expansionPath);case"column":return c(e.column,e.qualifier);case"property-sql":return ot(e.sql,e.property,t,e.timestampColumn,n?e.timestampQualifier??e.qualifier:void 0);case"window":{if(ae(e.input,r))throw new p("UNSUPPORTED_MIXED_OPERATOR","Window operators cannot consume a JavaScript operator");const u=e.partitionBy.length>0?`PARTITION BY ${e.partitionBy.map(f=>ge(f,t,r,n,o,i,s,a)).join(", ")} `:"",d=ge(e.input,t,r,n,o,i,s,a);return`${e.function==="rank"?"RANK":"ROW_NUMBER"}() OVER (${u}ORDER BY ${d} ${e.direction})`}case"cumulative":{if(ae(e.input,r))throw new p("UNSUPPORTED_MIXED_OPERATOR","Cumulative expressions cannot consume a JavaScript operator");const u=ge(e.input,t,r,n,o,i,s,a),d=e.partitionBy.length>0?`PARTITION BY ${e.partitionBy.map(f=>ge(f,t,r,n,o,i,s,a)).join(", ")} `:"",l=e.orderBy.map(f=>`${ge(f.expression,t,r,n,o,i,s,a)} ${f.direction}`).join(", ");return`${t.aggregateFunction(e.function,u)} OVER (${d}ORDER BY ${l} ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)`}case"ordinal-encode":{if(!i)throw new p("SQL_BINDER_UNAVAILABLE","Ordinal encoding requires a value binder");return`CASE ${e.comparable.values.map((d,l)=>`WHEN ${ge(e.input,t,r,n,o,i,s,a)} = ${i(d)} THEN ${e.comparable.direction*l}`).join(" ")} END`}case"ordinal-decode":{if(!i)throw new p("SQL_BINDER_UNAVAILABLE","Ordinal decoding requires a value binder");return`CASE ${e.comparable.values.map((d,l)=>`WHEN ${ge(e.input,t,r,n,o,i,s,a)} = ${e.comparable.direction*l} THEN ${i(d)}`).join(" ")} END`}case"operator":{const u=r.get(e.operator);if(u.kind==="component")throw new p("COMPONENT_OPERATOR_REQUIRES_EXECUTOR",`${e.operator} must be compiled through the executor component pipeline`);if(u.toSQL&&(e.input&&ae(e.input,r)||e.inputs?.some(f=>ae(f,r))))throw new p("UNSUPPORTED_MIXED_OPERATOR",`${e.operator} cannot consume a JavaScript operator in SQL`);let d=e.input?ge(e.input,t,r,n,o,i,s,a):e.column?c(e.column,e.qualifier):void 0;const l=e.inputs?.map(f=>ge(f,t,r,n,o,i,s,a));if(e.query&&Object.keys(e.query).length>0){if(u.kind!=="aggregate")throw new p("OPERATOR_QUERY_REQUIRES_AGGREGATION",`Pred query is only supported by aggregation operators: ${e.operator}`);if(!o)throw new p("INVALID_OPERATOR_QUERY","Operator query compiler is unavailable");d=`CASE WHEN ${o(e.query)} THEN ${d??"1"} END`}if(u.requiresProperty!==!1&&!d)throw new p("PRED_PROPERTY_REQUIRED",`${e.operator} requires a column`);return u.toSQL?u.toSQL({sql:{aggregateFunction:t.aggregateFunction.bind(t),quoteIdentifier:t.quoteIdentifier.bind(t),concat:t.concat.bind(t),substring:t.substring.bind(t),dateBucket:t.dateBucket.bind(t),dateShift:t.dateShift.bind(t),...t.datePeriodBoundary?{datePeriodBoundary:t.datePeriodBoundary.bind(t)}:{},...t.scalarExtremum?{scalarExtremum:t.scalarExtremum.bind(t)}:{},value:(f,m)=>{if(!i)throw new p("SQL_BINDER_UNAVAILABLE","SQL value binder is unavailable");const y=i(f);return m&&t.castValue?t.castValue(y,m):y},condition:(f,m)=>{if(!s)throw new p("SQL_CONDITION_UNAVAILABLE","SQL condition compiler is unavailable");return s(f,m)}},...d?{expression:d,column:d}:{},...l?{expressions:l}:{},args:e.args}):d??"NULL"}}},ae=(e,t)=>e.kind==="window"?ae(e.input,t)||e.partitionBy.some(r=>ae(r,t)):e.kind==="cumulative"?ae(e.input,t)||e.partitionBy.some(r=>ae(r,t))||e.orderBy.some(r=>ae(r.expression,t)):e.kind==="ordinal-encode"||e.kind==="ordinal-decode"?ae(e.input,t):e.kind==="operator"&&(!t.get(e.operator).toSQL&&!!t.get(e.operator).evaluate||(e.input?ae(e.input,t):!1)||(e.inputs?.some(r=>ae(r,t))??!1)),yc=(e,t)=>e.sourceSql?ot(e.sourceSql,e.sourceColumn,t,e.sourceTimestampColumn,e.sourceAlias):`${t.quoteIdentifier(e.sourceAlias)}.${t.quoteIdentifier(e.sourceColumn)}`,Zn=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&Object.keys(e).some(t=>t.startsWith("$")),hc=(e,t,r)=>{if(!r.supportsRecursiveCte)throw new p("RECURSIVE_QUERY_UNSUPPORTED",`Provider ${r.kind} does not support recursive queries`);if(e.roots.length===0)return"(SELECT NULL WHERE 1 = 0)";const n=r.quoteIdentifier("__recursive_tree__"),o=r.quoteIdentifier("__recursive_id__"),i=r.quoteIdentifier("__recursive_node__"),s=r.quoteIdentifier("__recursive_child__"),a=r.quoteIdentifier(e.idColumn),c=r.quoteIdentifier(e.parentColumn),u=_r(r,e.source,e.sourceSql),d=()=>e.roots.map(y=>t.add(y)).join(", "),l=(y,g=!1)=>e.roots.length===1?`${y} ${g?"<>":"="} ${d()}`:`${y} ${g?"NOT IN":"IN"} (${d()})`,f=`${i}.${a}`,m=e.includeSelf?l(f):`${l(`${i}.${c}`)} AND ${l(f,!0)}`;return`(WITH RECURSIVE ${n}(${o}) AS ( SELECT ${f} FROM ${r.tableAlias(u,"__recursive_node__")} WHERE ${m} UNION SELECT ${s}.${a} FROM ${r.tableAlias(u,"__recursive_child__")} JOIN ${n} ON ${s}.${c} = ${n}.${o}) SELECT DISTINCT ${o} FROM ${n})`},it=(e,t,r,n,o,i,s)=>{if(t==="$recursive"){if(!Jn(r))throw new p("INVALID_RECURSIVE_QUERY","$recursive query was not planned");return`${e} IN ${hc(r,n,o)}`}if(t==="$eq"&&r===null)return`${e} IS NULL`;if(t==="$ne"&&r===null)return`${e} IS NOT NULL`;const c={$eq:"=",$ne:"<>",$gt:">",$gte:">=",$lt:"<",$lte:"<="}[t];if(c){const u=nt(r)?`(${i(r)})`:n.add(r);return`${e} ${c} ${u}`}if(t==="$in"||t==="$nin"){const u=t==="$in"?"IN":"NOT IN";if(nt(r))return`${e} ${u} (${i(r)})`;if(!Array.isArray(r))throw new p("INVALID_QUERY_VALUE",`${t} requires an array or query LogicForm`);if(r.length===0)return t==="$in"?"0 = 1":"1 = 1";const d=r.filter(nt);if(d.length>0){if(d.length!==r.length)throw new p("MIXED_SUBQUERY_VALUES",`${t} cannot mix query LogicForm objects and literal values`);return`${e} ${u} (${d.map(i).join(" UNION ALL ")})`}const l=r.map(f=>n.add(f)).join(", ");return`${e} ${u} (${l})`}if(nt(r))throw new p("UNSUPPORTED_SUBQUERY_OPERATOR",`Query LogicForm is not supported by ${t}`);if(t==="$exists")return`${e} IS ${r?"NOT ":""}NULL`;if(t==="$contains")return`${e} LIKE ${n.add(`%${String(r)}%`)}`;if(t==="$regex"){if(typeof r!="string"||s!==void 0&&typeof s!="string")throw new p("INVALID_QUERY_VALUE","$regex requires a string pattern and args.options must be a string");return o.regex(e,n.add(r),s)}throw new p("UNSUPPORTED_QUERY_OPERATOR",`Unsupported query operator: ${t}`)},Nt=(e,t,r,n,o)=>{if(lc(t)){const c=()=>`CASE ${t.comparable.values.map((f,m)=>`WHEN ${e} = ${r.add(f)} THEN ${t.comparable.direction*m}`).join(" ")} END`,u=new Set(["$gt","$gte","$lt","$lte"]),d=l=>typeof l!="object"||l===null||Array.isArray(l)?Nt(e,l,r,n,o):Object.entries(l).filter(([f])=>f!=="args").map(([f,m])=>(f==="$and"||f==="$or")&&Array.isArray(m)?`(${m.map(d).join(f==="$and"?" AND ":" OR ")})`:u.has(f)?it(c(),f,t.comparable.direction*t.comparable.values.indexOf(String(m)),r,n,o):it(e,f,m,r,n,o)).join(" AND ");return d(t.condition)}if(Array.isArray(t))return it(e,"$in",t,r,n,o);if(!Zn(t))return it(e,"$eq",t,r,n,o);const i=[],s=t.args;if(s!==void 0){if(typeof s!="object"||s===null||Array.isArray(s))throw new p("INVALID_QUERY_VALUE","Query args.options must be a string");const c=s.options;if(c!==void 0&&typeof c!="string")throw new p("INVALID_QUERY_VALUE","Query args.options must be a string")}const a=s?.options;for(const[c,u]of Object.entries(t))if(c==="$and"||c==="$or"){if(!Array.isArray(u))throw new p("INVALID_QUERY_VALUE",`${c} requires an array`);const d=u.map(l=>Nt(e,l,r,n,o));i.push(`(${d.join(c==="$and"?" AND ":" OR ")})`)}else c!=="args"&&i.push(it(e,c,u,r,n,o,c==="$regex"?a:void 0));if(i.length===0)throw new p("EMPTY_QUERY_CONDITION","Query condition contains no operators");return i.join(" AND ")},Xn=(e,t,r,n)=>{if(!n.arrayContains)throw new p("ARRAY_CONDITION_UNSUPPORTED",`Provider ${n.kind} does not support array conditions`);const o=n.arrayContains.bind(n),i=a=>o(e,r.add(a));if(Array.isArray(t))return`(${t.map(i).join(" OR ")})`;if(!Zn(t))return i(t);const s=[];for(const[a,c]of Object.entries(t))if(a==="$and"||a==="$or"){if(!Array.isArray(c))throw new p("INVALID_QUERY_VALUE",`${a} requires an array`);const u=c.map(d=>Xn(e,d,r,n));s.push(`(${u.join(a==="$and"?" AND ":" OR ")})`)}else if(a==="$eq")s.push(i(c));else if(a==="$ne")s.push(`NOT (${i(c)})`);else if(a==="$in"||a==="$nin"){if(!Array.isArray(c))throw new p("INVALID_QUERY_VALUE",`${a} requires an array`);const u=c.map(i),d=u.length===0?a==="$in"?"0 = 1":"1 = 1":u.join(a==="$in"?" OR ":" AND NOT ");s.push(a==="$nin"&&u.length>0?`NOT (${u.join(" OR ")})`:`(${d})`)}else if(a==="$exists")s.push(`${e} IS ${c?"NOT ":""}NULL`);else if(a!=="args")throw new p("UNSUPPORTED_ARRAY_QUERY_OPERATOR",`Unsupported array query operator: ${a}`);if(s.length===0)throw new p("EMPTY_QUERY_CONDITION","Query condition contains no operators");return s.join(" AND ")},xe=(e,t,r,n,o,i)=>{const s=[];for(const[a,c]of Object.entries(e)){if(a==="$and"||a==="$or"){if(!Array.isArray(c))throw new p("INVALID_QUERY_VALUE",`${a} requires an array`);const d=c.map(l=>{if(typeof l!="object"||l===null||Array.isArray(l))throw new p("INVALID_QUERY_VALUE",`${a} items must be query objects`);return xe(l,t,r,n,o,i)});s.push(`(${d.join(a==="$and"?" AND ":" OR ")})`);continue}const u=t(a);s.push(r(a)?Xn(u,c,n,o):Nt(u,c,n,o,i))}return s.join(" AND ")},Pt=(e,t,r,n,o)=>e.orderBy.map(i=>{const s=t.quoteIdentifier(i.name),a=`${n?`${n}.`:""}${s}`,c=i.comparable,u=!n&&o&&i.expression?o(i.expression):a;return`${c?`CASE ${c.values.map((l,f)=>`WHEN ${u} = ${r.add(l)} THEN ${c.direction*f}`).join(" ")} END`:a} ${i.direction}`}).join(", "),Sr=(e,t)=>{let r=e;for(;t.has(r);)r=`_${r}`;return r},eo=(e,t,r,n)=>t.concat(e.flatMap((o,i)=>[...i>0?[`'${r.replaceAll("'","''")}'`]:[],`CASE WHEN ${o} IS NULL THEN '${n.replaceAll("'","''")}' ELSE ${t.stringify(o)} END`])),gc=(e,t,r,n,o)=>{const i=new Set(t.projections.map(({name:j})=>j)),s="__sdb_page_source",a="__sdb_page",c=n.quoteIdentifier(s),u=n.quoteIdentifier(a),d=Sr("__sdb_row_number",i),l=Sr("__sdb_total_rows",i),f=n.quoteIdentifier(d),m=n.quoteIdentifier(l),y=Pt(t,n,o,c),g=y?`ORDER BY ${y}`:"",_=`CEIL(${m} * ${r.ratio})`,R=r.page-1,$=r.page,h=[...t.projections.map(({name:j})=>j),...t.rowIdentity.kind==="property"?[t.rowIdentity.internalName]:[],...t.rowIdentity.kind==="group"?["_id"]:[]].map(j=>`${u}.${n.quoteIdentifier(j)}`).join(", "),S=Pt(t,n,o,u),N=`SELECT ${c}.*, ROW_NUMBER() OVER (${g}) AS ${f}, COUNT(*) OVER () AS ${m} FROM ${n.tableAlias(`(${e})`,s)}`;let k=`SELECT ${h} FROM ${n.tableAlias(`(${N})`,a)} WHERE ${u}.${f} > ${R} * ${_} AND ${u}.${f} <= ${$} * ${_}`;return S&&(k+=` ORDER BY ${S}`),k},to=(e,t,r,n)=>{const o=t.groupLimit;if(!o)return e;const i="__sdb_limit_by_source",s="__sdb_limit_by_ranked",a=r.quoteIdentifier(i),c=r.quoteIdentifier(s),u=new Set(t.projections.map(({name:$})=>$)),d=Sr("__sdb_limit_by_row_number",u),l=r.quoteIdentifier(d),f=o.partitionBy.map($=>`${a}.${r.quoteIdentifier($)}`).join(", "),m=o.orderBy.map(({name:$,direction:E,comparable:h})=>{const S=`${a}.${r.quoteIdentifier($)}`;return`${h?`CASE ${h.values.map((k,j)=>`WHEN ${S} = ${n.add(k)} THEN ${h.direction*j}`).join(" ")} END`:S} ${E}`}).join(", "),g=[...t.projections.map(({name:$})=>$),...t.rowIdentity.kind==="property"?[t.rowIdentity.internalName]:[],...t.rowIdentity.kind==="group"?["_id"]:[]].map($=>`${c}.${r.quoteIdentifier($)}`).join(", "),_=`PARTITION BY ${f} ORDER BY ${m}`,R=`SELECT ${a}.*, ROW_NUMBER() OVER (${_}) AS ${l} FROM ${r.tableAlias(`(${e})`,i)}`;return`SELECT ${g} FROM ${r.tableAlias(`(${R})`,s)} WHERE ${c}.${l} <= ${o.count}`},fe=(e,t,r=Ie(),n=0)=>{const o=new fc(t,n);if(e.subplans){const h=e.projections.map(({name:v})=>v),S=e.subplans.map((v,K)=>{const D=fe(v,t,r,o.nextParameterOffset);o.append(D.parameters);const L=`__composition_child_${K}`,V=t.quoteIdentifier(L),q=new Set(v.projections.map(({name:re})=>re));return{aliasName:L,alias:V,available:q,sql:D.sql}}),N=S[0];if(!N)throw new p("INVALID_COMPOSITION","Composition has no children");const k=h.map(v=>`${(S.find(D=>D.available.has(v))??N).alias}.${t.quoteIdentifier(v)} AS ${t.quoteIdentifier(v)}`);e.rowIdentity.kind==="group"&&k.push(`${N.alias}.${t.quoteIdentifier("_id")} AS ${t.quoteIdentifier("_id")}`);let j=`SELECT ${k.join(", ")} FROM ${t.tableAlias(`(${N.sql})`,N.aliasName)}`;for(const v of S.slice(1))j+=` LEFT JOIN ${t.tableAlias(`(${v.sql})`,v.aliasName)}`,j+=e.rowIdentity.kind==="group"?` ON ${N.alias}.${t.quoteIdentifier("_id")} = ${v.alias}.${t.quoteIdentifier("_id")}`:" ON 1 = 1";return e.groupLimit&&(j=to(j,e,t,o)),e.orderBy.length>0&&(j+=` ORDER BY ${Pt(e,t,o)}`),e.pagination?.kind==="rows"&&(j=t.paginate(j,e.pagination.pageSize,0)),{sql:j,parameters:o.values}}const i=h=>{if(h.plan.projections.some(({expression:N})=>ae(N,r)))throw new p("JAVASCRIPT_OPERATOR_IN_SUBQUERY","A query LogicForm cannot use a JavaScript-only operator");const S=fe(h.plan.rowIdentity.kind==="property"||h.plan.rowIdentity.kind==="group"?{...h.plan,rowIdentity:{kind:"generated"}}:h.plan,t,r,o.nextParameterOffset);return o.append(S.parameters),S.sql},s=(e.joins?.length??0)>0,a=(e.arrayExpansions?.length??0)>0,c=s||a||e.sourcePlan!==void 0||e.sourceSql!==void 0||e.validityPeriods!==void 0||e.observationPeriods!==void 0,u=new Map,d=(e.arrayExpansions??[]).map(h=>{if(!t.expandArray)throw new p("ARRAY_EXPANSION_UNSUPPORTED",`Provider ${t.kind} does not support array expansion`);const S=t.expandArray(yc(h,t),h.alias,"value");return u.set(h.path,S.valueExpression),S}),l=h=>{const S=e.fieldReferences?.[h];if(S?.sql)return ot(S.sql,S.property,t,S.timestampColumn,c?S.timestampQualifier??S.qualifier:void 0);if(S&&c)return`${t.quoteIdentifier(S.qualifier)}.${t.quoteIdentifier(S.column)}`;const N=e.fields[h];if(!N)throw new p("PROPERTY_NOT_FOUND",`Query property not found: ${h}`);return t.quoteIdentifier(N)},f=h=>ge(h,t,r,c,S=>xe(S,l,N=>e.fieldReferences?.[N]?.isArray===!0,o,t,i),S=>o.add(S),(S,N)=>Nt(S,N,o,t,i),S=>{const N=u.get(S);if(!N)throw new p("ARRAY_EXPANSION_NOT_FOUND",`Array expansion not found: ${S}`);return N}),m=e.projections.map(h=>`${f(h.expression)} AS ${t.quoteIdentifier(h.name)}`),y=e.rowIdentity.kind==="property"?`${c&&e.sourceAlias?`${t.quoteIdentifier(e.sourceAlias)}.`:""}${t.quoteIdentifier(e.rowIdentity.column)} AS ${t.quoteIdentifier(e.rowIdentity.internalName)}`:e.rowIdentity.kind==="group"?(()=>{const h=e.rowIdentity.names.map(S=>{const N=e.groupBy.find(k=>k.name===S)??e.projections.find(k=>k.name===S);if(!N)throw new p("GROUP_IDENTITY_OUTPUT_NOT_FOUND",`Group identity output not found: ${S}`);return f(N.expression)});return`${eo(h,t,e.rowIdentity.separator,e.rowIdentity.nullLabel)} AS ${t.quoteIdentifier("_id")}`})():void 0,g=[...m,...y?[y]:[]].join(", "),_=e.sourcePlan?(()=>{const h=fe(e.sourcePlan,t,r,o.nextParameterOffset);return o.append(h.parameters),`(${h.sql})`})():e.source?_r(t,e.source,e.sourceSql):"",R=c&&e.sourceAlias?t.tableAlias(_,e.sourceAlias):_;let $=`SELECT ${g}`;if(e.validityPeriods){const h=e.validityPeriods,S=h.periods.map(({label:V,asOf:q},re)=>{const W=o.add(V),Z=o.add(q);return re===0?`SELECT ${W} AS ${t.quoteIdentifier(h.labelColumn)}, ${Z} AS ${t.quoteIdentifier(h.asOfColumn)}`:`SELECT ${W}, ${Z}`}).join(" UNION ALL "),N=t.tableAlias(`(${S})`,h.alias),k=t.tableAlias(_,h.sourceAlias),j=t.quoteIdentifier(h.alias),v=t.quoteIdentifier(h.sourceAlias),K=`${j}.${t.quoteIdentifier(h.asOfColumn)}`,D=`${v}.${t.quoteIdentifier(h.startColumn)}`,L=`${v}.${t.quoteIdentifier(h.endColumn)}`;$+=` FROM ${N} LEFT JOIN ${k} ON ${D} <= ${K} AND (${L} > ${K} OR ${L} IS NULL)`,e.query&&Object.keys(e.query).length>0&&($+=` AND ${xe(e.query,l,V=>e.fieldReferences?.[V]?.isArray===!0,o,t,i)}`)}else if(e.observationPeriods){const h=e.observationPeriods,S=h.periods.map(({label:W,asOf:Z},ne)=>{const X=o.add(W),ce=o.add(Z);return ne===0?`SELECT ${X} AS ${t.quoteIdentifier(h.labelColumn)}, ${ce} AS ${t.quoteIdentifier(h.asOfColumn)}`:`SELECT ${X}, ${ce}`}).join(" UNION ALL "),N=t.tableAlias(`(${S})`,h.alias),k=t.tableAlias(_,h.sourceAlias),j=t.tableAlias(_,h.lookupAlias),v=t.quoteIdentifier(h.alias),K=t.quoteIdentifier(h.sourceAlias),D=t.quoteIdentifier(h.lookupAlias),L=`${v}.${t.quoteIdentifier(h.asOfColumn)}`,V=`${K}.${t.quoteIdentifier(h.timestampColumn)}`,q=`${D}.${t.quoteIdentifier(h.timestampColumn)}`,re=`SELECT ${t.aggregateFunction("max",q)} FROM ${j} WHERE ${q} <= ${L}`;$+=` FROM ${N} LEFT JOIN ${k} ON ${V} = (${re})`,e.query&&Object.keys(e.query).length>0&&($+=` AND ${xe(e.query,l,W=>e.fieldReferences?.[W]?.isArray===!0,o,t,i)}`)}else R&&($+=` FROM ${R}`);for(const h of d)$+=` ${h.joinSql}`;for(const h of e.joins??[]){$+=` LEFT JOIN ${t.tableAlias(_r(t,h.targetSource,h.targetSourceSql),h.targetAlias)}`;const S=h.sourceArrayExpansionPath?u.get(h.sourceArrayExpansionPath):h.sourceSql?ot(h.sourceSql,h.sourceColumn,t,h.sourceTimestampColumn,h.sourceAlias):`${t.quoteIdentifier(h.sourceAlias)}.${t.quoteIdentifier(h.sourceColumn)}`,N=h.targetSql?ot(h.targetSql,h.targetColumn,t,h.targetTimestampColumn,h.targetAlias):`${t.quoteIdentifier(h.targetAlias)}.${t.quoteIdentifier(h.targetColumn)}`;if(!S)throw new p("ARRAY_EXPANSION_NOT_FOUND",`Array expansion not found: ${h.path}`);if($+=` ON ${S} = ${N}`,h.sourceTimestampColumn&&h.targetTimestampColumn&&h.sourceTimestampGranularity&&h.targetTimestampGranularity){const k=`${t.quoteIdentifier(h.sourceAlias)}.${t.quoteIdentifier(h.sourceTimestampColumn)}`,j=`${t.quoteIdentifier(h.targetAlias)}.${t.quoteIdentifier(h.targetTimestampColumn)}`;$+=` AND ${t.dateBucket(k,h.sourceTimestampGranularity)} = ${t.dateBucket(j,h.targetTimestampGranularity)}`}if(h.sourceTimestampColumn&&h.targetValidityStartColumn&&h.targetValidityEndColumn){const k=`${t.quoteIdentifier(h.sourceAlias)}.${t.quoteIdentifier(h.sourceTimestampColumn)}`,j=`${t.quoteIdentifier(h.targetAlias)}.${t.quoteIdentifier(h.targetValidityStartColumn)}`,v=`${t.quoteIdentifier(h.targetAlias)}.${t.quoteIdentifier(h.targetValidityEndColumn)}`;$+=` AND ${j} <= ${k} AND (${v} > ${k} OR ${v} IS NULL)`}}const E=[];if(!e.validityPeriods&&!e.observationPeriods&&e.query&&Object.keys(e.query).length>0&&E.push(xe(e.query,l,h=>e.fieldReferences?.[h]?.isArray===!0,o,t,i)),E.length>0&&($+=` WHERE ${E.join(" AND ")}`),e.groupBy.length>0){const h=e.groupBy.map(N=>f(N.expression)),S=e.rowIdentity.kind==="group"?[eo(h,t,e.rowIdentity.separator,e.rowIdentity.nullLabel)]:[];$+=` GROUP BY ${[...h,...S].join(", ")}`}if(e.having&&Object.keys(e.having).length>0){const h=S=>{const N=e.projections.find(k=>k.name===S);if(!N)throw new p("INVALID_HAVING",`Having field is not an output: ${S}`);return t.supportsHavingAlias===!1?f(N.expression):t.quoteIdentifier(S)};$+=` HAVING ${xe(e.having,h,()=>!1,o,t,i)}`}if(e.groupLimit&&($=to($,e,t,o)),e.pagination?.kind==="ratio")$=gc($,e,e.pagination,t,o);else if(e.orderBy.length>0&&($+=` ORDER BY ${Pt(e,t,o,void 0,f)}`),e.pagination?.kind==="rows"){const h=(e.pagination.page-1)*e.pagination.pageSize;$=t.paginate($,e.pagination.pageSize,h)}return{sql:$,parameters:o.values}},$c=(e,t)=>{const r=Object.keys(t).sort((f,m)=>m.length-f.length),n=[];let o=0;for(;o<e.length;){const f=e[o];if(f&&/\s/.test(f)){o+=1;continue}if(f&&/[()+\-*/,]/.test(f)){n.push(f),o+=1;continue}const m=e.slice(o).match(/^\d+(?:\.\d+)?/);if(m?.[0]){n.push(m[0]),o+=m[0].length;continue}const y=r.find(_=>e.startsWith(_,o));if(y){n.push(y),o+=y.length;continue}const g=e.slice(o).match(/^[A-Za-z_$][\w$]*/);if(g?.[0]){n.push(g[0]),o+=g[0].length;continue}n.push(f??""),o+=1}let i=0;const s=()=>n[i],a=()=>n[i++],c=()=>{const f=a();if(!f)throw new Error("Component expression is incomplete");if(f==="("){const y=d();if(a()!==")")throw new Error("Component expression has an unclosed parenthesis");return`(${y})`}if(/^\d/.test(f))return f;if(!t[f]&&!/^[A-Za-z_$][\w$]*$/.test(f))throw new Error(`Invalid component expression token: ${f}`);if(s()==="("){a();const y=[];if(s()!==")")for(;y.push(d()),s()===",";)a();if(a()!==")")throw new Error("Component expression has an unclosed function call");if(!["ABS","NULLIF","COALESCE"].includes(f.toUpperCase()))throw new Error(`Unsupported component expression function: ${f}`);return`${f.toUpperCase()}(${y.join(", ")})`}const m=t[f];if(!m)throw new Error(`Unknown component in expression: ${f}`);return m},u=()=>{let f=c();for(;s()==="*"||s()==="/";)f=`${f} ${a()} ${c()}`;return f},d=()=>{let f=u();for(;s()==="+"||s()==="-";)f=`${f} ${a()} ${u()}`;return f},l=d();if(i!==n.length)throw new Error(`Unexpected component expression token: ${s()}`);return l},wc=e=>`__sdb_cte_${e}`,ro=e=>{const t=e.projections[e.groupBy.length];if(!t)throw new Error("CTE component must produce one metric projection");return t.name},Ac=(e,t)=>e?.find(r=>r.name===t),Ec=(e,t,r)=>r===0?e:t.kind==="postgresql"?e.replace(/\$(\d+)/g,(n,o)=>`$${Number(o)+r}`):t.kind==="oracle"?e.replace(/:(\d+)/g,(n,o)=>`:${Number(o)+r}`):t.kind==="clickhouse"?e.replace(/\{p(\d+):([^}]+)\}/g,(n,o,i)=>`{p${Number(o)+r}:${i}}`):e,no=(e,t,r,n=Ie())=>{if(e.length===0)throw new Error("CTE query combination requires at least one unit");let o=0;const i=e.map(($,E)=>{const h={...$.compiled,sql:Ec($.compiled.sql,r,o)};return o+=$.compiled.parameters.length,{...$,compiled:h,alias:`__sdb_exec_${E}`}}),s=i.map(({alias:$,compiled:E})=>`${r.quoteIdentifier($)} AS (${E.sql})`),a=i[0],c=r.quoteIdentifier(a.alias),u=t.groupBy.map(({name:$})=>$),d=t.orderBy??[],l=t.rowIdentity.kind==="group",f=r.quoteIdentifier("__sdb_exec_keys");if(l){const $=E=>[...u.map(h=>`${E}.${r.quoteIdentifier(h)}`),`${E}.${r.quoteIdentifier("_id")}`].join(", ");s.push(`${f} AS (${i.map(({alias:E})=>`SELECT ${$(r.quoteIdentifier(E))} FROM ${r.quoteIdentifier(E)}`).join(" UNION ")})`)}const m=l?f:c,y=[...u,...e.flatMap(({outputs:$})=>$)],g=y.filter(($,E,h)=>h.indexOf($)===E).map($=>{if(u.includes($))return`${m}.${r.quoteIdentifier($)} AS ${r.quoteIdentifier($)}`;const E=i.find(({outputs:S})=>S.includes($));if(!E)throw new Error(`CTE execution unit does not expose output projection: ${$}`);return`${r.quoteIdentifier(E.alias)}.${r.quoteIdentifier($)} AS ${r.quoteIdentifier($)}`});l&&g.push(`${m}.${r.quoteIdentifier("_id")} AS ${r.quoteIdentifier("_id")}`);let _=`SELECT ${g.join(", ")} FROM ${m}`;for(const $ of l?i:i.slice(1)){const E=r.quoteIdentifier($.alias);_+=` LEFT JOIN ${E}`,_+=l?` ON ${m}.${r.quoteIdentifier("_id")} = ${E}.${r.quoteIdentifier("_id")}`:" ON 1 = 1"}if(!!(t.having&&Object.keys(t.having).length>0||d.length>0||t.pagination||t.groupLimit)){const $={schemaId:t.schemaId,source:"__sdb_cte_result_source",sourceSql:_,sourceAlias:"__sdb_cte_result",fields:Object.fromEntries(y.map(h=>[h,h])),projections:y.map(h=>({name:h,expression:{kind:"column",property:h,column:h}})),groupBy:[],...t.having&&Object.keys(t.having).length>0?{query:t.having}:{},orderBy:d.map(({name:h,direction:S,comparable:N})=>({name:h,direction:S,...N?{comparable:N}:{}})),...t.pagination?{pagination:t.pagination}:{},...t.groupLimit?{groupLimit:t.groupLimit}:{},rowIdentity:{kind:"generated"}},E=fe($,r,n,o);return{sql:`WITH ${s.join(", ")} ${E.sql}`,parameters:[...i.flatMap(({compiled:h})=>h.parameters),...E.parameters]}}return{sql:`WITH ${s.join(", ")} ${_}`,parameters:i.flatMap(({compiled:$})=>$.parameters)}},Ir=(e,t,r,n,o,i)=>{const s=[];let a=0;for(const $ of t){const E=fe($.plan,o,i,a);a+=E.parameters.length,s.push({input:$,sql:E,alias:wc($.name)})}const c=s.map(({sql:$,alias:E})=>`${o.quoteIdentifier(E)} AS (${$.sql})`).join(", "),u=s[0];if(!u)throw new Error("CTE calculation requires a current component");const d=o.quoteIdentifier(u.alias),l=r.groupBy.map(({name:$})=>$),f=l.map($=>`${d}.${o.quoteIdentifier($)} AS ${o.quoteIdentifier($)}`);let m="";for(const $ of s.slice(1)){const E=o.quoteIdentifier($.alias),h=$.input.plan.groupBy.map(({name:k})=>k),N=($.input.joinKeys??l.filter(k=>h.includes(k))).map(k=>{const j=Ac($.input.groupKeyShifts,k),v=j?o.dateShift(`${E}.${o.quoteIdentifier(k)}`,j.granularity,j.offset):`${E}.${o.quoteIdentifier(k)}`;return`${d}.${o.quoteIdentifier(k)} = ${v}`});m+=` LEFT JOIN ${E} ON ${N.length>0?N.join(" AND "):"1 = 1"}`}const y=Object.fromEntries(s.map(({input:$,alias:E})=>[$.name,`${o.quoteIdentifier(E)}.${o.quoteIdentifier(ro($.plan))}`])),g=$c(e.expression,y),_=[...f,...r.rowIdentity.kind==="group"?[`${d}.${o.quoteIdentifier("_id")} AS ${o.quoteIdentifier("_id")}`]:[],...s.map(({input:$,alias:E})=>`${`${o.quoteIdentifier(E)}.${o.quoteIdentifier(ro($.plan))}`} AS ${o.quoteIdentifier($.name)}`),`${g} AS ${o.quoteIdentifier(n)}`].join(", ");let R=`WITH ${c} SELECT ${_} FROM ${d}`;return R+=m,{sql:R,parameters:s.flatMap(({sql:$})=>$.parameters)}},_c=e=>{if(typeof e!="string"||!/\bSELECT\b/i.test(e))return e;try{let t=e;const r=io(e).length*2+2;for(let n=0;n<r;n+=1){const o=Sc(t);if(o===t)return t;t=o}return t}catch{return e}},Sc=e=>{const t=io(e),r=Ic(e,t);if(r!==e)return r;const n=[];for(const i of t){const s=so(e,i.selectEnd,i.fromStart),a=s?.length===1&&s[0]?.trim()==="*"?xc(e.slice(i.fromStart+4,i.close)):null;if(a){n.push({start:i.open,end:i.close+1,value:a});continue}if(!s||s.some(g=>g.trim()==="*"))continue;const c=kc(Rc(e.slice(i.fromStart,i.close),i,t)),u=Oc(e,i),d=bc(e,i);if(d&&Nc(u,d))continue;let l=s.filter(g=>{const _=ao(g);if(!_||_==="_id")return!0;const R=new RegExp(`(^|[^\\w$])${Rr(_)}([^\\w$]|$)`,"i");return R.test(c)||R.test(u)}),f=!0;for(;f;){f=!1;const g=po(l.join(" ")),_=s.filter(R=>{if(l.includes(R))return!1;const $=ao(R);return $?new RegExp(`(^|[^\\w$])${Rr($)}([^\\w$]|$)`,"i").test(g):!1});_.length>0&&(l=s.filter(R=>l.includes(R)||_.includes(R)),f=!0)}if(l.length===s.length)continue;const m=e.slice(i.selectEnd,i.fromStart),y=l.length===0&&Mc(e,i)&&!/(^|[^\w$])\*([^\w$]|$)/.test(u)&&!/^\s*(?:DISTINCT|ALL|TOP|SQL_)\b/i.test(m)&&!/\b(?:UNION|INTERSECT|EXCEPT)\b/i.test(c);l.length===0&&!y||n.push({start:i.selectEnd,end:i.fromStart,value:m.match(/^\s*/)[0]+(y?"1":l.map(g=>g.trim()).join(", "))+m.match(/\s*$/)[0]})}n.sort((i,s)=>s.start-i.start);let o=e;for(const i of n)o=o.slice(0,i.start)+i.value+o.slice(i.end);return o},Ic=(e,t)=>{const r=/^\s*SELECT\b/i.exec(e);if(!r)return e;const n=r.index+r[0].length,o=oo(e,"FROM",n);if(o===-1||!so(e,n,o)?.every(jc))return e;const s=t.find(f=>f.open>o&&e.slice(o+4,f.open).trim().length===0);if(!s||!/^\s*1\s*$/.test(e.slice(s.selectEnd,s.fromStart)))return e;const a=t.filter(f=>f.open>s.fromStart&&f.close<s.close).sort((f,m)=>m.close-m.open-(f.close-f.open))[0];if(!a||e.slice(s.fromStart+4,a.open).trim().length>0)return e;const c=e.slice(a.close+1,s.close);if(/\b(?:GROUP|HAVING|ORDER|LIMIT|OFFSET|UNION|INTERSECT|EXCEPT)\b/i.test(c))return e;const u=qc.exec(c)?.[1],d=Uc.exec(e.slice(s.close+1));if(!u||!d||co(u)!==co(d[1]))return e;const l=/;(\s*)$/.exec(e)?.[0]??"";return e.slice(0,s.open)+e.slice(a.open,s.close)+l},Rc=(e,t,r)=>Pc(e,r.filter(n=>n.open>t.open&&n.close<t.close).map(n=>({start:n.open-t.fromStart,end:n.close-t.fromStart+1}))),Oc=(e,t)=>{const r=e.slice(0,t.open)+" ".repeat(t.close-t.open+1)+e.slice(t.close+1);return po(r)},bc=(e,t)=>e.slice(t.close+1).match(new RegExp(`^\\s*(?:AS\\s+)?(${Ae})(?=\\s|$)`,"i"))?.[1]??null,Nc=(e,t)=>new RegExp(`(^|[^\\w$])${Rr(t)}\\s*\\.\\s*\\*([^\\w$]|$)`,"i").test(e),Pc=(e,t)=>{if(!t.length)return e;const r=e.split("");for(const n of t)for(let o=Math.max(0,n.start);o<Math.min(r.length,n.end);o+=1)r[o]=" ";return r.join("")},oo=(e,t,r)=>{let n=0,o=0,i="",s="";for(let a=r;a<e.length;a+=1){const c=e[a],u=e[a+1];if(s==="--"){c===`
2
+ `&&(s="");continue}if(s==="/*"){c==="*"&&u==="/"&&(s="",a+=1);continue}if(i){c===i&&e[a-1]!=="\\"&&(i="");continue}if(c==="-"&&u==="-"){s="--",a+=1;continue}if(c==="/"&&u==="*"){s="/*",a+=1;continue}if(c==="`"||c==='"'||c==="'"){i=c;continue}if(c==="("){n+=1;continue}if(c===")"){n-=1;continue}if(c==="["){o+=1;continue}if(c==="]"){o-=1;continue}if(n===0&&o===0&&new RegExp(`^${t}\\b`,"i").test(e.slice(a)))return a}return-1},io=e=>{const t=[],r=[];let n="",o="";for(let i=0;i<e.length;i+=1){const s=e[i],a=e[i+1];if(o==="--"){s===`
3
+ `&&(o="");continue}if(o==="/*"){s==="*"&&a==="/"&&(o="",i+=1);continue}if(n){s===n&&e[i-1]!=="\\"&&(n="");continue}if(s==="-"&&a==="-"){o="--",i+=1;continue}if(s==="/"&&a==="*"){o="/*",i+=1;continue}if(s==="`"||s==='"'||s==="'"){n=s;continue}if(s==="("){r.push({open:i});continue}if(s!==")")continue;const c=r.pop();if(!c)continue;const u=e.slice(c.open+1,i),d=/^\s*SELECT\b/i.exec(u);if(!d)continue;const l=c.open+1+d.index,f=oo(e,"FROM",l+6);f===-1||f>=i||t.push({open:c.open,close:i,selectEnd:l+6,fromStart:f})}return t},so=(e,t,r)=>{const n=e.slice(t,r),o=[];let i=0,s=0,a=0,c="";for(let u=0;u<n.length;u+=1){const d=n[u];if(c){d===c&&n[u-1]!=="\\"&&(c="");continue}if(d==="`"||d==='"'||d==="'"){c=d;continue}d==="("?s+=1:d===")"?s-=1:d==="["?a+=1:d==="]"?a-=1:d===","&&s===0&&a===0&&(o.push(n.slice(i,u)),i=u+1)}return c||s!==0||a!==0?null:(o.push(n.slice(i)),o)},ao=e=>e.trim().match(/\bAS\s+(`[^`]+`|"[^"]+"|[A-Za-z_][\w$]*)\s*$/i)?.[1]?.replace(/^`|`$/g,"").replace(/^"|"$/g,"")??null,Ae='(?:`(?:``|[^`])+`|"(?:""|[^"])+"|[A-Za-z_][\\w$]*)',Tc=new RegExp(`\\s+AS\\s+${Ae}\\s*$`,"i"),Lc=new RegExp(`\\bAS\\s+${Ae}`,"gi"),Dc=new RegExp(`(?:${Ae}\\s*\\.\\s*)+${Ae}`,"g"),Cc=new RegExp(`^${Ae}(?:\\s*\\.\\s*${Ae})*$`),qc=new RegExp(`^\\s*(?:AS\\s+)?(${Ae})\\s+WHERE\\b`,"i"),Uc=new RegExp(`^\\s*(?:AS\\s+)?(${Ae})\\s*;?\\s*$`,"i"),co=e=>e.replace(/^`|`$/g,"").replace(/^"|"$/g,"").toLowerCase(),jc=e=>{const t=e.replace(Tc,"").trim();return/^(?:NULL|TRUE|FALSE|[-+]?\d+(?:\.\d+)?|'(?:''|[^'])*')$/i.test(t)||/^COUNT\s*\(\s*(?:\*|1)\s*\)$/i.test(t)},uo=(e,t)=>e.replace(t,r=>" ".repeat(r.length)),po=e=>uo(e,Lc),kc=e=>uo(e,Dc),Mc=(e,t)=>/\b(?:FROM|JOIN)\s*$/i.test(e.slice(0,t.open)),xc=e=>{const t=e.trim();return Cc.test(t)?t:null},Rr=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Or=(e,t)=>{if(e.kind!=="operator")return!1;const r=t.get(e.operator);return!r.toSQL&&!!r.evaluate||(e.input?Or(e.input,t):!1)||(e.inputs?.some(n=>Or(n,t))??!1)},lo=(e,t,r,n)=>{if(e.kind!=="operator")return t[r];const o=n.get(e.operator),i=e.input?lo(e.input,t,r,n):t[r];return o.evaluate?Promise.resolve(i).then(s=>o.evaluate?.({input:s,args:e.args})):i},Tt=async(e,t,r)=>{const n=t.filter(({expression:o})=>Or(o,r));return n.length===0?[...e]:Promise.all(e.map(async o=>{const i={...o};for(const s of n)i[s.name]=await lo(s.expression,i,s.name,r);return i}))},br=e=>e==null?"\u7A7A\u503C":typeof e=="object"?"_id"in e?String(e._id):"id"in e?String(e.id):JSON.stringify(e):String(e),fo=(e,t,r="_",n="\u7A7A\u503C")=>t.map(o=>e[o]===null||e[o]===void 0?n:br(e[o])).join(r),mo=(e,t)=>e.map(r=>{if(t.kind==="property"){const{[t.internalName]:n,...o}=r;return{...o,_id:String(n)}}return t.kind==="group"?{...r,_id:r._id===void 0?fo(r,t.names,t.separator,t.nullLabel):br(r._id)}:{...r,_id:t.kind==="singleton"?"0":oi()}}),Vc=e=>{const t=Y(e);return delete t.having,delete t.sort,delete t.limit,delete t.page,t},st=(e,t)=>e.operator&&t.get(e.operator).kind==="component"?!0:!!e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred)&&st(e.pred,t)||Array.isArray(e.pred)&&e.pred.some(r=>typeof r!="string"&&st(r,t)),Nr=(e,t,r,n,o,i,s="zh-CN",a=ht.translator(s))=>{const c=e.preds??[],u=c.map((m,y)=>({pred:m,index:y,definition:m.operator?n.get(m.operator):void 0})).filter(({pred:m,definition:y})=>y?.kind==="component"&&!(t.observationPeriods&&m.operator==="$periodValue"));if(u.length===0&&t.sourcePlan||u.length===0)return;for(const m of c)if((!m.operator||n.get(m.operator).kind!=="component")&&(m.pred&&typeof m.pred=="object"&&!Array.isArray(m.pred)&&st(m.pred,n)||Array.isArray(m.pred)&&m.pred.some(y=>typeof y!="string"&&st(y,n))))throw new p("UNSUPPORTED_COMPONENT_NESTING","A component operator must currently be the top-level projection operator");const d=[],l=c.filter((m,y)=>!u.some(g=>g.index===y));if(l.length>0){const m=Vc(e);m.preds=l,d.push({kind:"query",logicform:m})}const f=e.groupby?.length??0;for(const{pred:m,index:y,definition:g}of u){const _=g?.createComponent;if(!_)continue;const R=t.projections[f+y]?.name;if(!R)throw new p("INVALID_COMPONENT_PLAN","Component output projection is missing");const $=i?.preds?.[y],E=_({logicform:e,pred:$??m,outputName:R,locale:s,t:a,schema:r,resolveSchema:o,...i?{sourceLogicform:i}:{}});if("logicform"in E&&(E.logicform.preds??[]).some(h=>st(h,n)))throw new p("UNSUPPORTED_COMPONENT_NESTING","Nested component operators are not supported yet");d.push("components"in E?{...E,outputName:R}:E)}return d},$e=e=>e instanceof Date?e.getTime():e,vc=(e,t,r,n)=>{const o=$e(e),i=$e(r);switch(t){case"$eq":return o===i;case"$ne":return o!==i;case"$gt":return o!=null&&i!==void 0&&i!==null&&o>i;case"$gte":return o!=null&&i!==void 0&&i!==null&&o>=i;case"$lt":return o!=null&&i!==void 0&&i!==null&&o<i;case"$lte":return o!=null&&i!==void 0&&i!==null&&o<=i;case"$in":return Array.isArray(r)&&r.some(s=>$e(s)===o);case"$nin":return Array.isArray(r)&&r.every(s=>$e(s)!==o);case"$exists":return r?e!=null:e==null;case"$contains":return String(e).includes(String(r));case"$regex":return typeof r=="string"&&new RegExp(r,n).test(String(e));default:throw new p("UNSUPPORTED_QUERY_OPERATOR",`Unsupported having operator: ${t}`)}},yo=(e,t)=>{if(!t||typeof t!="object"||Array.isArray(t))return $e(e)===$e(t);const r=Object.entries(t),n=t.args,o=n&&typeof n=="object"&&!Array.isArray(n)?n.options:void 0;return r.every(([i,s])=>{if(i==="args")return!0;if(i==="$and"||i==="$or"){if(!Array.isArray(s))return!1;const a=s.map(c=>yo(e,c));return i==="$and"?a.every(Boolean):a.some(Boolean)}return vc(e,i,s,typeof o=="string"?o:void 0)})},ho=(e,t)=>Object.entries(t).every(([r,n])=>{if(r==="$and"||r==="$or"){if(!Array.isArray(n))return!1;const o=n.map(i=>ho(e,i));return r==="$and"?o.every(Boolean):o.some(Boolean)}return yo(e[r],n)}),go=(e,t)=>t.length===0?"0":e._id===void 0?fo(e,t):br(e._id),$o=(e,t)=>{const r=new Map;for(const n of e)for(const o of n){const i=go(o,t);r.set(i,{...r.get(i)??{},...o})}return[...r.values()]},Bc=(e,t)=>{const r=t.groupBy.map(({name:o})=>o);let n=$o(e,r);if(t.having&&(n=n.filter(o=>ho(o,t.having))),t.groupLimit){const o=t.groupLimit,i=new Map;for(const s of n){const a=go(s,o.partitionBy);i.set(a,[...i.get(a)??[],s])}n=[...i.values()].flatMap(s=>s.sort((a,c)=>{for(const u of o.orderBy){const d=$e(a[u.name]),l=$e(c[u.name]);if(d!==l)return d==null?u.direction==="ASC"?-1:1:l==null?u.direction==="ASC"?1:-1:(d<l?-1:1)*(u.direction==="ASC"?1:-1)}return 0}).slice(0,o.count))}if(t.orderBy.length>0&&n.sort((o,i)=>{for(const s of t.orderBy){const a=$e(o[s.name]),c=$e(i[s.name]);if(a!==c)return a==null?s.direction==="ASC"?-1:1:c==null?s.direction==="ASC"?1:-1:(a<c?-1:1)*(s.direction==="ASC"?1:-1)}return 0}),t.pagination?.kind==="rows"){const o=(t.pagination.page-1)*t.pagination.pageSize;n=n.slice(o,o+t.pagination.pageSize)}else if(t.pagination?.kind==="ratio"){const o=Math.ceil(n.length*t.pagination.ratio),i=(t.pagination.page-1)*o;n=n.slice(i,i+o)}return n},wo=(e,t,r)=>{if(!e.schema||e.schema===t.id)return t;const n=r.resolveSchema?.(e.schema);if(!n)throw new p("SCHEMA_RESOLVER_REQUIRED",`Cannot normalize nested LogicForm schema without a schema resolver: ${e.schema}`,{schemaId:e.schema});return n},Lt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Fc={year:"\u5E74",quarter:"\u5B63\u5EA6",month:"\u6708",week:"\u5468",day:"\u65E5",hour:"\u65F6",minute:"\u5206",second:"\u79D2"},Ve=(e,t)=>{if(e===null)return t?"null":"\u7A7A\u503C";if(typeof e=="string"||typeof e=="number")return String(e);if(typeof e=="boolean")return t?String(e):e?"\u662F":"\u5426";if(Array.isArray(e))return e.map(n=>Ve(n,t)).join(t?", ":"\u3001");if(!Lt(e))return t?"the specified condition":"\u6307\u5B9A\u6761\u4EF6";if(Array.isArray(e.roots))return e.roots.map(n=>Ve(n,t)).join(t?", ":"\u3001");if(e.root!==void 0)return Ve(e.root,t);const r=["year","quarter","month","week","day","hour","minute","second"].filter(n=>e[n]!==void 0).map(n=>t?`${n} ${String(e[n])}`:`${String(e[n])}${Fc[n]??""}`);return r.length>0?r.join(t?", ":""):t?"the specified condition":"\u6307\u5B9A\u6761\u4EF6"},Dt=(e,t,r)=>e.filter(Boolean).join(r?t==="$and"?" and ":" or ":t==="$and"?"\u4E14":"\u6216"),Ao=(e,t,r,n)=>{const s=(n?{$eq:"is",$ne:"is not",$gt:"is greater than",$gte:"is at least",$lt:"is less than",$lte:"is at most",$in:"is one of",$nin:"is none of",$contains:"contains",$regex:"matches",$recursive:"is"}:{$eq:"\u4E3A",$ne:"\u4E0D\u4E3A",$gt:"\u5927\u4E8E",$gte:"\u5927\u4E8E\u7B49\u4E8E",$lt:"\u5C0F\u4E8E",$lte:"\u5C0F\u4E8E\u7B49\u4E8E",$in:"\u4E3A",$nin:"\u4E0D\u4E3A",$contains:"\u5305\u542B",$regex:"\u5339\u914D",$recursive:"\u5C5E\u4E8E"})[e];if(!s)return;const a=e==="$in"?n?"":"\u4E4B\u4E00":e==="$nin"?n?"":"\u4E2D\u7684\u4EFB\u4E00\u9879":e==="$recursive"?n?" or a descendant":"\u53CA\u5176\u4E0B\u7EA7":"";return n?`${t} ${s} ${r}${a}`:`${t}${s}${r}${a}`},Eo=(e,t,r)=>{if(!Lt(t)||Object.keys(t).every(o=>!o.startsWith("$")))return Ao("$eq",e,Ve(t,r),r)??"";const n=[];for(const[o,i]of Object.entries(t))if((o==="$and"||o==="$or")&&Array.isArray(i))n.push(Dt(i.map(s=>Eo(e,s,r)),o,r));else if(o==="$exists")n.push(r?`${e} ${i?"exists":"does not exist"}`:`${i?"\u6709":"\u65E0"}${e}`);else if(o!=="args"){const s=o==="$regex"&&Lt(i)?Ve(i.pattern,r):Ve(i,r),a=Ao(o,e,s,r);a&&n.push(a)}return Dt(n,"$and",r)},_o=(e,t="zh-CN")=>{const r=t.toLowerCase().startsWith("en"),n=[];for(const[o,i]of Object.entries(e))(o==="$and"||o==="$or")&&Array.isArray(i)?n.push(Dt(i.map(s=>Lt(s)?_o(s,t):""),o,r)):i!==void 0&&n.push(Eo(o,i,r));return Dt(n,"$and",r)},Yc=(e,t,r,n)=>e==="$count"&&!t?"operator.$count.rows":["$add","$multiply","$concat"].includes(e)&&r.length===0?`operator.${e}.empty`:["$subtract","$divide"].includes(e)&&r.length<2?`operator.${e}.fallback`:e==="$periodBoundary"||e==="$periodValue"?`operator.${e}.${n.boundary==="start"?"start":"end"}`:`operator.${e}`,ve=(e,t,r={})=>{if(e.name!==void 0){if(typeof e.name!="string"||e.name.length===0)throw new p("INVALID_PRED_NAME","PredItem name must be a non-empty string");return e.name}const n=r.locale??"zh-CN",o=r.localeRegistry??ht,i=o.resolve(n).locale.toLowerCase().startsWith("en"),s=o.translator(n),a=Array.isArray(e.pred)?e.pred.map(m=>typeof m=="string"?m:ve(m,t,r)):[],c=typeof e.pred=="string"?e.pred:e.pred&&!Array.isArray(e.pred)?ve(e.pred,t,r):void 0,u=c??(a.length>0?a.join(i?", ":"\u3001"):s("operator.rows",i?"rows":"\u6570\u636E\u884C")),d=e.args??{},l=e.operator?(()=>{const m=t.get(e.operator).defaultName({operandName:u,...c?{inputName:c}:{},inputNames:a,args:d,locale:n,t:s});if(typeof m!="string"||m.length===0)throw new p("INVALID_PRED_NAME",`Operator defaultName must return a non-empty name: ${e.operator}`,{operator:e.operator});const y=typeof d.granularity=="string"?s(`time.granularity.${d.granularity}`,d.granularity):s("time.granularity.period","\u5468\u671F"),g=i?e.operator==="$concat"?" and ":e.operator==="$multiply"?" times ":" plus ":e.operator==="$concat"?"\u4E0E":e.operator==="$multiply"?"\u4E58\u4EE5":"\u52A0";return["$periodShift","$periodGrowth","$periodDifference"].includes(e.operator)?m:s(Yc(e.operator,!!c||a.length>0,a,d),m,{...d,operandName:u,inputName:c??"",inputNames:a.join(g),input0:a[0]??"",input1:a[1]??"",granularity:y,level:typeof d.level=="string"?d.level:"",levelSuffix:typeof d.level=="string"&&d.level.length>0?` ${d.level}`:""})})():u;if(typeof l!="string"||l.length===0)throw new p("INVALID_PRED_NAME",`Operator defaultName must return a non-empty name: ${e.operator}`,{operator:e.operator});if(!e.query)return l;const f=_o(e.query,n);return f?i?`${l} where ${f}`:`${f}\u7684${l}`:l};class So{#e=new Map;constructor(t=[]){for(const r of t)this.register(r)}register(t){if(!t.name)throw new p("INVALID_SEMANTIC_TYPE","Semantic type name must not be empty");if(this.#e.has(t.name))throw new p("SEMANTIC_TYPE_ALREADY_REGISTERED",`Semantic type is already registered: ${t.name}`,{type:t.name});return this.#e.set(t.name,t),this}get(t){const r=this.#e.get(t);if(!r)throw new p("SEMANTIC_TYPE_NOT_FOUND",`Semantic type is not registered: ${t}`,{type:t});return r}requiresPerPeriodEvaluation(t){return t.property?this.get(t.property.type).requiresPerPeriodEvaluation?.({...t,property:t.property})??!1:!1}}const Qc=e=>{const t=new Set,r=new Set;for(const n of e){if(!n.name)throw new p("INVALID_PROPERTY_NAME","Property name must not be empty");if(!n.id)throw new p("INVALID_PROPERTY_ID",`Property ${n.name} physical id must not be empty`);if(t.has(n.name))throw new p("DUPLICATE_PROPERTY_NAME",`Duplicate property name: ${n.name}`,{property:n.name});if(r.has(n.id))throw new p("DUPLICATE_PROPERTY_ID",`Duplicate property physical id: ${n.id}`,{propertyId:n.id});t.add(n.name),r.add(n.id)}},Io=(e,t={})=>{Qc(e);const r=e.filter(({type:n})=>n==="timestamp");if(r.length>1)throw new p("MULTIPLE_TIMESTAMP_PROPERTIES","A Schema can declare at most one timestamp Property",{properties:r.map(({name:n})=>n)});if(t.temporalSemantics==="snapshot"&&r.length===0)throw new p("SNAPSHOT_TIMESTAMP_REQUIRED","A snapshot Schema must declare exactly one timestamp Property",{schemaId:t.schemaId})},Hc=new Set(["second","minute","hour","day","week","month","quarter","year"]),Ro=(e,t)=>{if(e===void 0)return;if(typeof e!="object"||e===null||Array.isArray(e))throw new p("INVALID_TIME_WATERMARK",`${t} timeWatermark must be an object`);const r=e,n=Object.keys(r);if(!(r.type==="database_latest"&&n.length===1)&&!(r.type==="now_offset"&&n.every(o=>o==="type"||o==="offset")&&Number.isInteger(r.offset)))throw new p("INVALID_TIME_WATERMARK",`${t} timeWatermark must be database_latest or now_offset with an integer offset`,{owner:t,timeWatermark:e})},Gc=(e,t)=>{if(Ro(e.timeWatermark,`Property ${e.name}`),"_id"in e||"_sid"in e)throw new p("LEGACY_PROPERTY_ID_NOT_ALLOWED",`Property ${e.name} must use id instead of _id; _sid is not supported`,{property:e.name});if("sid"in e)throw new p("PROPERTY_SID_NOT_ALLOWED",`Property ${e.name} must not declare sid`,{property:e.name});const r=e;if(r.is_comparable!==void 0||r.comparable_order!==void 0)throw new p("LEGACY_COMPARABLE_NOT_ALLOWED",`Property ${e.name} must use comparable instead of is_comparable/comparable_order`,{property:e.name});if(e.udf!==void 0){const a=e.udf;if(typeof a!="object"||a===null||Array.isArray(a))throw new p("INVALID_PROPERTY_UDF",`Property ${e.name} udf must be an object containing only sql`,{property:e.name});const c=a,u=Object.keys(c).filter(d=>d!=="sql");if(u.length>0)throw new p("UNSUPPORTED_PROPERTY_UDF",`Property ${e.name} udf only supports sql`,{property:e.name,unsupportedKeys:u});if(typeof c.sql!="string"||c.sql.trim().length===0)throw new p("INVALID_PROPERTY_UDF",`Property ${e.name} udf.sql must be a non-empty string`,{property:e.name})}const n=t.get(e.type),o=e.primal_type==="object"?"entity":e.primal_type;if(o!==void 0&&o!==n.primalType)throw new p("PRIMAL_TYPE_MISMATCH",`Property ${e.name} declares primal_type ${e.primal_type}, but ${e.type} requires ${n.primalType}`,{property:e.name,type:e.type,declared:e.primal_type,expected:n.primalType});if(e.isArray!==void 0&&typeof e.isArray!="boolean")throw new p("INVALID_IS_ARRAY",`Property ${e.name} isArray must be a boolean`,{property:e.name,isArray:e.isArray});if(e.level!==void 0&&(typeof e.level!="string"||e.level.trim().length===0))throw new p("INVALID_PROPERTY_LEVEL",`Property ${e.name} level must be a non-empty string`,{property:e.name,level:e.level});if("is_observation"in e)throw new p("LEGACY_TEMPORAL_SEMANTICS_NOT_ALLOWED",`Property ${e.name} must use Schema temporalSemantics; is_observation is not supported`,{property:e.name});if(e.comparable!==void 0){const a=e.comparable;if(typeof a!="object"||a===null||Array.isArray(a))throw new p("INVALID_COMPARABLE_CATEGORY",`Property ${e.name} comparable must contain values and direction`);const c=a;if(Object.keys(c).some(u=>u!=="values"&&u!=="direction")||!Array.isArray(c.values)||c.values.length===0||c.values.some(u=>typeof u!="string")||new Set(c.values).size!==c.values.length||c.direction!==1&&c.direction!==-1)throw new p("INVALID_COMPARABLE_CATEGORY",`Property ${e.name} comparable requires unique string values and direction 1 or -1`,{property:e.name,comparable:a});if(e.type!=="category"||e.isArray===!0)throw new p("COMPARABLE_CATEGORY_REQUIRED",`Property ${e.name} comparable is only supported by scalar category properties`,{property:e.name,type:e.type})}const i={...e,id:e.id??e.name,primal_type:n.primalType,isArray:e.isArray??!1,is_dynamic:e.udf?.sql!==void 0,...n.primalType==="date"?{granularity:e.granularity??"day"}:{}};if(i.timeWatermark&&i.primal_type!=="date")throw new p("TIME_WATERMARK_DATE_PROPERTY_REQUIRED",`Property ${i.name} timeWatermark is only supported by date Properties`,{property:i.name});if(n.primalType==="entity"||n.primalType==="object"){if(typeof i.ref!="string"||i.ref.length===0)throw new p("PROPERTY_REF_REQUIRED",`Entity property ${i.name} must declare ref`,{property:i.name,type:i.type})}else if(i.ref!==void 0)throw new p("PROPERTY_REF_NOT_ALLOWED",`Property ${i.name} cannot declare ref unless its primal_type is entity`,{property:i.name,type:i.type});if(i.level!==void 0&&i.primal_type!=="entity"&&i.primal_type!=="object")throw new p("PROPERTY_LEVEL_REQUIRES_ENTITY",`Property ${i.name} level requires an entity relation`,{property:i.name,type:i.type});if(n.primalType==="date"||e.type==="duration"){if(i.granularity!==void 0&&!Hc.has(i.granularity))throw new p("INVALID_GRANULARITY",`Property ${i.name} has unsupported granularity: ${i.granularity}`,{property:i.name,granularity:i.granularity})}else if(i.granularity!==void 0)throw new p("GRANULARITY_NOT_ALLOWED",`Property ${i.name} cannot declare granularity unless its type supports it`,{property:i.name,type:i.type});return n.validateProperty?.(i),i},Wc=e=>{const t=(o,i,s)=>{if(i===void 0)return;if(typeof i!="string"||i.length===0)throw new p("INVALID_PROPERTY_HIERARCHY",`Property ${o.name} hierarchy.${s} must be a non-empty Property name or id`,{property:o.name,direction:s,reference:i});const a=e.find(c=>c.id===i)??e.find(c=>c.name===i);if(!a)throw new p("PROPERTY_HIERARCHY_TARGET_NOT_FOUND",`Property ${o.name} hierarchy.${s} does not exist: ${i}`,{property:o.name,direction:s,reference:i});if(a===o)throw new p("PROPERTY_HIERARCHY_CYCLE",`Property ${o.name} cannot point to itself in hierarchy.${s}`,{property:o.name,direction:s});return a.name},r=e.map(o=>{if(o.hierarchy===void 0)return o;const i=o.hierarchy;if(typeof i!="object"||i===null||Array.isArray(i))throw new p("INVALID_PROPERTY_HIERARCHY",`Property ${o.name} hierarchy must be an object containing up and/or down`,{property:o.name,hierarchy:i});const s=i,a=Object.keys(s).filter(d=>d!=="up"&&d!=="down");if(a.length>0)throw new p("UNSUPPORTED_PROPERTY_HIERARCHY",`Property ${o.name} hierarchy only supports up and down`,{property:o.name,unsupported:a});const c=t(o,s.up,"up"),u=t(o,s.down,"down");return{...o,hierarchy:{...c?{up:c}:{},...u?{down:u}:{}}}}),n=new Map(r.map(o=>[o.name,o]));for(const o of r)for(const i of["up","down"]){const s=new Set;let a=o;for(;a?.hierarchy?.[i];){if(s.has(a.name))throw new p("PROPERTY_HIERARCHY_CYCLE",`Property hierarchy.${i} contains a cycle at ${a.name}`,{property:o.name,direction:i,cycleAt:a.name});s.add(a.name),a=n.get(a.hierarchy[i])}}return r},Oo=(e,t,r=[])=>{Ro(e.timeWatermark,`Schema ${e.id}`);const n=wt(r);if("_id"in e||"_sid"in e)throw new p("LEGACY_SCHEMA_ID_NOT_ALLOWED","Schema must use id instead of _id; _sid is not supported");if("sid"in e)throw new p("SCHEMA_SID_NOT_ALLOWED","Schema must not declare sid");if("is_snapshot"in e||"is_observation"in e)throw new p("LEGACY_TEMPORAL_SEMANTICS_NOT_ALLOWED","Schema must use temporalSemantics instead of is_snapshot/is_observation",{schemaId:e.id});const o=e.temporalSemantics??"normal";if(o!=="normal"&&o!=="snapshot")throw new p("INVALID_TEMPORAL_SEMANTICS","Schema temporalSemantics must be normal or snapshot",{schemaId:e.id,temporalSemantics:o});const i=o;if(!e.id)throw new p("INVALID_SCHEMA_ID","Schema id must not be empty");let s=e.properties.map(g=>Gc(g,t));s=Wc(s);const a=s.filter(({type:g})=>g==="ID"),c=s.filter(({type:g})=>g==="start_date"),u=s.filter(({type:g})=>g==="end_date");if(e.type==="entity"&&!s.some(({type:g})=>g==="timestamp")&&e.temporalSemantics!=="snapshot"&&a.length===1&&c.length===1&&u.length===1&&!s.some(({name:g})=>g==="\u65E5\u671F")){const g=c[0];g&&(s=[...s,{id:"__chatbi__timestamp__placeholder__",name:"\u65E5\u671F",type:"timestamp",primal_type:"date",isArray:!1,is_dynamic:!0,is_supplementary:!0,udf:{sql:g.id}}])}Io(s,{temporalSemantics:i,schemaId:e.id});const d=n.flatMap(g=>g.schemaMetadata?[g.schemaMetadata]:[]);let l={};for(const g of d)l={...l,...g.resolve(e,s)};const f=e.parentProperty===void 0?void 0:s.find(({id:g,name:_})=>g===e.parentProperty||_===e.parentProperty);if(e.parentProperty!==void 0&&!f)throw new p("RECURSIVE_PARENT_PROPERTY_REQUIRED",`Schema parentProperty does not exist: ${e.parentProperty}`,{schemaId:e.id,property:e.parentProperty});const m=new Set(n.flatMap(g=>[...g.schemaMetadata?.keys??[],...g.legacySchemaKeys??[]]));return{...Object.fromEntries(Object.entries(e).filter(([g])=>g!=="parentProperty"&&!m.has(g))),temporalSemantics:i,properties:s,...l,...f?{parentProperty:f.name}:{}}};J.extend(ii),J.extend(dt),J.extend(pt);const zc="YYYY-MM-DD HH:mm:ss",Kc=new Set(["YTD","QTD","MTD","WTD","DTD"]),Jc=new Set(["$eq","$gt","$gte","$lt","$lte","$in","$nin","$and","$or"]),Ct=["second","minute","hour","day","week","month","quarter","year"],Be=e=>Object.prototype.toString.call(e)==="[object Object]",Pr=e=>!Be(e)||"$gte"in e||"$gt"in e||"$lte"in e||"$lt"in e||"$or"in e||"$ne"in e?!1:typeof e.granularity=="string"&&Ct.includes(e.granularity)&&typeof e.offset=="number"||Ct.some(t=>t in e),Fe=e=>J(e).format(zc),Zc=(e,t)=>Ct.find(r=>r in e||t!==void 0),Xc=(e,t,r)=>t==="month"?e.month(r-1):t==="day"?e.date(r):t==="week"?e.isoWeek(r):t==="quarter"?e.quarter(r):e.set(t,r),bo=(e,t)=>{const r=typeof e.granularity=="string"?e.granularity:void 0,n=r?{[r]:e.offset}:void 0,o=r??Zc(e,void 0)??"day";let i=J(t).millisecond(0);for(const a of[...Ct].reverse()){const c=e[a];typeof c=="number"&&(i=Xc(i,a,c));const u=n?.[a];typeof u=="number"&&u!==0&&(i=i.add(u,a))}const s=o==="week"?"isoWeek":o;return{$gte:Fe(i.startOf(s)),$lte:Fe(i.endOf(s))}},eu=(e,t)=>{const r=J(t),o={DTD:()=>r.startOf("day"),WTD:()=>r.startOf("isoWeek"),MTD:()=>r.startOf("month"),QTD:()=>r.startOf("quarter"),YTD:()=>r.startOf("year")}[e];return{$gte:Fe(o()),$lte:Fe(r.endOf("day"))}},Tr=async(e,t)=>{const r=J(String(e.$lte)),n=await t.requestTimeWatermark(r.toDate());if(!n)return e;const o=t.property.granularity??"day",i=o==="week"?"isoWeek":o,s=J(n).endOf(i),a=J(String(e.$gte));if(a.isValid()&&s.isBefore(a))return e;const c=s.isBefore(r)?s:r;return{...e,$lte:Fe(c)}},Lr=async(e,t)=>ye(e)?e:e instanceof Date||typeof e=="string"&&J(e).isValid()?Fe(e):typeof e=="string"&&Kc.has(e)?Tr(eu(e,t.now),t):Pr(e)?Tr(bo(e,t.now),t):e,No=async(e,t,r)=>{if(e==="$and"||e==="$or")return Array.isArray(t)?Promise.all(t.map(o=>qt(o,r))):t;if(Array.isArray(t))return Promise.all(t.map(o=>Lr(o,r)));const n=await Lr(t,r);return e==="$eq"&&Be(n)&&"$gte"in n&&"$lte"in n?n:e==="$gte"||e==="$gt"?Be(n)&&"$gte"in n?n.$gte:n:(e==="$lte"||e==="$lt")&&Be(n)&&"$lte"in n?n.$lte:n},qt=async(e,t)=>{if(ye(e))return e;if(Array.isArray(e))return Promise.all(e.map(o=>qt(o,t)));if(!Be(e))return Lr(e,t);if("$options"in e)throw new p("UNSUPPORTED_QUERY_OPERATOR","$options is a LogicForm 1.x field; use args.options in LogicForm 2.0");if("$offset"in e)throw new p("UNSUPPORTED_DATE_VALUE","The legacy {$offset: ...} date form is not supported; use { granularity, offset }");if(("granularity"in e||"offset"in e)&&(!Pr(e)||!Number.isInteger(e.offset)))throw new p("INVALID_DATE_VALUE","Relative date values require one granularity and an integer offset");if(Pr(e))return Tr(bo(e,t.now),t);const r=Object.entries(e);if(r.length===1&&r[0]?.[0]==="$eq"){const o=await No("$eq",r[0][1],t);if(Be(o)&&"$gte"in o&&"$lte"in o)return o}const n={};for(const[o,i]of r)n[o]=Jc.has(o)?await No(o,i,t):await qt(i,t);return n},tu=(e,t)=>t.property.primal_type==="date"?qt(e,t):e,Po=()=>new So(yr),ru=/^(\d+)\.(\d+)(?:\.(\d+))?(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/,nu=e=>{if(typeof e!="string")return!1;const t=ru.exec(e);if(!t)return!1;const r=Number(t[1]),n=Number(t[2]),o=Number(t[3]??0);return r!==2?r>2:n>0||o>0?!0:t[4]===void 0},Dr=e=>{if(!nu(e.version))throw new p("UNSUPPORTED_LOGICFORM_VERSION",`This library only supports LogicForm version 2.0 or later; received ${JSON.stringify(e.version)}`,{minimumVersion:"2.0",receivedVersion:e.version})},To=(e,t)=>Object.entries(e).some(([r,n])=>t.has(r)?!0:r!=="$and"&&r!=="$or"||!Array.isArray(n)?!1:n.some(o=>typeof o=="object"&&o!==null&&!Array.isArray(o)&&To(o,t))),Lo=(e,t,r,n=[])=>{if(t===void 0||t==="placeholder")return e;if(!er(t))throw new p("INVALID_ENTITY_ID","entity_id must be a non-empty string or a safe integer");const o=tr(r,n);return e&&To(e,new Set([o.name,o.id]))?e:{[o.name]:t,...e??{}}},ou=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&typeof e.schema=="string"&&typeof e.query=="object"&&e.query!==null&&!Array.isArray(e.query),iu=e=>{if(!ye(e))return!1;const t=e;return t.groupby!==void 0||t.preds!==void 0||t.from!==void 0||t.having!==void 0||t.sort!==void 0||t.limit!==void 0||t.limitBy!==void 0||t.page!==void 0},Cr=async(e,t)=>{if(ye(e)){if(!t.normalizeNestedLogicform)throw new p("LOGICFORM_NORMALIZER_UNAVAILABLE","Nested query LogicForm must be normalized through normalizeLogicform");return t.normalizeNestedLogicform(e)}return Array.isArray(e)?Promise.all(e.map(r=>Cr(r,t))):typeof e!="object"||e===null||e instanceof Date?e:Object.fromEntries(await Promise.all(Object.entries(e).map(async([r,n])=>[r,await Cr(n,t)])))},Do=(e,t)=>Object.fromEntries(Object.entries(e).map(([r,n])=>(r==="$and"||r==="$or")&&Array.isArray(n)?[r,n.map(o=>Do(o,t))]:[`${t}_${r}`,n])),su=e=>{if(typeof e!="object"||e===null||Array.isArray(e))return e;const t=Object.entries(e),[r]=t;return t.length===1&&r?.[0]==="$eq"?r[1]:e},Co=async(e,t,r,n)=>{const o=u=>{if(Array.isArray(u)){u.forEach(o);return}if(typeof u!="object"||u===null||ye(u))return;const d=u;if("$options"in d)throw new p("UNSUPPORTED_QUERY_OPERATOR","$options is a LogicForm 1.x field; use args.options in LogicForm 2.0");Object.values(d).forEach(o)};o(e);const i=n.semanticTypes.get(r.type),s={schema:t,property:r,now:n.now??new Date,requestTimeWatermark:u=>n.requestTimeWatermark?.(t,r,u)??Promise.resolve(void 0)},a=await tu(Y(e),s),c=i.normalizeQuery?i.normalizeQuery(a,s):a;if(r.comparable){const u=new Set(r.comparable.values),d=(l,f)=>{if(!(ye(l)||l===null)){if(Array.isArray(l)){l.forEach(m=>d(m,f));return}if(typeof l=="object"){Object.entries(l).forEach(([m,y])=>{["args","$exists","$regex","$contains"].includes(m)||d(y,m)});return}if(!(f&&["args","$exists","$regex","$contains"].includes(f))&&(typeof l!="string"||!u.has(l)))throw new p("COMPARABLE_VALUE_NOT_FOUND",`Comparable category ${r.name} does not contain value: ${JSON.stringify(l)}`,{property:r.name,value:l})}};d(c)}return c},au=async(e,t,r,n)=>{const o=typeof e=="object"&&e!==null&&!Array.isArray(e)?e:{root:e},i=typeof o.schema=="string"?o.schema:r.ref??t.id,s=i===t.id?t:n.resolveSchema?.(i);if(!s)throw new p("SCHEMA_RESOLVER_REQUIRED",`$recursive requires Schema ${i}`);const a=o.idProperty??o.id_property,c=s.properties.filter(({type:y})=>y==="ID"),u=a===void 0?c.length===1?c[0]:void 0:s.properties.find(({id:y,name:g})=>y===a||g===a);if(!u||a===void 0&&c.length!==1)throw new p("RECURSIVE_ID_PROPERTY_REQUIRED",`$recursive Schema ${i} must have exactly one ID property or idProperty`);const d=Array.isArray(o.roots),l=d?o.roots:o.root===void 0?[]:[o.root];if(!d&&l.length===0||l.some(y=>y===void 0))throw new p("RECURSIVE_ROOT_REQUIRED","$recursive requires root or roots");const f=await Promise.all(l.map(y=>Co(y,s,u,n))),m=o.parentProperty??o.parent_property??s.parentProperty??"pid";if(typeof m!="string"||m.length===0)throw new p("RECURSIVE_PARENT_PROPERTY_REQUIRED","$recursive parentProperty must be a string");if(o.includeSelf!==void 0&&typeof o.includeSelf!="boolean"||o.include_self!==void 0&&typeof o.include_self!="boolean")throw new p("INVALID_RECURSIVE_QUERY","$recursive includeSelf must be boolean");return{schema:i,roots:f,includeSelf:o.includeSelf??o.include_self??!0,idProperty:u.name,parentProperty:m}},qr=async(e,t,r)=>{const n={};for(const[o,i]of Object.entries(e)){if(o==="$and"||o==="$or"){if(!Array.isArray(i))throw new p("INVALID_QUERY_VALUE",`${o} requires an array`);n[o]=await Promise.all(i.map(async u=>{if(typeof u!="object"||u===null||Array.isArray(u))throw new p("INVALID_QUERY_VALUE",`${o} items must be query objects`);return qr(u,t,r)}));continue}const s=z(t,o,r.resolveSchema);if(iu(i)&&(s.property.primal_type==="entity"||s.property.primal_type==="object")&&s.property.ref){if(i.schema!==s.property.ref)throw new p("RELATION_SCHEMA_MISMATCH",`Relation ${s.canonicalName} references ${s.property.ref}, not ${i.schema??"undefined"}`);if(!r.normalizeNestedLogicform)throw new p("LOGICFORM_NORMALIZER_UNAVAILABLE","Nested query LogicForm must be normalized through normalizeLogicform");const u=await r.normalizeNestedLogicform(i);n[s.canonicalName]={$in:u};continue}if(ou(i)){if(i.version!==void 0&&Dr(i),s.property.primal_type!=="entity"&&s.property.primal_type!=="object")throw new p("INVALID_RELATION_QUERY",`Relation query ${o} must resolve to an entity property`);if(!s.property.ref)throw new p("INVALID_RELATION_QUERY",`Nested LogicForm query requires an object property: ${s.canonicalName}`);if(i.schema!==s.property.ref)throw new p("RELATION_SCHEMA_MISMATCH",`Relation ${s.canonicalName} references ${s.property.ref}, not ${i.schema}`);const u=r.resolveSchema?.(i.schema);if(!u)throw new p("SCHEMA_RESOLVER_REQUIRED",`Nested relation query requires Schema ${i.schema}`);const d=Lo(i.query,i.entity_id,u,r.plugins),l=await qr(d,u,r);Object.assign(n,Do(l,s.canonicalName));continue}if(typeof i=="object"&&i!==null&&!Array.isArray(i)&&Object.prototype.hasOwnProperty.call(i,"$recursive")){const u=i;if(Object.keys(u).filter(l=>l!=="$recursive").length>0)throw new p("INVALID_RECURSIVE_QUERY","$recursive cannot be combined with other field operators");n[s.canonicalName]={$recursive:await au(u.$recursive,s.schema,s.property,r)};continue}const a=await Cr(i,r),c=await Co(a,s.schema,s.property,r);n[s.canonicalName]=su(c)}return n},qo=async(e,t,r)=>{if(!e)return;const n=await qr(e,t,r);return Object.keys(n).length===0?void 0:n},cu=e=>{if(typeof e!="object"||e===null||Array.isArray(e))return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||t===null},uu=e=>{if(e.args===void 0||Object.keys(e.args).length>0)return e;const{args:t,...r}=e;return r},Ut=async(e,t,r)=>{if("components"in e)throw new p("PRED_COMPONENTS_NOT_ALLOWED","PredItem components is not supported; use a pred array for multiple inputs");const n=r.operators,o={...r.locale?{locale:r.locale}:{},...r.localeRegistry?{localeRegistry:r.localeRegistry}:{}};if(!n)throw new Error("Normalizer operator registry is not initialized");if(e.name!==void 0&&(typeof e.name!="string"||e.name.length===0))throw new p("INVALID_PRED_NAME","PredItem name must be a non-empty string");if(e.name==="_id")throw new p("RESERVED_OUTPUT_NAME","PredItem name _id is reserved for executor-owned row identity");if(e.args!==void 0&&!cu(e.args))throw new p("INVALID_OPERATOR_ARGS","Pred args must be a plain object");const i=e.schema===void 0||e.schema===t.id?t:r.resolveSchema?.(e.schema);if(!i)throw new p("SCHEMA_RESOLVER_REQUIRED",`Cross-Schema pred requires Schema ${e.schema}`);const s=await qo(e.query,i,r),a=Array.isArray(e.pred)?await Promise.all(e.pred.map(f=>Ut(typeof f=="string"?{pred:f}:f,i,r))):void 0,{query:c,...u}=e,d={...u,...s?{query:s}:{},...a?{pred:a}:{}},l=f=>{const m=f.operator?n.get(f.operator).normalizePred?.({pred:f,schema:i})??f:f;return uu(m)};if(typeof e.pred=="string"){const f=z(i,e.pred,r.resolveSchema),m={...d,pred:f.canonicalName};return l({...m,name:m.name??ve(m,n,o)})}if(e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred)){const f={...d,pred:await Ut(e.pred,i,r)};return l({...f,name:f.name??ve(f,n,o)})}if(a)return l({...d,name:d.name??ve(d,n,o)});if(e.pred!==void 0)throw new p("UNSUPPORTED_PRED","A pred must be a property name or nested pred");return l({...d,name:d.name??ve(d,n,o)})},Uo=(e,t,r)=>Promise.all((e??[]).map(n=>Ut(n,t,r))),du=(e,t,r)=>Uo(e??[],t,r),Ye=(e,t)=>{throw new p("INVALID_PAGINATION",e,t)},pu=e=>{"skip"in e&&Ye("skip has been removed; use the 1-based page field",{skip:e.skip});const t=e.groupby?.length??0;e.limitBy!==void 0&&((!Number.isInteger(e.limitBy)||e.limitBy<=0)&&Ye("limitBy must be a positive integer",{limitBy:e.limitBy}),t<2&&(e.limit=e.limitBy,delete e.limitBy));const{limit:r,page:n}=e;if(r===void 0){n!==void 0&&Ye("page requires limit",{page:n});return}if((!Number.isFinite(r)||r<0&&r!==-1||r>1&&!Number.isInteger(r))&&Ye("limit must be -1, a non-negative integer, or a ratio between 0 and 1",{limit:r}),r===-1){n!==void 0&&Ye("page cannot be used with unlimited results",{limit:r,page:n}),delete e.limit;return}n!==void 0&&(!Number.isInteger(n)||n<1)&&Ye("page must be a positive integer starting from 1",{page:n}),e.page=n??1},lu=e=>e.property.name,jo=(e,t,r,n,o=new Set)=>{if(o.has(e.id))return;const i=new Set(o).add(e.id),s=e.properties.find(a=>a.id===t||a.name===t);if(s)return s.name;if(n==="timestamp"){const a=e.properties.find(c=>c.type==="timestamp");if(a)return a.name}for(const a of e.properties){if(!a.ref||a.primal_type!=="entity"&&a.primal_type!=="object")continue;const c=r?.(a.ref);if(!c)continue;const u=jo(c,t,r,n,i);if(u)return`${a.name}_${u}`}},ko=(e,t,r,n)=>{try{const o=z(e,t,n);return jo(r,lu(o),n,o.property.type)}catch{return}},fu=(e,t,r)=>{const n=[...new Set((e.preds??[]).map(s=>s.schema).filter(s=>!!(s&&s!==t.id)))];if(n.length===0)return e;const o={};for(const[s,a]of Object.entries(e.propertyResolve??{})){const c=r.resolveSchema?.(s),u={};for(const[d,l]of Object.entries(a))try{const f=z(t,d,r.resolveSchema),m=c?z(c,l,r.resolveSchema):void 0;u[f.canonicalName]=m?.canonicalName??l}catch{u[d]=l}o[s]=u}const i=[...(e.groupby??[]).map(s=>s.pred),...Object.keys(e.query??{}).filter(s=>s!=="$and"&&s!=="$or")];for(const s of i){if(typeof s!="string")continue;let a;try{a=z(t,s,r.resolveSchema)}catch{continue}for(const c of n){const u=r.resolveSchema?.(c),d=u&&ko(t,s,u,r.resolveSchema);d&&d!==a.canonicalName&&(o[c]={...o[c]??{},[a.canonicalName]:d})}}return Object.keys(o).length>0?{...e,propertyResolve:o}:e},mu=e=>{if(e!==void 0){if(typeof e!="object"||e===null||Array.isArray(e))throw new p("INVALID_PROPERTY_RESOLVE","propertyResolve must be an object");for(const[t,r]of Object.entries(e)){if(typeof r!="object"||r===null||Array.isArray(r))throw new p("INVALID_PROPERTY_RESOLVE",`propertyResolve.${t} must be an object`);for(const[n,o]of Object.entries(r))if(typeof o!="string"||o.length===0)throw new p("INVALID_PROPERTY_RESOLVE",`propertyResolve.${t}.${n} must be a non-empty string`)}}},yu=async(e,t,r)=>{if(!e)return;const n=wo(e,t,r);return Qe(e,n,r)},Qe=async(e,t,r)=>{if(r={...r,...r.localeRegistry?{localeRegistry:r.localeRegistry}:{localeRegistry:yt(r.locales)},...r.operators?{}:{operators:Ie(r.plugins)}},Dr(e),mu(e.propertyResolve),e.output&&e.output.type!=="data"&&e.output.type!=="sql")throw new p("UNSUPPORTED_OUTPUT",`Output type is not supported: ${e.output.type}`);const o=Y(e),i={...r,normalizeNestedLogicform:async y=>{const g=wo(y,t,r);return Qe(y,g,r)}};pu(o);const s=await yu(o.from,t,i),a=s&&r.resolveFromSchema?r.resolveFromSchema(s,t):t,c=await qo(Lo(o.query,o.entity_id,a,r.plugins),a,i),u=o.preds===void 0&&o.groupby===void 0?a.properties.filter(y=>r.canProjectProperty?.(a,y)??!0).map(y=>({pred:y.name,name:y.name})):o.preds;let d=await Uo(u,a,i),l=await du(o.groupby,a,i);const f=l.filter(y=>gn(y,l,a,r.resolveSchema));if(f.length>0){const y=new Set(f.map(({name:g})=>g));l=l.filter(({name:g})=>!y.has(g)),d=[...d,...f]}return o.preds=d,l.length>0?o.groupby=l:delete o.groupby,s?o.from=s:delete o.from,c?o.query=c:delete o.query,fu(o,a,i)},Ur=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),Oe=(e,t)=>{if(e){if(!Ur(e,t))throw new p("TABLE_PERMISSION_DENIED",`Schema is not included in the table permissions: ${t}`,{schemaId:t});return e[t]}},De=(e,t,r)=>{const n=Oe(e,t)?.columnPermissions?.whitelist;return!n||n.includes(r.name)||n.includes(r.id)},He=(e,t,r)=>{if(!De(e,t.id,r))throw new p("COLUMN_PERMISSION_DENIED",`Property is not included in the column permissions: ${t.id}.${r.name}`,{schemaId:t.id,property:r.name,propertyId:r.id})},jr=(e,t,r,n)=>{const o=z(t,e,n);for(const i of o.relations)Oe(r,i.targetSchema.id),He(r,i.sourceSchema,i.property);He(r,o.schema,o.property)},Mo=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&typeof e.schema=="string"&&typeof e.query=="object"&&e.query!==null&&!Array.isArray(e.query),hu=(e,t,r,n)=>{if(typeof e!="object"||e===null||Array.isArray(e)||!Ur(e,"$recursive"))return;const o=e.$recursive,i=typeof o=="object"&&o!==null&&!Array.isArray(o)?o:{},s=typeof i.schema=="string"?i.schema:t.property.ref??t.schema.id,a=n(s);if(Oe(r,s)?.rowPermissions!==void 0)throw new p("RECURSIVE_ROW_PERMISSION_UNSUPPORTED",`$recursive cannot safely apply row permissions for Schema ${s}`,{schemaId:s});const u=i.idProperty??i.id_property,d=u===void 0?a.properties.find(({type:m})=>m==="ID"):a.properties.find(({id:m,name:y})=>m===u||y===u),l=i.parentProperty??i.parent_property??a.parentProperty??"pid",f=a.properties.find(({id:m,name:y})=>m===l||y===l);d&&He(r,a,d),f&&He(r,a,f)},kr=(e,t,r,n)=>{if(ye(e)){Mt(e,t,r,n);return}if(Array.isArray(e)){for(const o of e)kr(o,t,r,n);return}if(!(typeof e!="object"||e===null||e instanceof Date))for(const o of Object.values(e))kr(o,t,r,n)},jt=(e,t,r,n,o)=>{if(e)for(const[i,s]of Object.entries(e)){if(i==="$and"||i==="$or"){if(Array.isArray(s))for(const c of s)jt(c,t,r,n,o);continue}const a=z(t,i,n);if(jr(i,t,r,n),hu(s,a,r,n),Mo(s)){if(a.property.ref!==s.schema)continue;const c=n(s.schema);Oe(r,c.id),er(s.entity_id)&&He(r,c,tr(c,o)),jt(s.query,c,r,n,o);continue}kr(s,r,n,o)}},kt=(e,t,r,n,o)=>{const i=e.schema?n(e.schema):t;e.schema&&Oe(r,e.schema),typeof e.pred=="string"?jr(e.pred,i,r,n):e.pred&&!Array.isArray(e.pred)&&kt(e.pred,i,r,n,o);for(const s of Array.isArray(e.pred)?e.pred:[])typeof s=="string"?jr(s,i,r,n):kt(s,i,r,n,o);jt(e.query,i,r,n,o)},Mt=(e,t,r,n=[])=>{if(!e.schema){if(e.from){Mt(e.from,t,r,n);return}throw new p("LOGICFORM_SCHEMA_REQUIRED","A physical LogicForm must define schema")}const o=r(e.schema);if(Oe(t,o.id),er(e.entity_id)&&He(t,o,tr(o,n)),e.from){Mt(e.from,t,r,n);return}jt(e.query,o,t,r,n);for(const i of e.preds??[])kt(i,o,t,r,n);for(const i of e.groupby??[])kt(i,o,t,r,n)},xt=(e,t)=>{if(Array.isArray(e))return e.map(o=>xt(o,t));if(typeof e!="object"||e===null||e instanceof Date)return e;const r=Object.entries(e).map(([o,i])=>[o,xt(i,t)]),n=Object.fromEntries(r);return Mo(e)&&!Ur(e,"version")&&(n.version=t),n},gu=(e,t,r)=>{const n=[],o=(s,a)=>{if(s)for(const[c,u]of Object.entries(s))if((c==="$and"||c==="$or")&&Array.isArray(u))for(const d of u)o(d,a);else c.startsWith("$")||n.push(z(a,c,r))},i=(s,a)=>{const c=s.schema?r(s.schema):a;typeof s.pred=="string"?n.push(z(c,s.pred,r)):s.pred&&!Array.isArray(s.pred)&&i(s.pred,c);for(const u of Array.isArray(s.pred)?s.pred:[])typeof u=="string"?n.push(z(c,u,r)):i(u,c);o(s.query,c)};o(e.query,t);for(const s of e.preds??[])i(s,t);for(const s of e.groupby??[])i(s,t);return n},$u=(e,t,r)=>{if(!e.schema)return[];const n=r(e.schema),o=new Set,i=[];for(const s of gu(e,n,r)){if(s.relations.length===0)continue;let a=-1;if(s.relations.forEach(({targetSchema:l},f)=>{t[l.id]?.rowPermissions!==void 0&&(a=f)}),a<0)continue;const c=s.relations.slice(0,a+1),u=c.map(({property:l})=>l.name).join("_");if(o.has(u))continue;o.add(u);let d={};for(const l of[...c].reverse())d={[l.property.name]:{schema:l.targetSchema.id,query:d}};i.push(d)}return i},Ge=(e,t,r,n,o,i)=>ye(e)?Ce(e,t,r,n,o,i):Array.isArray(e)?e.map(s=>Ge(s,t,r,n,o,i)):typeof e!="object"||e===null||e instanceof Date?e:Object.fromEntries(Object.entries(e).map(([s,a])=>[s,Ge(a,t,r,n,o,i)])),Mr=(e,t,r,n,o,i)=>({...e,...e.query?{query:Ge(e.query,t,r,n,o,i)}:{},...e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred)?{pred:Mr(e.pred,t,r,n,o,i)}:{},...Array.isArray(e.pred)?{pred:e.pred.map(s=>typeof s=="string"?s:Mr(s,t,r,n,o,i))}:{}}),Ce=(e,t,r,n=!0,o=new Set,i=[])=>{if(!t)return Y(e);if(!e.schema){const m=Y(e);return m.from&&(m.from=Ce(m.from,t,r,n,new Set,i)),m}n&&Mt(e,t,r,i);const s=Oe(t,e.schema),a=o.has(e.schema),c=new Set(o).add(e.schema),u=Y(e);u.query&&(u.query=Ge(u.query,t,r,n,new Set,i)),u.preds&&(u.preds=u.preds.map(m=>Mr(m,t,r,n,new Set,i))),u.from&&(u.from=Ce(u.from,t,r,n,new Set,i));const d=a||e.from?void 0:s?.rowPermissions,l=(e.from?[]:$u(e,t,r)).map(m=>Ge(xt(m,e.version),t,r,!1,c,i));d&&l.push(Ge(xt(Y(d),e.version),t,r,!1,c,i));const f=[u.query,...l].filter(m=>m!==void 0&&Object.keys(m).length>0);return f.length===1?u.query=f[0]:f.length>1?u.query={$and:f}:delete u.query,u},wu=(e,t)=>{if(e)for(const[r,n]of Object.entries(e)){const o=t(r),i=n.columnPermissions?.whitelist;if(i&&(!Array.isArray(i)||i.some(s=>typeof s!="string")))throw new p("INVALID_COLUMN_PERMISSIONS",`Column permissions whitelist must be an array of strings: ${r}`,{schemaId:r});for(const s of i??[])if(!o.properties.some(({id:a,name:c})=>a===s||c===s))throw new p("INVALID_COLUMN_PERMISSION",`Column permission property not found: ${r}.${s}`,{schemaId:r,property:s})}},xo=(e,t)=>{const r=new Intl.DateTimeFormat("en-US",{timeZone:t,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23"}).formatToParts(e),n=o=>Number(r.find(i=>i.type===o)?.value);return{year:n("year"),month:n("month"),day:n("day"),hour:n("hour"),minute:n("minute"),second:n("second")}},Vo=(e,t)=>{const r=Date.UTC(e.year,e.month-1,e.day,e.hour,e.minute,e.second);let n=r;for(let o=0;o<3;o+=1){const i=xo(new Date(n),t),s=Date.UTC(i.year,i.month-1,i.day,i.hour,i.minute,i.second);n+=r-s}return new Date(n)},Au=(e,t)=>{const r=kn(e.expireAt);if(!r)throw new Error(`Invalid daily expiration time: ${e.expireAt}`);if(!e.timeZone){const i=new Date(t);return i.setHours(r.hour,r.minute,r.second,0),i.getTime()<=t.getTime()&&i.setDate(i.getDate()+1),i}const n=xo(t,e.timeZone);let o=Vo({...n,...r},e.timeZone);if(o.getTime()<=t.getTime()){const i=new Date(Date.UTC(n.year,n.month-1,n.day+1));o=Vo({year:i.getUTCFullYear(),month:i.getUTCMonth()+1,day:i.getUTCDate(),...r},e.timeZone)}return o},Eu=(e,t)=>{const r=e.flatMap(n=>n.mode==="manual"?[]:n.mode==="ttl"?[new Date(t.getTime()+n.ttlSeconds*1e3)]:[Au(n,t)]);return r.length===0?void 0:new Date(Math.min(...r.map(n=>n.getTime())))},at=(e,t,r)=>{if(nt(e)){t.push(e.plan);return}if(Jn(e)){r.set(`${e.schemaId}:${e.source}`,{schemaId:e.schemaId,source:e.source});return}if(Array.isArray(e)){for(const n of e)at(n,t,r);return}if(!(typeof e!="object"||e===null||e instanceof Date))for(const n of Object.values(e))at(n,t,r)},ct=(e,t,r)=>{if(e.kind==="window"){ct(e.input,t,r);for(const n of e.partitionBy)ct(n,t,r);return}if(e.kind==="operator"){at(e.query,t,r),e.input&&ct(e.input,t,r);for(const n of e.inputs??[])ct(n,t,r)}},de=e=>{const t=new Map,r=o=>{t.set(`${o.schemaId}:${o.source}`,o)};if(e.subplans)for(const o of e.subplans)for(const i of de(o))r(i);else if(e.sourcePlan)for(const o of de(e.sourcePlan))r(o);else e.source&&r({schemaId:e.schemaId,source:e.source});for(const o of e.joins??[])r({schemaId:o.targetSchemaId,source:o.targetSource});const n=[];at(e.query,n,t),at(e.having,n,t);for(const o of e.projections)ct(o.expression,n,t);for(const o of n)for(const i of de(o))r(i);return[...t.values()]},Vt=e=>{const t=new Map;for(const r of e.flat())t.set(`${r.schemaId}:${r.source}`,r);return[...t.values()]},vo=async(e,t)=>{try{return await e.execute(t)}catch(r){const n=r instanceof Error?r.message:String(r),o=`${e.kind} provider \u6267\u884C SQL \u4EA7\u751F\u9519\u8BEF\uFF1A`;throw r instanceof Error?(r.message.startsWith(o)||(r.message=`${o}${n}`),r):new Error(`${o}${n}`,{cause:r})}},_u=(e,t)=>{const r=[];for(const n of e){const o=t.findSource(n.schemaId,n.source);if(!o?.freshness)return;r.push(o.freshness)}return r},We=async(e,t,r)=>{e=Bo(e),r.signal?.throwIfAborted();const n=r.cache?_u(t,r.schemaMappings):void 0;if(!r.cache||!n)return vo(r.provider,{...e,...r.signal?{signal:r.signal}:{}});const o={namespace:r.cache.namespace,provider:r.provider.kind,sql:e.sql,parameters:e.parameters};try{const s=await r.cache.store.get(o);if(r.signal?.throwIfAborted(),s)return[...s]}catch{r.signal?.throwIfAborted()}const i=await vo(r.provider,{...e,...r.signal?{signal:r.signal}:{}});try{const s=Eu(n,new Date);await r.cache.store.set(o,i,{sources:[...new Set(t.map(({source:a})=>a))],...s?{expiresAt:s}:{}})}catch{}return i},Bo=e=>({...e,sql:_c(e.sql)}),Su=e=>{if(e.every(t=>typeof t=="string"))return[...e];if(e.every(t=>typeof t=="number"))return[...e];if(e.every(t=>typeof t=="boolean"))return[...e];throw new TypeError("Entity IDs must have one scalar type")},Iu=(e,t,r)=>{const n=Su(t);if(!r||n.length<=r)return{[e]:{$in:n}};const o=[];for(let i=0;i<n.length;i+=r)o.push({[e]:{$in:n.slice(i,i+r)}});return{$or:o}},Ru=async(e,t)=>{if(!De(t.permissions,e.schema.id,e.idProperty))throw new p("COLUMN_PERMISSION_DENIED",`Entity hydration requires the ID property in the column permissions: ${e.schema.id}.${e.idProperty.name}`,{schemaId:e.schema.id,property:e.idProperty.name});const r=e.schema.properties.filter(u=>De(t.permissions,e.schema.id,u)),n={version:t.version,schema:e.schema.id,query:Iu(e.idProperty.name,e.ids,t.provider.maxInListItems),preds:r.map(u=>({pred:u.name,name:u.name}))},o=Ce(n,t.permissions,t.resolveSchema,!0,new Set,t.plugins),i=await Qe(o,e.schema,{semanticTypes:t.semanticTypes,operators:t.operators,...t.plugins?{plugins:t.plugins}:{},...t.locale?{locale:t.locale}:{},...t.localeRegistry?{localeRegistry:t.localeRegistry}:{},resolveSchema:t.resolveSchema}),s=he(i,e.schema,t.operators,t.schemaMappings,{resolveSchema:t.resolveSchema,canUsePropertyRowIdentity:(u,d)=>De(t.permissions,u.id,d)}),a=fe(s,t.provider,t.operators);t.onCompiled?.(a,i);const c=await We(a,de(s),{provider:t.provider,schemaMappings:t.schemaMappings,...t.cache?{cache:t.cache}:{},...t.signal?{signal:t.signal}:{}});return mo(c,s.rowIdentity)},Fo=e=>String(e),Ou=(e,t,r)=>{const n=`\u6570\u636E\u5E93\u4E2D\u672A\u627E\u5230 ID \u4E3A\u300C${Fo(r)}\u300D\u7684\u5B9E\u4F53`,o={};for(const i of e.properties)i.id===t.id?o[i.name]=r:i.isArray?o[i.name]=[]:o[i.name]=i.primal_type==="string"?n:null;return o._id=Fo(r),o},Yo=(e,t)=>`${e}:${String(t)}`,bu=e=>{const t=e.properties.filter(({type:n})=>n==="ID"),r=t[0];if(t.length!==1||!r)throw new p("RELATION_TARGET_ID_REQUIRED",`Relation target ${e.id} must contain exactly one ID property`,{schemaId:e.id,count:t.length});return r};class Nu{#e;#r=new Map;#t=new Map;#n=new Map;#o=!1;constructor(t){this.#e=t}load=(t,r)=>{const n=Yo(t,r),o=this.#r.get(n);if(o)return Promise.resolve(o);const i=this.#t.get(n);if(i)return i;const s=this.#e.resolveSchema(t);if(tt(s))throw new p("VALIDITY_ENTITY_HYDRATION_REQUIRES_TIME",`Cannot hydrate valid-time entity ${t} by ID without the source row's timestamp; use a relation path to select its as-of properties`,{schemaId:t});const a=bu(s);let c,u;const d=new Promise((f,m)=>{c=f,u=m}),l=this.#n.get(t)??{schema:s,idProperty:a,loads:new Map};return l.loads.set(n,{id:r,resolve:f=>c?.(f),reject:f=>u?.(f)}),this.#n.set(t,l),this.#t.set(n,d),this.#i(),d};#i(){this.#o||(this.#o=!0,queueMicrotask(()=>{this.#s()}))}async#s(){this.#o=!1;const t=this.#n;this.#n=new Map,await Promise.all([...t.values()].map(r=>this.#a(r)))}async#a(t){const r={schema:t.schema,idProperty:t.idProperty,ids:[...t.loads.values()].map(({id:n})=>n)};try{const n=await this.#e.fetchEntities(r),o=new Map;for(const i of n){const s=i[t.idProperty.name]??i._id;if(s!=null){const a=typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"||typeof s=="bigint"?String(s):JSON.stringify(s),c=i._id===a?i:{...i,_id:a};o.set(Yo(t.schema.id,s),c)}}for(const[i,s]of t.loads){const a=o.get(i)??Ou(t.schema,t.idProperty,s.id);this.#r.set(i,a),this.#t.delete(i),s.resolve(a)}}catch(n){for(const[o,i]of t.loads)this.#t.delete(o),i.reject(n)}}}const Pu=(e,t)=>{if(!t.isArray||typeof e!="string")return e;const r=e.trim();if(!r.startsWith("[")||!r.endsWith("]"))return e;try{const n=JSON.parse(r);if(!Array.isArray(n))throw new Error("JSON result is not an array");return n}catch(n){throw new p("INVALID_ARRAY_RESULT",`Result column ${t.name} contains invalid array JSON`,{property:t.name,cause:n})}},Tu=async(e,t,r,n)=>{await Promise.all(e.map(async o=>{await Promise.all(t.map(async i=>{if(!(i.name in o))return;const s=Pu(o[i.name],i),a=r.get(i.type).hydrateResult;if(!a){o[i.name]=s;return}o[i.name]=i.isArray&&Array.isArray(s)?await Promise.all(s.map(c=>a(c,{property:i,requestEntity:n}))):await a(s,{property:i,requestEntity:n})}))}))},Qo=5,Lu=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&!(e instanceof Date),Du=(e,t)=>{const r=t.properties.find(({type:n})=>n==="ID");return r?e[r.name]:void 0},Cu=(e,t)=>{const r=si(t);e._title=e[r.name]??e._id},qu=(e,t)=>{const r=structuredClone(e);if(!("_id"in r)){const n=Du(r,t);(typeof n=="string"||typeof n=="number"||typeof n=="boolean")&&(r._id=String(n))}return r},Uu=(e,t,r,n)=>{const o=`${t.id}:${n?"recursive":"leaf"}`,i=e.get(o);if(i){i.rows.push(r);return}e.set(o,{rows:[r],properties:t.properties,schema:t,expandEntities:n})},ju=async(e,t,r)=>{const n=new Nu(r);let o=[{rows:e,properties:t,expandEntities:!0}];for(let i=0;o.length>0;i+=1){await Promise.all(o.map(a=>{const c=a.expandEntities&&i<Qo;return Tu(a.rows,a.properties,r.semanticTypes,c?n.load:(u,d)=>Promise.resolve(d))}));for(const a of o)if(a.schema)for(const c of a.rows)Cu(c,a.schema);if(i>=Qo)return;const s=new Map;for(const a of o)if(a.expandEntities)for(const c of a.properties){if(c.primal_type!=="entity"&&c.primal_type!=="object"||!c.ref)continue;const u=r.resolveSchema(c.ref);for(const d of a.rows){if(!(c.name in d))continue;const l=d[c.name],f=c.isArray?Array.isArray(l)?l:[l]:[l];for(const[m,y]of f.entries()){if(!Lu(y))continue;const g=qu(y,u);c.isArray?f[m]=g:d[c.name]=g,Uu(s,u,g,!c.isArray)}c.isArray&&(d[c.name]=f)}}o=[...s.values()]}},ku=async(e,t,r)=>{const n=e.map(o=>({...o}));return await ju(n,t,r),n},xr=e=>`'${e.replaceAll("'","''")}'`,vt=(e,t)=>{if(e==null)return"NULL";if(typeof e=="boolean")return e?"TRUE":"FALSE";if(typeof e=="number")return String(e);if(typeof e=="bigint")return xr(e.toString());if(typeof e=="string")return xr(e);if(e instanceof Date){const r=t==="clickhouse"?e.toISOString().replace("T"," ").replace("Z",""):e.toISOString();return xr(r)}if(Buffer.isBuffer(e)){const r=e.toString("hex");return t==="oracle"?`HEXTORAW('${r}')`:t==="postgresql"?`decode('${r}', 'hex')`:t==="snowflake"?`TO_BINARY('${r}', 'HEX')`:`unhex('${r}')`}throw new TypeError(`Unsupported ${t} display parameter type: ${typeof e}`)},Mu=(e,t)=>e.replace(/\{p(\d+):[^}]+\}/g,(r,n)=>{const o=Number(n);return o in t?vt(t[o],"clickhouse"):r}),xu=(e,t)=>e.replace(/:([1-9]\d*)\b/g,(r,n)=>{const o=Number(n)-1;return o in t?vt(t[o],"oracle"):r}),Vu=(e,t)=>{let r="",n;for(let o=0;o<e.length;o+=1){const i=e[o];if(i){if(n){r+=i,i===n&&(e[o+1]===n?(r+=n,o+=1):n=void 0);continue}if(i==="'"||i==='"'){n=i,r+=i;continue}if(i==="$"){const s=/^\$(\d+)/.exec(e.slice(o)),a=s?.[1];if(s&&a){const c=Number(a)-1;if(c in t){r+=vt(t[c],"postgresql"),o+=s[0].length-1;continue}}}r+=i}}return r},vu=(e,t)=>{let r="",n=0,o;for(let i=0;i<e.length;i+=1){const s=e[i];if(s){if(o){r+=s,s===o&&(e[i+1]===o?(r+=o,i+=1):o=void 0);continue}if(s==="'"||s==='"'||s==="`"){o=s,r+=s;continue}if(s==="?"&&n<t.length){r+=vt(t[n],"snowflake"),n+=1;continue}r+=s}}return r},Bu=e=>{if(e.url!==void 0)return e.url;const t=e.host??"localhost";if(/^[a-z][a-z\d+.-]*:\/\//iu.test(t)){if(e.port===void 0)return t;const n=new URL(t);return n.port=String(e.port),n.toString()}return`http://${t}:${e.port??8123}`},Fu=e=>e===null?"Nullable(String)":typeof e=="boolean"?"Bool":typeof e=="number"?"Float64":e instanceof Date?"DateTime64(3)":"String",Yu=e=>e instanceof Date?e.toISOString().replace("T"," ").replace("Z",""):e;class Qu{kind="clickhouse";client;constructor(t={}){this.client=t.client??ci({url:Bu(t),username:t.username??t.user??"default",password:t.password??"",database:t.database??"default"})}quoteIdentifier(t){return`\`${t.replaceAll("`","``")}\``}tableAlias(t,r){return`${t} AS ${this.quoteIdentifier(r)}`}paginate(t,r,n){return`${t} LIMIT ${r}${n>0?` OFFSET ${n}`:""}`}parameter(t,r){return`{p${t}:${Fu(r)}}`}displayQuery(t,r){return Mu(t,r)}dateBucket(t,r){if(r==="second")return`toDateTime64(${t}, 0)`;const o={minute:"toStartOfMinute",hour:"toStartOfHour",day:"toStartOfDay",week:"toStartOfWeek",month:"toStartOfMonth",quarter:"toStartOfQuarter",year:"toStartOfYear"}[r];if(!o)throw new Error(`Unsupported ClickHouse date level: ${r}`);return`${o}(${t})`}dateShift(t,r,n){if(!new Set(["second","minute","hour","day","week","month","quarter","year"]).has(r)||!Number.isInteger(n))throw new Error(`Unsupported ClickHouse date shift: ${r}/${n}`);return`dateAdd(${r}, ${n}, ${t})`}castValue(t,r){return r==="timestamp"?`toDateTime(${t})`:r==="date"?`toDate(${t})`:t}scalarExtremum(t,r){const n=`[${r.map(s=>`toNullable(${s})`).join(", ")}]`,o=`arrayFilter(value -> isNotNull(value), ${n})`;return`if(arrayExists(value -> isNotNull(value), ${n}), ${t==="least"?"arrayMin":"arrayMax"}(${o}), NULL)`}aggregateFunction(t,r="*"){if(!/^[A-Za-z][A-Za-z0-9_]*$/.test(t))throw new Error(`Unsupported ClickHouse aggregate function: ${t}`);return`${t.toUpperCase()}(${r})`}stringify(t){return`toString(${t})`}concat(t){return`concat(${t.join(", ")})`}substring(t,r,n){return`substring(${t}, ${r}, ${n})`}regex(t,r,n){if(n&&n!=="i")throw new Error(`Unsupported ClickHouse regex options: ${n}`);const o=n==="i"?`concat('(?i)', ${r})`:r;return`match(${t}, ${o})`}arrayContains(t,r){return`has(${t}, ${r})`}expandArray(t,r,n){const o=this.quoteIdentifier(r);return{joinSql:`ARRAY JOIN ${t} AS ${o}`,valueExpression:o}}async execute(t){t.signal?.throwIfAborted();const r=Object.fromEntries(t.parameters.map((o,i)=>[`p${i}`,Yu(o)]));return(await this.client.query({query:t.sql,format:"JSONEachRow",query_params:r,...t.signal?{abort_signal:t.signal}:{}})).json()}async close(){await this.client.close()}}const te={quoteIdentifier(e){return`\`${e.replaceAll("`","``")}\``},tableAlias(e,t){return`${e} AS ${this.quoteIdentifier(t)}`},paginate(e,t,r){return`${e} LIMIT ${t}${r>0?` OFFSET ${r}`:""}`},parameter(e,t){return"?"},displayQuery(e,t){return di.format(e,[...t])},dateBucket(e,t){const r={hour:"%Y-%m-%d %H:00:00",day:"%Y-%m-%d",month:"%Y-%m-01",year:"%Y-01-01"};if(t==="week")return`DATE_SUB(DATE(${e}), INTERVAL WEEKDAY(${e}) DAY)`;if(t==="quarter")return`MAKEDATE(YEAR(${e}), 1) + INTERVAL (QUARTER(${e}) - 1) QUARTER`;const n=r[t];if(!n)throw new Error(`Unsupported MySQL-compatible date level: ${t}`);return`DATE_FORMAT(${e}, '${n}')`},dateShift(e,t,r){if(!new Set(["second","minute","hour","day","week","month","quarter","year"]).has(t)||!Number.isInteger(r))throw new Error(`Unsupported MySQL-compatible date shift: ${t}/${r}`);return`DATE_ADD(${e}, INTERVAL ${r} ${t.toUpperCase()})`},datePeriodBoundary(e,t,r){if(r==="start")return this.dateBucket(e,t);switch(t){case"hour":return`DATE_FORMAT(${e}, '%Y-%m-%d %H:59:59')`;case"day":return`TIMESTAMP(DATE(${e}), '23:59:59')`;case"month":return`TIMESTAMP(LAST_DAY(${e}), '23:59:59')`;case"year":return`CONCAT(YEAR(${e}), '-12-31 23:59:59')`;default:return this.dateShift(this.dateShift(this.dateBucket(e,t),t,1),"second",-1)}},aggregateFunction(e,t="*"){if(!/^[A-Za-z][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsupported MySQL-compatible aggregate function: ${e}`);return`${e.toUpperCase()}(${t})`},stringify(e){return`CAST(${e} AS CHAR)`},concat(e){return`CONCAT(${e.join(", ")})`},substring(e,t,r){return`SUBSTRING(${e}, ${t}, ${r})`},regex(e,t,r){if(r&&r!=="i")throw new Error(`Unsupported MySQL-compatible regex options: ${r}`);return r==="i"?`LOWER(${e}) REGEXP LOWER(${t})`:`${e} REGEXP ${t}`},arrayContains(e,t){return`JSON_OVERLAPS(${e}, JSON_ARRAY(${t}))`},expandArray(e,t,r){const n=this.quoteIdentifier(t),o=this.quoteIdentifier(r);return{joinSql:`CROSS JOIN JSON_TABLE(CASE WHEN JSON_TYPE(${e}) = 'ARRAY' THEN ${e} ELSE JSON_ARRAY() END, '$[*]' COLUMNS (${o} JSON PATH '$')) AS ${n}`,valueExpression:`${n}.${o}`}}},Hu={connectionLimit:30,maxIdle:10,idleTimeout:6e4,enableKeepAlive:!0,keepAliveInitialDelay:0};class Vr{supportsRecursiveCte=!0;pool;constructor(t={}){this.pool=t.pool??ui({...Hu,decimalNumbers:!0,...t.connection})}quoteIdentifier(t){return te.quoteIdentifier(t)}tableAlias(t,r){return te.tableAlias(t,r)}paginate(t,r,n){return te.paginate(t,r,n)}parameter(t,r){return te.parameter(t,r)}displayQuery(t,r){return te.displayQuery(t,r)}dateBucket(t,r){return te.dateBucket(t,r)}dateShift(t,r,n){return te.dateShift(t,r,n)}datePeriodBoundary(t,r,n){const o=te.datePeriodBoundary?.bind(te);if(!o)throw new Error("MySQL date period boundary renderer is unavailable");return o(t,r,n)}aggregateFunction(t,r){return te.aggregateFunction(t,r)}stringify(t){return te.stringify(t)}concat(t){return te.concat(t)}substring(t,r,n){return te.substring(t,r,n)}regex(t,r,n){return te.regex(t,r,n)}arrayContains(t,r){const n=te.arrayContains?.bind(te);if(!n)throw new Error("MySQL-compatible array conditions are unavailable");return n(t,r)}expandArray(t,r,n){const o=te.expandArray?.bind(te);if(!o)throw new Error("MySQL-compatible array expansion is unavailable");return o(t,r,n)}async execute(t){t.signal?.throwIfAborted();const[r]=await this.pool.execute(t.sql,t.parameters);if(!Array.isArray(r))throw new Error(`${this.kind} provider expected an array result`);return r}async close(){await this.pool.end()}}class Gu extends Vr{kind="doris";constructor(t={}){super(t)}}class Wu extends Vr{kind="mysql";constructor(t={}){super(t)}}const Ho=e=>{if(e==null)return null;if(typeof e=="bigint")return e.toString();if(typeof e=="string"||typeof e=="number"||typeof e=="boolean"||e instanceof Date||Buffer.isBuffer(e))return e;throw new TypeError(`Unsupported Oracle parameter type: ${typeof e}`)},zu=e=>e.reason instanceof Error?e.reason:new DOMException("The operation was aborted","AbortError");class Ku{kind="oracle";supportsHavingAlias=!1;maxInListItems=1e3;#e;#r;#t;constructor(t={}){this.#e=t.connection??{},this.#r=t.driver??{createPool:r=>zr.createPool(r)},this.#t=t.pool?Promise.resolve(t.pool):void 0}quoteIdentifier(t){return`"${t.replaceAll('"','""')}"`}tableAlias(t,r){return`${t} ${this.quoteIdentifier(r)}`}paginate(t,r,n){return n>0?`${t} OFFSET ${n} ROWS FETCH NEXT ${r} ROWS ONLY`:`${t} FETCH FIRST ${r} ROWS ONLY`}parameter(t,r){return`:${t+1}`}displayQuery(t,r){return xu(t,r.map(Ho))}dateBucket(t,r){const n={hour:"HH24",day:void 0,week:"IW",month:"MM",quarter:"Q",year:"YYYY"};if(!(r in n))throw new Error(`Unsupported Oracle date level: ${r}`);const o=n[r];return o?`TRUNC(${t}, '${o}')`:`TRUNC(${t})`}dateShift(t,r,n){if(!Number.isInteger(n))throw new Error(`Unsupported Oracle date shift: ${r}/${n}`);const i={month:1,quarter:3,year:12}[r];if(i)return`ADD_MONTHS(${t}, ${n*i})`;const a={second:{unit:"SECOND",multiplier:1},minute:{unit:"MINUTE",multiplier:1},hour:{unit:"HOUR",multiplier:1},day:{unit:"DAY",multiplier:1},week:{unit:"DAY",multiplier:7}}[r];if(!a)throw new Error(`Unsupported Oracle date shift: ${r}/${n}`);return`(${t} + NUMTODSINTERVAL(${n*a.multiplier}, '${a.unit}'))`}aggregateFunction(t,r="*"){if(!/^[A-Za-z][A-Za-z0-9_]*$/.test(t))throw new Error(`Unsupported Oracle aggregate function: ${t}`);return`${t.toUpperCase()}(${r})`}stringify(t){return`TO_CHAR(${t})`}concat(t){return`(${t.join(" || ")})`}substring(t,r,n){return`SUBSTR(${t}, ${r}, ${n})`}regex(t,r,n){if(n&&n!=="i")throw new Error(`Unsupported Oracle regex options: ${n}`);return`REGEXP_LIKE(${t}, ${r}${n?", 'i'":""})`}arrayContains(t,r){return`JSON_EXISTS(${t}, '$?(@ == $value)' PASSING ${r} AS "value")`}expandArray(t,r,n){const o=this.quoteIdentifier(r),i=this.quoteIdentifier(n);return{joinSql:`CROSS APPLY JSON_TABLE(${t}, '$[*]' COLUMNS (${i} VARCHAR2(4000) PATH '$')) ${o}`,valueExpression:`${o}.${i}`}}async#n(){this.#t??=this.#r.createPool(this.#e);try{return await this.#t}catch(t){throw this.#t=void 0,t}}async execute(t){t.signal?.throwIfAborted();const r=await this.#n();t.signal?.throwIfAborted();const n=await r.getConnection(),o=t.signal,i=()=>{n.break().catch(()=>{})};o?.addEventListener("abort",i,{once:!0});try{const s=await n.execute(t.sql,t.parameters.map(Ho),{outFormat:zr.OUT_FORMAT_OBJECT});if(o?.throwIfAborted(),!Array.isArray(s.rows))throw new Error("Oracle provider expected an array result");return s.rows}catch(s){throw o?.aborted?zu(o):s}finally{o?.removeEventListener("abort",i),await n.close()}}async close(){const t=this.#t;if(!t)return;await(await t).close(0),this.#t=void 0}}class Ju{kind="postgresql";supportsHavingAlias=!1;supportsRecursiveCte=!0;pool;constructor(t={}){this.pool=t.pool??new pi(t.connection)}quoteIdentifier(t){return`"${t.replaceAll('"','""')}"`}tableAlias(t,r){return`${t} AS ${this.quoteIdentifier(r)}`}paginate(t,r,n){return`${t} LIMIT ${r}${n>0?` OFFSET ${n}`:""}`}parameter(t,r){return`$${t+1}`}displayQuery(t,r){return Vu(t,r)}dateBucket(t,r){if(!new Set(["hour","day","week","month","quarter","year"]).has(r))throw new Error(`Unsupported PostgreSQL date level: ${r}`);return`DATE_TRUNC('${r}', ${t})`}dateShift(t,r,n){if(!new Set(["second","minute","hour","day","week","month","quarter","year"]).has(r)||!Number.isInteger(n))throw new Error(`Unsupported PostgreSQL date shift: ${r}/${n}`);return`(${t} + (${n} * INTERVAL '1 ${r}'))`}aggregateFunction(t,r="*"){if(!/^[A-Za-z][A-Za-z0-9_]*$/.test(t))throw new Error(`Unsupported PostgreSQL aggregate function: ${t}`);return`${t.toUpperCase()}(${r})`}stringify(t){return`CAST(${t} AS TEXT)`}concat(t){return`CONCAT(${t.join(", ")})`}substring(t,r,n){return`SUBSTRING(${t} FROM ${r} FOR ${n})`}regex(t,r,n){if(n&&n!=="i")throw new Error(`Unsupported PostgreSQL regex options: ${n}`);return`${t} ${n==="i"?"~*":"~"} ${r}`}arrayContains(t,r){return`${r} = ANY(${t})`}expandArray(t,r,n){const o=this.quoteIdentifier(r),i=this.quoteIdentifier(n);return{joinSql:`CROSS JOIN LATERAL unnest(${t}) AS ${o}(${i})`,valueExpression:`${o}.${i}`}}async execute(t){t.signal?.throwIfAborted();const r=await this.pool.query(t.sql,[...t.parameters]);if(t.signal?.throwIfAborted(),!Array.isArray(r.rows))throw new Error("PostgreSQL provider expected an array result");return r.rows}async close(){await this.pool.end()}}const Go=e=>{if(e==null)return null;if(e instanceof Date)return e.toISOString();if(typeof e=="bigint")return e.toString();if(typeof e=="string"||typeof e=="number"||typeof e=="boolean")return e;throw new TypeError(`Unsupported Snowflake parameter type: ${typeof e}`)},Zu=e=>e.reason instanceof Error?e.reason:new DOMException("The operation was aborted","AbortError");class Xu{kind="snowflake";#e;#r=!1;#t;constructor(t={}){this.#e=t.client??li.createConnection(t.connection??{})}quoteIdentifier(t){return`"${t.replaceAll('"','""')}"`}tableAlias(t,r){return`${t} AS ${this.quoteIdentifier(r)}`}paginate(t,r,n){return`${t} LIMIT ${r}${n>0?` OFFSET ${n}`:""}`}parameter(t,r){return"?"}displayQuery(t,r){return vu(t,r.map(Go))}dateBucket(t,r){if(!new Set(["hour","day","week","month","quarter","year"]).has(r))throw new Error(`Unsupported Snowflake date level: ${r}`);return`DATE_TRUNC('${r.toUpperCase()}', ${t})`}dateShift(t,r,n){if(!new Set(["second","minute","hour","day","week","month","quarter","year"]).has(r)||!Number.isInteger(n))throw new Error(`Unsupported Snowflake date shift: ${r}/${n}`);return`DATEADD(${r.toUpperCase()}, ${n}, ${t})`}aggregateFunction(t,r="*"){if(!/^[A-Za-z][A-Za-z0-9_]*$/.test(t))throw new Error(`Unsupported Snowflake aggregate function: ${t}`);return`${t.toUpperCase()}(${r})`}stringify(t){return`TO_VARCHAR(${t})`}concat(t){return`CONCAT(${t.join(", ")})`}substring(t,r,n){return`SUBSTRING(${t}, ${r}, ${n})`}regex(t,r,n){if(n&&n!=="i")throw new Error(`Unsupported Snowflake regex options: ${n}`);return n?`REGEXP_INSTR(${t}, ${r}, 1, 1, 0, '${n}') > 0`:`REGEXP_INSTR(${t}, ${r}) > 0`}arrayContains(t,r){return`ARRAY_CONTAINS(${r}::VARIANT, ${t})`}expandArray(t,r,n){const o=this.quoteIdentifier(r);return{joinSql:`, LATERAL FLATTEN(INPUT => ${t}) ${o}`,valueExpression:`${o}.VALUE`}}async#n(){if(!this.#r){this.#t??=new Promise((t,r)=>{this.#e.connect(n=>{if(n){r(n);return}this.#r=!0,t()})});try{await this.#t}catch(t){throw this.#t=void 0,t}}}async execute(t){t.signal?.throwIfAborted(),await this.#n(),t.signal?.throwIfAborted();const r=t.parameters.map(Go);return new Promise((n,o)=>{const i=t.signal,s={};let a=!1;const c=d=>{a||(a=!0,i?.removeEventListener("abort",u),d())},u=()=>{s.current?.cancel(),i&&c(()=>o(Zu(i)))};i?.addEventListener("abort",u,{once:!0}),s.current=this.#e.execute({sqlText:t.sql,binds:r,complete:(d,l,f)=>{if(d){c(()=>o(d));return}if(!Array.isArray(f)){c(()=>o(new Error("Snowflake provider expected an array result")));return}c(()=>n(f))}}),i?.aborted&&u()})}async close(){this.#r&&await new Promise((t,r)=>{this.#e.destroy(n=>{if(n){r(n);return}this.#r=!1,this.#t=void 0,t()})})}}class ed extends Vr{kind="starrocks";constructor(t={}){super(t)}}const td=e=>{switch(e.kind){case"mysql":{const{id:t,kind:r,...n}=e;return new Wu({connection:n})}case"doris":{const{id:t,kind:r,...n}=e;return new Gu({connection:n})}case"starrocks":{const{id:t,kind:r,...n}=e;return new ed({connection:n})}case"postgresql":{const{id:t,kind:r,...n}=e;return new Ju({connection:n})}case"clickhouse":{const{id:t,kind:r,...n}=e;return new Qu(n)}case"snowflake":{const{id:t,kind:r,...n}=e;return new Xu({connection:n})}case"oracle":{const{id:t,kind:r,...n}=e;return new Ku({connection:n})}}};class rd{create;#e=new Map;constructor(t=td){this.create=t}get(t){const r=this.#e.get(t.id);if(r){if(!ai(r.connection,t))throw new p("DATABASE_CONNECTION_CONFIGURATION_MISMATCH",`Database connection configuration changed for id: ${t.id}`,{connectionId:t.id});return r.provider}const n=this.create(t);return this.#e.set(t.id,{connection:t,provider:n}),n}async close(){const t=[...this.#e.values()].map(({provider:o})=>o);this.#e.clear();const r=await Promise.allSettled(t.map(async o=>o.close())),n=[];for(const o of r)o.status==="rejected"&&n.push(o.reason);if(n.length>0)throw new AggregateError(n,"Failed to close one or more database connections")}}const Wo=new rd,nd=e=>Wo.get(e),od=async()=>Wo.close(),id=new Set(["$sply","$splm","$splq","$splw","$yoy","$mom","$qoq","$wow","$yoyd","$momd","$qoqd","$wowd","$percentage"]),zo=e=>!ee(e)||!Array.isArray(e.properties)?[]:e.properties.filter(ee),ze=(e,t,r)=>{const n=(o,i,s)=>{const u=zo(r[o]).map(y=>{const g=typeof y.id=="string"?y.id:void 0,_=typeof y.name=="string"?y.name:void 0,$=[g,_].filter(E=>!!E&&(i===E||i.startsWith(`${E}_`))).sort((E,h)=>h.length-E.length)[0];return $?{property:y,key:$}:void 0}).filter(y=>!!y).sort((y,g)=>g.key.length-y.key.length)[0];if(!u)return;const d=String(u.property.id??u.property.name),l=i===u.key?"":i.slice(u.key.length+1);if(!l)return d;const f=typeof u.property.ref=="string"?u.property.ref:void 0;if(!f||s.has(f))return;const m=n(f,l,new Set(s).add(f));return m?`${d}_${m}`:void 0};return n(e,t,new Set([e]))},vr=(e,t,r)=>{const n=zo(r[e]).filter(o=>typeof o.id=="string").sort((o,i)=>String(i.id).length-String(o.id).length).find(o=>t===o.id||t.startsWith(`${String(o.id)}_`));if(!(!n||typeof n.id!="string")){if(t===n.id)return n.id;if(typeof n.ref=="string")return vr(n.ref,t.slice(n.id.length+1),r)}},Ko=e=>Object.keys(e).filter(t=>t!=="$and"&&t!=="$or"),ee=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Jo=e=>{if(!ee(e))return e;if(ee(e.$offset)){const t=Object.entries(e.$offset),r=t[0];if(t.length===1&&r&&Number.isInteger(r[1]))return{granularity:r[0],offset:r[1]}}return e},sd=(e,t)=>{const n=e&&({$sply:"$periodShift",$splm:"$periodShift",$splq:"$periodShift",$splw:"$periodShift",$yoy:"$periodGrowth",$mom:"$periodGrowth",$qoq:"$periodGrowth",$wow:"$periodGrowth",$yoyd:"$periodDifference",$momd:"$periodDifference",$qoqd:"$periodDifference",$wowd:"$periodDifference",$dailyavg:"$averagePerPeriod",$weeklyavg:"$averagePerPeriod",$monthlyavg:"$averagePerPeriod",$startOfPeriod:"$periodValue",$endOfPeriod:"$periodValue",$dateLevel:"$dateBucket",$uniq:"$countDistinct",$percentage:"$shareOfTotal"}[e]??e),o={...t};return e==="$sply"||e==="$yoy"||e==="$yoyd"?o.time??={granularity:"year",offset:-1}:e==="$splm"||e==="$mom"||e==="$momd"?o.time??={granularity:"month",offset:-1}:e==="$splq"||e==="$qoq"||e==="$qoqd"?o.time??={granularity:"quarter",offset:-1}:e==="$splw"||e==="$wow"||e==="$wowd"?o.time??={granularity:"week",offset:-1}:e==="$dailyavg"?o.granularity??="day":e==="$weeklyavg"?o.granularity??="week":e==="$monthlyavg"?o.granularity??="month":e==="$startOfPeriod"?o.boundary??="start":e==="$endOfPeriod"&&(o.boundary??="end"),{...n?{operator:n}:{},args:o}},be=e=>{if(Array.isArray(e))return e.map(be);if(!ee(e))return e;const t=Jo(e);if(t!==e)return t;const r=e,n={};for(const[i,s]of Object.entries(r))i==="skip"||i==="_snapshot"||i==="_snapshots"||(n[i]=be(s));if(typeof r.version=="string"&&/^1\./.test(r.version)&&(n.version="2.0"),Array.isArray(r.groupby)){const i=r.groupby;n.groupby=i.map(s=>{if(!ee(s))return s;const{_id:a,level:c,...u}=s,d={...u,...u.pred===void 0&&typeof a=="string"?{pred:a}:{}};return typeof c=="string"&&(d.operator="$dateBucket",d.args={...ee(d.args)?d.args:{},granularity:c}),d})}const o=r.skip;if(typeof o=="number"&&Number.isInteger(o)&&o>=0){const i=r.limit;o===0?delete n.skip:typeof i=="number"&&Number.isInteger(i)&&i>0&&o%i===0?n.page=o/i+1:n.skip=o}else o!==void 0&&(n.skip=be(o));if(r.operator&&typeof r.operator=="string"){const i=sd(r.operator,ee(n.args)?n.args:{});i.operator&&(n.operator=i.operator),n.args=i.args,id.has(r.operator)&&typeof n.pred=="string"&&(n.pred={operator:"$sum",pred:n.pred})}return r.params!==void 0&&n.args===void 0&&(n.args=Array.isArray(r.params)?{values:be(r.params)}:be(r.params)),r.inputs!==void 0&&n.pred===void 0&&Array.isArray(r.inputs)&&(n.pred=r.inputs.map(be),ee(n.args)&&delete n.args.inputs),r.pred===void 0&&typeof r.operator=="string"&&r.operator==="$sql"&&typeof r.sql=="string"&&(n.args={...ee(n.args)?n.args:{},sql:r.sql},delete n.sql),r.$options!==void 0&&n.$regex!==void 0&&(n.args={...ee(n.args)?n.args:{},options:r.$options},delete n.$options),r.query&&ee(r.query)&&(n.query=ad(r.query)),n},ad=e=>{const t=be(e);for(const[r,n]of Object.entries(t))t[r]=Jo(n);return t},Zo=(e,t)=>{const r=ee(e)?e:void 0,n=be(e);if(!ee(n))return n;if(r&&typeof r.operator=="string"&&r.preds===void 0){const o={};for(const a of["version","schema","query","groupby","having","sort","limit","page","skip","output","representation","currency"])n[a]!==void 0&&(o[a]=n[a]);const i=new Set(["version","schema","query","groupby","having","sort","limit","page","skip","output","representation","currency"]),s=Object.fromEntries(Object.entries(n).filter(([a])=>!i.has(a)));return o.preds=[s],Zo(o)}return(n.version===void 0||typeof n.version=="string"&&/^1\./.test(n.version))&&(n.version="2.0"),t?cd(n,t):n},cd=(e,t)=>{const r=e;if(!Array.isArray(r.preds))return e;const n=r.preds,o=typeof r.schema=="string"?r.schema:void 0;if(!o)return e;const i=new Set([o]);for(const c of n)ee(c)&&typeof c.schema=="string"&&i.add(c.schema);if(i.size<2)return e;if(!t)throw new Error("Cannot migrate cross-Schema LogicForm without Schema metadata for field alignment");const s=Array.isArray(r.groupby)?r.groupby.map(c=>ee(c)&&typeof c.pred=="string"?ze(o,c.pred,t):void 0):[];for(const c of i)if(Array.isArray(r.groupby)&&r.groupby.map((u,d)=>{if(!ee(u)||typeof u.pred!="string")return u;const l=c===o?ze(c,u.pred,t):ze(c,vr(o,s[d]??"",t)??u.pred,t);if(!l)return u;const f=l.split("_").at(-1)??u.pred;return{...u,pred:l,name:f}}),ee(r.query))for(const u of Ko(r.query)){const d=ze(o,u,t);if(!(c===o?d:ze(c,(d&&vr(o,d,t))??u,t))&&c===o)throw new Error(`Cannot align legacy query field ${u} in Schema ${c}`)}const a={...r};if(Array.isArray(r.groupby)&&(a.groupby=r.groupby.map((c,u)=>{if(!ee(c)||typeof c.pred!="string")return c;const d=s[u];return d?{...c,pred:d}:c})),ee(r.query)){const c=r.query,u=Ko(c).map(d=>[ze(o,d,t)??d,c[d]]);a.query=Object.fromEntries(u)}return a},ud=e=>{const t=(r,n)=>{if(Array.isArray(r)){r.forEach((o,i)=>t(o,`${n}[${i}]`));return}if(ee(r))for(const[o,i]of Object.entries(r)){if(["is_snapshot","is_observation","_snapshot","_snapshots","$options","params","inputs"].includes(o))throw new p("LEGACY_LOGICFORM_NOT_ALLOWED",`Legacy LogicForm field is not supported in v2: ${n}.${o}`);if(o==="_id"&&(n.endsWith(".groupby")||n.includes(".groupby[")))throw new p("LEGACY_LOGICFORM_NOT_ALLOWED",`Legacy LogicForm field is not supported in v2: ${n}.${o}`);t(i,`${n}.${o}`)}};t(e,"$")},Br=e=>{if(Array.isArray(e))return e.map(Br).filter(n=>n!==void 0);if(typeof e!="object"||e===null||Object.prototype.toString.call(e)!=="[object Object]")return e;const t=Object.entries(e),r=t.filter(([,n])=>n!==null).map(([n,o])=>[n,Br(o)]).filter(([,n])=>n!==void 0);if(!(t.length>0&&r.length===0))return Object.fromEntries(r)},dd=e=>{if(e.comparable!=null)return e.comparable;if(e.is_comparable!==!0||e.isArray===!0||e.type!=="string"&&e.type!=="category"||!Array.isArray(e.constraints?.enum))return;const r=e.constraints.enum.map(n=>Array.isArray(n)?n[0]:n);if(!(r.length===0||r.some(n=>typeof n!="string")))return{values:[...new Set(r)],direction:e.comparable_order===-1?-1:1}},pd=e=>{if(typeof e!="object"||e===null||Array.isArray(e))return e;const t=e;if(t.sql!=null)return Object.keys(t).every(r=>r==="sql")?e:{sql:t.sql}},ld=(e,t=[],r=!0)=>{const n=wt(t),o={},i=new Set(n.flatMap(s=>[...s.schemaMetadata?.keys??[],...s.legacySchemaKeys??[]]));for(const[s,a]of Object.entries(e)){const c=Br(a),u=c,l=(Array.isArray(u.properties)?u.properties:[]).some(E=>E.is_observation===!0)||u.is_observation===!0,f=u.is_snapshot===!0,m=typeof c.id=="string"&&c.id.length>0?c.id:r&&typeof c._id=="string"&&c._id.length>0?c._id:c.id,{properties:y}=c,g=Object.fromEntries(Object.entries(c).filter(([E])=>(r?!["_id","_sid","sid","is_observation","is_snapshot"].includes(E):E!=="properties")&&E!=="properties"&&!i.has(E))),_=y.map(E=>{const h=E,S=typeof h.id=="string"&&h.id.length>0?h.id:r&&typeof h._id=="string"&&h._id.length>0?h._id:h.id,{udf:N,...k}=h,j=dd(h),v=pd(N),K=j!==void 0&&h.comparable==null?"category":h.type==="object"?"entity":h.type;return{...r?Object.fromEntries(Object.entries(k).filter(([L])=>!["_id","_sid","sid","is_observation","is_comparable","comparable_order"].includes(L))):k,type:K,...h.primal_type==="object"?{primal_type:"entity"}:{},...S!==void 0?{id:S}:{},...v!==void 0?{udf:v}:{},...j!==void 0?{comparable:j}:{}}});let R={};for(const E of n)for(const h of E.schemaMetadata?.keys??[])c[h]!==void 0&&(R={...R,[h]:c[h]});for(const E of n)R={...R,...E.normalizeLegacySchema?.({source:c,properties:_})};const $={...g,...m!==void 0?{id:m}:{},properties:_,...r&&(f||l)?{temporalSemantics:"snapshot"}:{},...R};o[s]=$}return o};J.extend(dt),J.extend(pt);const Fr=e=>({kind:"query",logicform:e.logicform,...e.prepare!==void 0?{prepare:e.prepare}:{},...e.mapResult?{mapResult:e.mapResult}:{},...e.groupKeyShifts?{groupKeyShifts:e.groupKeyShifts}:{}}),Xo=e=>e instanceof Error?e:new Error(String(e)),fd=(e,t="zh-CN",r)=>e instanceof p?e.localizedMessage(t,r):e.message,md=(e,t,r={},n="zh-CN",o)=>{const i=Xo(e);return{errorCode:"100",error:fd(i,n,o),result:[],...r.schema?{schema:r.schema}:{},normedLogicform:r.normedLogicform??t,sqls:r.sqls??[],...r.provider?{provider:r.provider}:{},...r.lineage?{lineage:r.lineage}:{}}},yd=(e,t,r)=>{if(e.length<2||e.some(i=>i.kind==="js"||i.kind==="query"&&i.unit.mapResult))return!1;const n=new Set,o=[...e.flatMap(({sources:i})=>i),...de(r)];for(const i of o){const s=t.findSource(i.schemaId,i.source);if(!s)return!1;n.add(s.connectionId)}return n.size<=1},hd=async(e,t,r)=>{await e?.({...t,partialResult:r})},gd=(e,t,r,n,o,i,s=r)=>({type:r,explain:i.translate(o,s==="time-watermark"?"sql.timeWatermark":s==="entity-expansion"?"sql.entityExpansion":s==="computation"?"sql.computation":"sql.semanticResolution"),logicform:n,sql:e.sql,parameters:[...e.parameters],displaySql:t.displayQuery(e.sql,e.parameters)}),ei=(e,t)=>{if(t.connectionId)for(const r of de(e)){const n=t.schemaMappings.findSource(r.schemaId,r.source);if(!n)throw new p("SCHEMA_MAPPING_NOT_FOUND",`Schema mapping is not registered: ${r.schemaId}:${r.source}`,{schemaId:r.schemaId,source:r.source});if(n.connectionId!==t.connectionId)throw new p("CROSS_CONNECTION_QUERY_UNSUPPORTED",`One physical query cannot use multiple database connections: ${t.connectionId}, ${n.connectionId}`,{schemaId:r.schemaId,source:r.source,connectionId:n.connectionId})}},$d=e=>{const t=new Set,r=n=>{n.schema&&t.add(n.schema),n.from&&r(n.from)};return r(e),[...t]},wd="YYYY-MM-DD HH:mm:ss",ti=(e,t)=>J(e).endOf(t==="week"?"isoWeek":t).toDate(),Yr=e=>J(e).format(wd),Ad=(e,t)=>{const r=e??{type:"database_latest"};if(r.type==="database_latest"||Number.isInteger(r.offset))return r;throw new p("INVALID_TIME_WATERMARK",`${t} timeWatermark must be database_latest or now_offset with an integer offset`,{owner:t,timeWatermark:e})},Qr=e=>{const t=e.schema?[e.schema]:[];return e.pred&&typeof e.pred=="object"&&!Array.isArray(e.pred)?[...t,...Qr(e.pred)]:Array.isArray(e.pred)?[...t,...e.pred.flatMap(r=>typeof r=="string"?[]:Qr(r))]:t},Ed=async(e,t)=>{const r=t.locale??"zh-CN",n=t.localeRegistry??yt(t.locales),o=t.plugins??[],i=e.version,s=typeof i=="string"&&(/^2\./.test(i)||/^[3-9]\d*\./.test(i)),a=i===void 0||typeof i=="string"&&/^1\./.test(i);s&&ud(e);const c=a?Zo(e,t.schemas):e,u={...t,locale:r,localeRegistry:n,schemas:ld(t.schemas,o,a)},d=Wr.now(),l=u.semanticTypes??Po(),f=u.operators??Ie(o);if(u.operators)for(const D of o)for(const L of D.operators??[])if(f.has(L.name)){if(f.get(L.name)!==L)throw new p("PLUGIN_OPERATOR_ALREADY_REGISTERED",`Plugin Operator is already registered: ${L.name}`,{operator:L.name,plugin:D.name})}else f.register(L);const m=u.schemaMappings,y=new Date,g=new Map;let _={provider:u.provider.kind};const R=[],$=(D,L,V,q=L)=>{R.push(gd(Bo(D),u.provider,L,V,u.locale??"zh-CN",n,q)),_={..._,sqls:[...R]}},E=async(D,L={})=>{_={..._,...L},await hd(u.onProgress,D,_)},h=D=>Oo(Hi(D,u.schemas),l,o),S=new Map,N=D=>{const L=S.get(D);return L||(Oe(u.permissions,D),h(D))},k=D=>{if(D.schema)return N(D.schema);if(D.from)return k(D.from);throw new p("LOGICFORM_SCHEMA_REQUIRED","A LogicForm must contain a physical schema leaf")},j={resolveSchema:N,canUsePropertyRowIdentity:(D,L)=>De(u.permissions,D.id,L)},v=(D,L)=>{const V=Wn(he(D,k(D),f,m,j),L);return S.set(V.id,V),V},K=async(D,L,V)=>{const q=`${D.id}:${L.id}:${V.toISOString()}`,re=g.get(q);if(re)return re;const W=(async()=>{const Z=[...new Set((c.preds??[]).flatMap(Qr).filter(O=>O!==D.id))],ne=[{schema:D,property:L}];for(const O of Z){const U=N(O),M=c.propertyResolve?.[O],C=M?.[L.id]??M?.[L.name]??ko(D,L.name,U,N);if(!C)throw new p("TIME_WATERMARK_PROPERTY_RESOLVE_REQUIRED",`Cross-Schema timeWatermark requires propertyResolve for ${O}.${L.name}`,{schemaId:O,property:L.name});const B=U.properties.find(({id:F,name:oe})=>F===C||oe===C);if(!B||B.primal_type!=="date")throw new p("TIME_WATERMARK_PROPERTY_REQUIRED",`timeWatermark Property is not a date Property: ${O}.${C}`,{schemaId:O,property:C});ne.push({schema:U,property:B})}const X=ne.map(({schema:O,property:U})=>{const M=Ad(U.timeWatermark??O.timeWatermark??u.timeWatermark,`${O.id}.${U.id}`);if(M.type==="now_offset"){const C=ti(J(y).add(M.offset,"day").toDate(),U.granularity??"day");return{operator:"$constant",args:{value:Yr(C),type:"timestamp"},name:`${O.name}\u6570\u636E\u65F6\u95F4`}}return{operator:"$periodBoundary",args:{boundary:"end"},pred:{operator:"$max",pred:U.name,schema:O.id},name:`${O.name}\u6700\u65B0\u65F6\u95F4`}});X.some(({operator:O})=>O==="$periodBoundary")&&X.push({operator:"$constant",args:{value:Yr(ti(y,L.granularity??"day")),type:"timestamp"},name:"\u73B0\u5728"}),X.push({operator:"$constant",args:{value:Yr(V),type:"timestamp"},name:"\u63D0\u95EE\u65F6\u95F4\u4E0A\u754C"});const ce={version:c.version,schema:D.id,preds:[{name:"__timeWatermark__",operator:"$least",pred:X}]},Q=Ce(ce,u.permissions,N,!1,new Set,o),w=await Qe(Q,D,{semanticTypes:l,operators:f,plugins:o,now:y,...u.locale?{locale:u.locale}:{},localeRegistry:n,resolveSchema:N,resolveFromSchema:v}),A=he(w,D,f,m,j);ei(A,u);const I=fe(A,u.provider,f);$(I,"semantic-resolution",w,"time-watermark");const b=await We(I,de(A),u),T=b[0]?.__timeWatermark__??Object.values(b[0]??{})[0];if(T==null||!(T instanceof Date)&&typeof T!="string"&&typeof T!="number")return;const P=T instanceof Date?T:new Date(T);return Number.isNaN(P.getTime())?void 0:P})();return g.set(q,W),W};try{u.signal?.throwIfAborted(),Dr(c),await E({stage:"started",logicform:c}),wu(u.permissions,h);const D=k(c);await E({stage:"validated",schema:D});const L=Ce(c,u.permissions,N,!0,new Set,o),V=await Qe(L,D,{semanticTypes:l,operators:f,plugins:o,now:y,...u.locale?{locale:u.locale}:{},localeRegistry:n,resolveSchema:N,resolveFromSchema:v,canProjectProperty:(O,U)=>De(u.permissions,O.id,U),requestTimeWatermark:K});await E({stage:"normalized",normedLogicform:V},{normedLogicform:V});const q=he(V,D,f,m,j);ei(q,u);const re=q.columnProperties??[],W=Gn(q,D);S.set(W.id,W),await E({stage:"planned",plan:q},{schema:W});const Z=jn(q,D,u.provider,f);await E({stage:"lineage",lineage:Z},{lineage:Z});const ne=Nr(V,q,D,f,N,void 0,r,n.translator(r)),X=async O=>{const U=k(O.logicform),M=O.prepare?await Qe(Ce(O.logicform,u.permissions,N,!0,new Set,o),U,{semanticTypes:l,operators:f,plugins:o,now:y,...u.locale?{locale:u.locale}:{},localeRegistry:n,resolveSchema:N,resolveFromSchema:v,canProjectProperty:(F,oe)=>De(u.permissions,F.id,oe),requestTimeWatermark:K}):O.logicform,C=he(M,U,f,m,j),B=Nr(M,C,U,f,N,O.logicform,r,n.translator(r));if(B){if(B.length!==1)throw new Error("A generated component must produce exactly one execution unit");const F=B[0];if("logicform"in F){const G=await X(F),se=G.component.mapResult,pe=O.mapResult;return{...G,component:{...O,logicform:G.component.logicform,...se||pe?{mapResult:le=>{const Ne=se?.(le)??[...le];return pe?.(Ne)??[...Ne]}}:{}}}}if("mergeRow"in F)throw new p("UNSUPPORTED_NESTED_JS_COMPONENT","A JavaScript composite metric cannot currently be nested as a generated component");const oe=await Promise.all(F.components.map(async G=>({name:G.name,prepared:await X(Fr(G)),...G.groupKeyShifts?{groupKeyShifts:G.groupKeyShifts}:{},...G.joinKeys?{joinKeys:G.joinKeys}:{}}))),H=Ir(F,oe.map(({name:G,prepared:se,...pe})=>({name:G,plan:se.plan,...pe})),C,F.outputName,u.provider,f);return{component:{...O,logicform:M},plan:C,compiled:H,sources:Vt(oe.map(({prepared:G})=>G.sources))}}return{component:{...O,logicform:M},plan:C,compiled:fe(C,u.provider,f),sources:de(C)}},ce=async(O,U)=>{const M=Nr(O,U,k(O),f,N,void 0,r,n.translator(r));if(!M)return{compiled:fe(U,u.provider,f),sources:de(U)};const C=await Promise.all(M.map(async B=>{if("logicform"in B){const H=await X(B);return{plan:H.plan,compiled:H.compiled,outputs:H.plan.projections.map(({name:G})=>G).filter(G=>!U.groupBy.some(se=>se.name===G))}}if("mergeRow"in B)throw new p("UNSUPPORTED_NESTED_JS_COMPONENT","JavaScript composite metrics cannot be used as a derived source");const F=await Promise.all(B.components.map(async H=>{const G=await X(Fr(H));return{name:H.name,plan:G.plan,...H.joinKeys?{joinKeys:H.joinKeys}:{},...H.groupKeyShifts?{groupKeyShifts:H.groupKeyShifts}:{}}})),oe=Ir(B,F,U,B.outputName,u.provider,f);return{plan:U,compiled:oe,outputs:[B.outputName,...B.components.map(H=>H.name)]}}));return{compiled:no(C,U,u.provider,f),sources:Vt(C.map(({plan:B})=>de(B)))}},Q=ne?await Promise.all(ne.map(async O=>{if("logicform"in O)return{kind:"query",unit:O,...await X(O)};const U=await Promise.all(O.components.map(async C=>({name:C.name,prepared:await X(Fr(C)),...C.groupKeyShifts?{groupKeyShifts:C.groupKeyShifts}:{},...C.joinKeys?{joinKeys:C.joinKeys}:{}})));if("mergeRow"in O)return{kind:"js",unit:O,components:U.map(({prepared:C})=>C)};const M=U.map(({name:C,prepared:B,...F})=>({name:C,plan:B.plan,...F}));return{kind:"component",unit:O,plan:q,compiled:Ir(O,M,q,O.outputName,u.provider,f),sources:Vt(U.map(({prepared:C})=>C.sources))}})):void 0,w=Q&&yd(Q,m,q)?no(Q.map(O=>{const U=new Set(q.groupBy.map(({name:C})=>C));if(O.kind==="query")return{plan:O.plan,compiled:O.compiled,outputs:O.plan.projections.map(({name:C})=>C).filter(C=>!U.has(C))};const M=O.unit.outputName;if(!M)throw new p("INVALID_COMPONENT_PLAN","Component output projection is missing");return{plan:O.plan,compiled:O.compiled,outputs:[M,...O.unit.components.map(C=>C.name)]}}),q,u.provider,f):void 0,A=Q?void 0:await(async()=>{if(!q.sourcePlan||!q.sourceLogicform)return fe(q,u.provider,f);const O=await ce(q.sourceLogicform,q.sourcePlan),U={...q};delete U.sourcePlan,delete U.sourceLogicform;const M={...U,sourceSql:O.compiled.sql,source:q.source},C=fe(M,u.provider,f,O.compiled.parameters.length);return{sql:C.sql,parameters:[...O.compiled.parameters,...C.parameters]}})();if(w)$(w,"computation",V);else if(Q)for(const O of Q)if(O.kind==="js")for(const U of O.components)$(U.compiled,"computation",U.component.logicform);else $(O.compiled,"computation",V);else $(A,"computation",V);await E({stage:"compiled",sqls:[...R]},{sqls:[...R]}),await E({stage:"executing",provider:u.provider.kind});const I=w?await(async()=>{const O=await We(w,Vt([...Q.map(M=>M.sources),de(q)]),u);return await Tt(O,q.projections,f)})():Q?Bc(await Promise.all(Q.map(async O=>{if(O.kind==="js"){const C=await Promise.all(O.components.map(async B=>{const F=await We(B.compiled,B.sources,u),oe=await Tt(F,B.plan.projections,f);return B.component.mapResult?.(oe)??oe}));return Promise.all($o(C,q.groupBy.map(({name:B})=>B)).map(async B=>{const F=await O.unit.mergeRow(B);return{...B,[O.unit.outputName]:F}}))}const U=await We(O.compiled,O.sources,u),M=O.kind==="query"?await Tt(U,O.plan.projections,f):U;return O.kind==="query"?O.unit.mapResult?.(M)??M:M})),q):await(async()=>{const O=await We(A,de(q),u);return Tt(O,q.projections,f)})();await E({stage:"hydrating"});const b=await ku(I,re,{semanticTypes:l,resolveSchema:N,fetchEntities:O=>Ru(O,{version:V.version,operators:f,schemaMappings:m,semanticTypes:l,plugins:o,...u.locale?{locale:u.locale}:{},localeRegistry:n,resolveSchema:N,...u.permissions?{permissions:u.permissions}:{},provider:u.provider,...u.cache?{cache:u.cache}:{},...u.signal?{signal:u.signal}:{},onCompiled:(U,M)=>$(U,"semantic-resolution",M,"entity-expansion")})}),T=mo(b,q.rowIdentity);return await E({stage:"result",result:T},{result:T,sqls:[...R]}),await E({stage:"completed",durationMs:Wr.now()-d}),{result:T,schema:W,normedLogicform:V,sqls:[...R],lineage:Z,provider:u.provider.kind}}catch(D){const L=Xo(D);try{await E({stage:"failed",error:L})}catch{}throw L}},_d=async(e,t)=>{let r={};const n=t.locale??"zh-CN",o=yt(t.locales);try{if(t.connections.length===0)throw new p("DATABASE_CONNECTION_REQUIRED","At least one database connection is required");const i=new Map;for(const m of t.connections){if(m.id.trim().length===0)throw new p("INVALID_DATABASE_CONNECTION","Database connection id must not be empty");if(i.has(m.id))throw new p("DATABASE_CONNECTION_ALREADY_REGISTERED",`Database connection id is duplicated: ${m.id}`,{connectionId:m.id});i.set(m.id,m)}const s=new hr(t.schemaMappings),a=new Set;for(const m of $d(e))for(const y of s.list(m))a.add(y.connectionId);if(a.size>1)throw new p("CROSS_CONNECTION_QUERY_UNSUPPORTED",`One LogicForm cannot compile into SQL for multiple database connections: ${[...a].join(", ")}`,{connectionIds:[...a]});const[c]=a;if(!c)throw new p("LOGICFORM_SCHEMA_REQUIRED","A LogicForm must contain at least one physical Schema leaf");const u=i.get(c);if(!u)throw new p("DATABASE_CONNECTION_NOT_FOUND",`Database connection is not registered: ${c}`,{connectionId:c});const d=nd(u);r={provider:d.kind};const l=Ie(t.plugins),f=t.operators===void 0?[]:Array.isArray(t.operators)?t.operators:[t.operators];for(const m of f)l.register(m);return await Ed(e,{...t,schemaMappings:s,locale:n,localeRegistry:o,provider:d,operators:l,connectionId:u.id,onProgress:async m=>{r=m.partialResult,await t.onProgress?.(m)}})}catch(i){return md(i,e,r,n,o)}},ri="semanticdb_calendar_dates",Hr="semanticdb_calendar_relations",qe={dates:"__sdb_calendar_dates",relations:"__sdb_calendar_relations"},Gr=e=>`${typeof e}:${String(e)}`,Sd=(e,t)=>{const r=typeof e=="number"?e:Number(e),n=typeof t=="number"?t:Number(t);return Number.isFinite(r)&&Number.isFinite(n)?r-n:String(e).localeCompare(String(t))},ni=(e,t,r)=>{const n=r.filter(c=>c.calendar===t.calendar&&c.grain===t.grain&&c.relation===t.relation&&(t.key===void 0||c.key===t.key)),o=new Map(n.map(c=>[Gr(c.sourceDateId),c])),i=e.flatMap(c=>{const u=o.get(Gr(c))?.targetDateId;return u==null?[]:[u]}),s=[...new Map(i.map(c=>[Gr(c),c])).values()].sort(Sd),a=[];for(const c of s){const u=a[a.length-1];if(u&&typeof u.end=="number"&&typeof c=="number"&&c===u.end+1)u.end=c;else if(u&&String(u.end).match(/^\d{8}$/)&&String(c).match(/^\d{8}$/)){const d=Number(u.end),l=Number(c),f=new Date(Date.UTC(Math.floor(d/1e4),Math.floor(d/100)%100-1,d%100));f.setUTCDate(f.getUTCDate()+1);const m=new Date(Date.UTC(Math.floor(l/1e4),Math.floor(l/100)%100-1,l%100));if(f.getTime()===m.getTime()){u.end=c;continue}a.push({start:c,end:c})}else a.push({start:c,end:c})}return{dateIds:s,ranges:a}},Id=async(e,t,r)=>ni(e,t,await r.loadRelations(e,t)),Rd=(e,t)=>e.filter(r=>Object.entries(t).every(([n,o])=>r[n]===o)).map(r=>r.dateId),Od=["source_date_id","target_date_id","calendar","grain","relation","relation_key"];class bd{provider;constructor(t){this.provider=t}async loadRelations(t,r){if(t.length===0)return[];const n=[...t,r.calendar,r.grain,r.relation];r.key!==void 0&&n.push(r.key);const o=t.map((u,d)=>this.provider.parameter(d,u)),i=u=>this.provider.parameter(u,n[u]),s=u=>this.provider.quoteIdentifier(u),a=[`${s("source_date_id")} IN (${o.join(", ")})`,`${s("calendar")} = ${i(t.length)}`,`${s("grain")} = ${i(t.length+1)}`,`${s("relation")} = ${i(t.length+2)}`];return r.key!==void 0&&a.push(`${s("relation_key")} = ${i(t.length+3)}`),(await this.provider.execute({sql:`SELECT ${Od.map(s).join(", ")} FROM ${s(Hr)} WHERE ${a.join(" AND ")}`,parameters:n})).map(u=>({sourceDateId:u.source_date_id,targetDateId:u.target_date_id,calendar:String(u.calendar),grain:String(u.grain),relation:String(u.relation),...typeof u.relation_key=="string"||typeof u.relation_key=="number"?{key:String(u.relation_key)}:{}}))}}const Nd={[qe.dates]:{id:qe.dates,name:qe.dates,type:"entity",source:ri,properties:[{id:"date_id",name:"date_id",type:"id",primal_type:"string"},{id:"calendar",name:"calendar",type:"string",primal_type:"string"},{id:"grain",name:"grain",type:"string",primal_type:"string"},{id:"period_key",name:"period_key",type:"string",primal_type:"string"},{id:"relative_day",name:"relative_day",type:"int",primal_type:"number"}]},[qe.relations]:{id:qe.relations,name:qe.relations,type:"entity",source:Hr,properties:[{id:"source_date_id",name:"source_date_id",type:"string",primal_type:"string"},{id:"target_date_id",name:"target_date_id",type:"string",primal_type:"string"},{id:"calendar",name:"calendar",type:"string",primal_type:"string"},{id:"grain",name:"grain",type:"string",primal_type:"string"},{id:"relation",name:"relation",type:"string",primal_type:"string"},{id:"relation_key",name:"relation_key",type:"string",primal_type:"string"}]}},Pd=Object.freeze({execute:_d,close:od});export{ri as CALENDAR_DATES_TABLE,Hr as CALENDAR_RELATIONS_TABLE,qe as CALENDAR_SYSTEM_SCHEMA_IDS,Kt as LocaleRegistry,Pd as Logicform,qn as OperatorRegistry,Fn as PlannerSemanticRegistry,bd as ProviderCalendarRelationStore,hr as SchemaMappingRegistry,p as SemanticDBError,So as SemanticTypeRegistry,ka as builtinOperators,yr as builtinSemanticTypes,Nd as calendarSystemSchemas,yt as createLocaleRegistry,Ie as createOperatorRegistry,Yn as createPlannerSemanticRegistry,Po as createSemanticTypeRegistry,ht as defaultLocaleRegistry,mn as enUS,Ba as fromYiAskSchemaMapping,ni as resolveCalendarPeriod,Id as resolveCalendarPeriodFromStore,Cn as resolveOperator,Oo as resolveSchema,Rd as selectCalendarDates,Io as validateResolvedSchema,yn as zhCN};