{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n    QubeOptions,\n    QueryOptions,\n    InMemoryQubeData,\n    SerializedQube,\n    QubeRow,\n    FilterOptions,\n    RollupResult,\n    DimensionInfo,\n    MeasureType,\n    MeasureDefinition\n} from './contracts';\n\n// Pre-compiled measure updaters for hot path optimization\nconst MEASURE_UPDATERS: Record<MeasureType, (store: any, name: string, val: any) => void> = {\n    sum: (store, name, val) => {\n        store[name] = (store[name] || 0) + val;\n    },\n    count: (store, name) => {\n        store[name] = (store[name] || 0) + 1;\n    },\n    max: (store, name, val) => {\n        const curr = store[name];\n        if (curr === undefined || val > curr) store[name] = val;\n    },\n    min: (store, name, val) => {\n        const curr = store[name];\n        if (curr === undefined || val < curr) store[name] = val;\n    },\n    average: (store, name, val) => {\n        const curr = store[name];\n        if (curr) {\n            curr.sum += val;\n            curr.count++;\n        } else {\n            store[name] = { sum: val, count: 1 };\n        }\n    },\n    first: (store, name, val) => {\n        if (store[name] === undefined) store[name] = val;\n    },\n    last: (store, name, val) => {\n        store[name] = val;\n    },\n    distinct: (store, name, val) => {\n        const curr = store[name];\n        if (curr) {\n            curr.values.add(val);\n        } else {\n            store[name] = { values: new Set([val]) };\n        }\n    },\n    variance: (store, name, val) => {\n        const curr = store[name];\n        if (curr) {\n            curr.sum += val;\n            curr.sumOfSquares += val * val;\n            curr.count++;\n        } else {\n            store[name] = { sum: val, sumOfSquares: val * val, count: 1 };\n        }\n    },\n    stddev: (store, name, val) => {\n        const curr = store[name];\n        if (curr) {\n            curr.sum += val;\n            curr.sumOfSquares += val * val;\n            curr.count++;\n        } else {\n            store[name] = { sum: val, sumOfSquares: val * val, count: 1 };\n        }\n    }\n};\n\n// Pre-compiled aggregators for query path\nconst MEASURE_AGGREGATORS: Record<MeasureType, (current: any, newVal: any) => any> = {\n    sum: (curr, val) => (curr || 0) + val,\n    count: (curr, val) => (curr || 0) + val,\n    min: (curr, val) => curr === undefined ? val : (val < curr ? val : curr),\n    max: (curr, val) => curr === undefined ? val : (val > curr ? val : curr),\n    first: (curr, val) => curr === undefined ? val : curr,\n    last: (_, val) => val,\n    average: (curr, val) => curr \n        ? { sum: curr.sum + val.sum, count: curr.count + val.count }\n        : { sum: val.sum, count: val.count },\n    distinct: (curr, val) => {\n        if (!curr) return { values: new Set(val.values) };\n        for (const v of val.values) curr.values.add(v);\n        return curr;\n    },\n    variance: (curr, val) => curr\n        ? { sum: curr.sum + val.sum, sumOfSquares: curr.sumOfSquares + val.sumOfSquares, count: curr.count + val.count }\n        : { sum: val.sum, sumOfSquares: val.sumOfSquares, count: val.count },\n    stddev: (curr, val) => curr\n        ? { sum: curr.sum + val.sum, sumOfSquares: curr.sumOfSquares + val.sumOfSquares, count: curr.count + val.count }\n        : { sum: val.sum, sumOfSquares: val.sumOfSquares, count: val.count }\n};\n\ninterface CompiledMeasure {\n    name: string;\n    key: string;\n    type: MeasureType;\n    updater: (store: any, name: string, val: any) => void;\n    aggregator: (current: any, newVal: any) => any;\n}\n\nexport class Qube {\n    private readonly dimensionKeys: string[];\n    private readonly numDimensions: number;\n    private readonly compiledMeasures: CompiledMeasure[];\n    private data: InMemoryQubeData;\n    private _rowCount: number = 0;\n\n    constructor(private options: QubeOptions) {\n        if (!options.dimensions || options.dimensions.length === 0) {\n            throw new Error('At least one dimension is required');\n        }\n        this.dimensionKeys = options.dimensions.map(d => d.key);\n        this.numDimensions = this.dimensionKeys.length;\n        this.data = Object.create(null); // Faster than {}\n        \n        // Pre-compile measures for faster access\n        this.compiledMeasures = options.measures.map(m => ({\n            name: m.name,\n            key: m.key,\n            type: m.type,\n            updater: MEASURE_UPDATERS[m.type],\n            aggregator: MEASURE_AGGREGATORS[m.type]\n        }));\n    }\n\n    get rowCount(): number {\n        return this._rowCount;\n    }\n\n    get dimensionCount(): number {\n        return this.numDimensions;\n    }\n\n    // Kept for compatibility\n    get dimensionIndices(): string[] {\n        return this.dimensionKeys;\n    }\n\n    push(rows: QubeRow[]): void {\n        const data = this.data;\n        const measures = this.compiledMeasures;\n        const dimKeys = this.dimensionKeys;\n        const numDims = this.numDimensions;\n        const numMeasures = measures.length;\n        const lastDimIdx = numDims - 1;\n\n        for (let r = 0, rLen = rows.length; r < rLen; r++) {\n            const row = rows[r];\n            \n            // Navigate to leaf node, creating path as needed\n            let node = data;\n            let valid = true;\n            \n            for (let d = 0; d < lastDimIdx; d++) {\n                const dimVal = row[dimKeys[d]];\n                if (dimVal == null) {\n                    valid = false;\n                    break;\n                }\n                let next = node[dimVal];\n                if (!next) {\n                    next = Object.create(null);\n                    node[dimVal] = next;\n                }\n                node = next;\n            }\n            \n            if (!valid) continue;\n            \n            // Handle last dimension\n            const lastDimVal = row[dimKeys[lastDimIdx]];\n            if (lastDimVal == null) continue;\n            \n            let measureStore = node[lastDimVal];\n            if (!measureStore) {\n                measureStore = Object.create(null);\n                node[lastDimVal] = measureStore;\n            }\n\n            // Update all measures - unrolled for common cases\n            for (let m = 0; m < numMeasures; m++) {\n                const measure = measures[m];\n                const val = row[measure.key];\n                if (val != null) {\n                    measure.updater(measureStore, measure.name, val);\n                }\n            }\n\n            this._rowCount++;\n        }\n    }\n\n    query(opts: QueryOptions): number | undefined {\n        const measureName = opts.measure;\n        const measure = this.compiledMeasures.find(m => m.name === measureName);\n        if (!measure) {\n            throw new Error(`Measure '${measureName}' not found`);\n        }\n\n        const dimensions = opts.dimensions;\n        if (!dimensions || Object.keys(dimensions).length === 0) {\n            // Full aggregation - use optimized path\n            return this.aggregateAll(measure);\n        }\n\n        // Build fixed dimension lookup\n        const fixedDims = new Map<number, any>();\n        for (const key in dimensions) {\n            const idx = this.dimensionKeys.indexOf(key);\n            if (idx !== -1) {\n                fixedDims.set(idx, dimensions[key]);\n            }\n        }\n\n        let result: any;\n        this.traverseQuery(this.data, 0, fixedDims, measure, (val) => {\n            result = measure.aggregator(result, val);\n        });\n\n        return this.finalizeMeasure(result, measure.type);\n    }\n\n    private aggregateAll(measure: CompiledMeasure): number | undefined {\n        let result: any;\n        const stack: any[] = [this.data];\n        const depthStack: number[] = [0];\n        const targetDepth = this.numDimensions;\n\n        while (stack.length > 0) {\n            const node = stack.pop()!;\n            const depth = depthStack.pop()!;\n\n            if (depth === targetDepth) {\n                const val = node[measure.name];\n                if (val != null) {\n                    result = measure.aggregator(result, val);\n                }\n            } else {\n                const keys = Object.keys(node);\n                for (let i = 0, len = keys.length; i < len; i++) {\n                    const child = node[keys[i]];\n                    if (child != null) {\n                        stack.push(child);\n                        depthStack.push(depth + 1);\n                    }\n                }\n            }\n        }\n\n        return this.finalizeMeasure(result, measure.type);\n    }\n\n    private traverseQuery(\n        node: any,\n        depth: number,\n        fixedDims: Map<number, any>,\n        measure: CompiledMeasure,\n        callback: (val: any) => void\n    ): void {\n        if (node == null) return;\n\n        if (depth === this.numDimensions) {\n            const val = node[measure.name];\n            if (val != null) callback(val);\n            return;\n        }\n\n        const fixedVal = fixedDims.get(depth);\n        if (fixedVal !== undefined) {\n            const child = node[fixedVal];\n            if (child != null) {\n                this.traverseQuery(child, depth + 1, fixedDims, measure, callback);\n            }\n        } else {\n            const keys = Object.keys(node);\n            for (let i = 0, len = keys.length; i < len; i++) {\n                this.traverseQuery(node[keys[i]], depth + 1, fixedDims, measure, callback);\n            }\n        }\n    }\n\n    private finalizeMeasure(result: any, type: MeasureType): number | undefined {\n        if (result == null) return undefined;\n\n        switch (type) {\n            case 'average':\n                return result.sum / result.count;\n            case 'distinct':\n                return result.values.size;\n            case 'variance': {\n                if (result.count < 2) return 0;\n                const mean = result.sum / result.count;\n                return (result.sumOfSquares / result.count) - (mean * mean);\n            }\n            case 'stddev': {\n                if (result.count < 2) return 0;\n                const avg = result.sum / result.count;\n                const variance = (result.sumOfSquares / result.count) - (avg * avg);\n                return Math.sqrt(variance);\n            }\n            default:\n                return result;\n        }\n    }\n\n    queryWithEnumeration(dimensionToEnumerate: string, opts: QueryOptions): any[] {\n        const enumeration = this.enumerateDimension(dimensionToEnumerate);\n        const result: any[] = new Array(enumeration.length);\n        const baseDims = opts.dimensions ? { ...opts.dimensions } : {};\n\n        for (let i = 0, len = enumeration.length; i < len; i++) {\n            const item = enumeration[i];\n            baseDims[dimensionToEnumerate] = item;\n            result[i] = {\n                value: this.query({ dimensions: { ...baseDims }, measure: opts.measure }),\n                [dimensionToEnumerate]: item\n            };\n        }\n\n        return result;\n    }\n\n    enumerateDimension(dimensionName: string): any[] {\n        const dimensionIndex = this.dimensionKeys.indexOf(dimensionName);\n        if (dimensionIndex === -1) {\n            throw new Error(`Dimension '${dimensionName}' not found`);\n        }\n\n        const result = new Set<any>();\n        const stack: { node: any; depth: number }[] = [{ node: this.data, depth: 0 }];\n\n        while (stack.length > 0) {\n            const { node, depth } = stack.pop()!;\n            if (node == null) continue;\n\n            const keys = Object.keys(node);\n            for (let i = 0, len = keys.length; i < len; i++) {\n                const key = keys[i];\n                if (depth === dimensionIndex) {\n                    result.add(key);\n                } else if (depth < this.numDimensions - 1) {\n                    stack.push({ node: node[key], depth: depth + 1 });\n                }\n            }\n        }\n\n        return Array.from(result);\n    }\n\n    slice(opts: QueryOptions): number | undefined {\n        return this.query(opts);\n    }\n\n    dice(opts: QueryOptions): number | undefined {\n        const dimensions = opts.dimensions;\n        if (!dimensions) return undefined;\n        \n        const measureName = opts.measure;\n        const measure = this.compiledMeasures.find(m => m.name === measureName);\n        if (!measure) return undefined;\n\n        // Direct navigation - O(d) where d = number of dimensions\n        let node = this.data;\n        for (let i = 0; i < this.numDimensions; i++) {\n            const dimVal = dimensions[this.dimensionKeys[i]];\n            if (dimVal == null) return undefined;\n            node = node[dimVal];\n            if (node == null) return undefined;\n        }\n\n        const val = node[measureName];\n        return this.finalizeMeasure(val, measure.type);\n    }\n\n    one(opts: QueryOptions): number | undefined {\n        const measure = this.compiledMeasures.find(m => m.name === opts.measure);\n        if (!measure) {\n            throw new Error(`Measure '${opts.measure}' not found`);\n        }\n        return this.aggregateAll(measure);\n    }\n\n    rollup(dimensionToRollup: string, opts: QueryOptions): RollupResult[] {\n        const values = this.enumerateDimension(dimensionToRollup);\n        const results: RollupResult[] = new Array(values.length + 1);\n        const baseQuery = opts.dimensions ? { ...opts.dimensions } : {};\n        delete baseQuery[dimensionToRollup];\n\n        for (let i = 0, len = values.length; i < len; i++) {\n            const val = values[i];\n            results[i] = {\n                dimensions: { [dimensionToRollup]: val },\n                value: this.query({ dimensions: { ...baseQuery, [dimensionToRollup]: val }, measure: opts.measure })\n            };\n        }\n\n        results[values.length] = {\n            dimensions: { [dimensionToRollup]: '__TOTAL__' },\n            value: this.query({ dimensions: baseQuery, measure: opts.measure })\n        };\n\n        return results;\n    }\n\n    drilldown(dimensionToDrill: string, opts: QueryOptions): RollupResult[] {\n        const values = this.enumerateDimension(dimensionToDrill);\n        const results: RollupResult[] = [];\n        const baseQuery = opts.dimensions ? { ...opts.dimensions } : {};\n\n        for (let i = 0, len = values.length; i < len; i++) {\n            const val = values[i];\n            const dims = { ...baseQuery, [dimensionToDrill]: val };\n            const value = this.query({ dimensions: dims, measure: opts.measure });\n            if (value != null) {\n                results.push({ dimensions: dims, value });\n            }\n        }\n\n        return results;\n    }\n\n    filter(opts: FilterOptions): QubeRow[] {\n        const results: QubeRow[] = [];\n        const filterDims = opts.dimensions;\n        \n        // Pre-process filter dimensions for faster lookup\n        const filterMap = new Map<number, any>();\n        if (filterDims) {\n            for (const key in filterDims) {\n                const idx = this.dimensionKeys.indexOf(key);\n                if (idx !== -1) {\n                    filterMap.set(idx, filterDims[key]);\n                }\n            }\n        }\n\n        this.traverseFilter(this.data, 0, Object.create(null), filterMap, opts.predicate, results);\n        return results;\n    }\n\n    private traverseFilter(\n        node: any,\n        depth: number,\n        currentDims: Record<string, any>,\n        filterMap: Map<number, any>,\n        predicate: FilterOptions['predicate'],\n        results: QubeRow[]\n    ): void {\n        if (node == null) return;\n\n        if (depth === this.numDimensions) {\n            if (predicate && !predicate(currentDims, node)) return;\n            results.push({ ...currentDims, ...node });\n            return;\n        }\n\n        const dimKey = this.dimensionKeys[depth];\n        const filterVal = filterMap.get(depth);\n\n        if (filterVal !== undefined) {\n            if (Array.isArray(filterVal)) {\n                for (let i = 0, len = filterVal.length; i < len; i++) {\n                    const v = filterVal[i];\n                    if (node[v] != null) {\n                        currentDims[dimKey] = v;\n                        this.traverseFilter(node[v], depth + 1, currentDims, filterMap, predicate, results);\n                    }\n                }\n            } else if (node[filterVal] != null) {\n                currentDims[dimKey] = filterVal;\n                this.traverseFilter(node[filterVal], depth + 1, currentDims, filterMap, predicate, results);\n            }\n        } else {\n            const keys = Object.keys(node);\n            for (let i = 0, len = keys.length; i < len; i++) {\n                const key = keys[i];\n                currentDims[dimKey] = key;\n                this.traverseFilter(node[key], depth + 1, currentDims, filterMap, predicate, results);\n            }\n        }\n        delete currentDims[dimKey];\n    }\n\n    clear(): void {\n        this.data = Object.create(null);\n        this._rowCount = 0;\n    }\n\n    getDimensionInfo(dimensionName?: string): DimensionInfo | DimensionInfo[] {\n        if (dimensionName) {\n            const dimDef = this.options.dimensions.find(d => d.key === dimensionName);\n            if (!dimDef) {\n                throw new Error(`Dimension '${dimensionName}' not found`);\n            }\n            const values = this.enumerateDimension(dimensionName);\n            return {\n                key: dimDef.key,\n                type: dimDef.type,\n                cardinality: values.length,\n                values\n            };\n        }\n\n        return this.options.dimensions.map(d => {\n            const values = this.enumerateDimension(d.key);\n            return {\n                key: d.key,\n                type: d.type,\n                cardinality: values.length,\n                values\n            };\n        });\n    }\n\n    getMeasureInfo(): { name: string; key: string; type: MeasureType }[] {\n        return this.options.measures.map(m => ({\n            name: m.name,\n            key: m.key,\n            type: m.type\n        }));\n    }\n\n    serializeCube(): SerializedQube {\n        return {\n            options: this.options,\n            dimensionIndices: this.dimensionKeys,\n            cube: this.makeSerializable(this.data),\n            rowCount: this._rowCount\n        };\n    }\n\n    /**\n     * Serialize and compress the cube using gzip.\n     * Returns a Buffer that can be written to disk or sent over network.\n     */\n    async serializeCompressed(): Promise<Buffer> {\n        const { gzip } = await import('zlib');\n        const { promisify } = await import('util');\n        const gzipAsync = promisify(gzip);\n        \n        const json = JSON.stringify(this.serializeCube());\n        return gzipAsync(Buffer.from(json, 'utf-8'));\n    }\n\n    /**\n     * Synchronous version of serializeCompressed.\n     */\n    serializeCompressedSync(): Buffer {\n        const { gzipSync } = require('zlib') as typeof import('zlib');\n        const json = JSON.stringify(this.serializeCube());\n        return gzipSync(Buffer.from(json, 'utf-8'));\n    }\n\n    /**\n     * Restore a cube from compressed data.\n     */\n    static async fromCompressed(data: Buffer): Promise<Qube> {\n        const { gunzip } = await import('zlib');\n        const { promisify } = await import('util');\n        const gunzipAsync = promisify(gunzip);\n        \n        const json = (await gunzipAsync(data)).toString('utf-8');\n        return Qube.fromCube(JSON.parse(json));\n    }\n\n    /**\n     * Synchronous version of fromCompressed.\n     */\n    static fromCompressedSync(data: Buffer): Qube {\n        const { gunzipSync } = require('zlib') as typeof import('zlib');\n        const json = gunzipSync(data).toString('utf-8');\n        return Qube.fromCube(JSON.parse(json));\n    }\n\n    private makeSerializable(node: any): any {\n        if (node == null || typeof node !== 'object') return node;\n        if (node.values instanceof Set) {\n            return { values: Array.from(node.values) };\n        }\n\n        const result: any = {};\n        const keys = Object.keys(node);\n        for (let i = 0, len = keys.length; i < len; i++) {\n            const key = keys[i];\n            result[key] = this.makeSerializable(node[key]);\n        }\n        return result;\n    }\n\n    static fromCube(sQube: SerializedQube): Qube {\n        const cube = new Qube(sQube.options);\n        cube.data = Qube.deserializeCube(sQube.cube);\n        cube._rowCount = sQube.rowCount || 0;\n        return cube;\n    }\n\n    private static deserializeCube(node: any): any {\n        if (node == null || typeof node !== 'object') return node;\n        if (node.values && Array.isArray(node.values)) {\n            return { values: new Set(node.values) };\n        }\n\n        const result: any = Object.create(null);\n        const keys = Object.keys(node);\n        for (let i = 0, len = keys.length; i < len; i++) {\n            const key = keys[i];\n            result[key] = Qube.deserializeCube(node[key]);\n        }\n        return result;\n    }\n}"],"mappings":"yPAcA,IAAMA,EAAsF,CACxF,IAAK,CAACC,EAAOC,EAAMC,IAAQ,CACvBF,EAAMC,CAAI,GAAKD,EAAMC,CAAI,GAAK,GAAKC,CACvC,EACA,MAAO,CAACF,EAAOC,IAAS,CACpBD,EAAMC,CAAI,GAAKD,EAAMC,CAAI,GAAK,GAAK,CACvC,EACA,IAAK,CAACD,EAAOC,EAAMC,IAAQ,CACvB,IAAMC,EAAOH,EAAMC,CAAI,GACnBE,IAAS,QAAaD,EAAMC,KAAMH,EAAMC,CAAI,EAAIC,EACxD,EACA,IAAK,CAACF,EAAOC,EAAMC,IAAQ,CACvB,IAAMC,EAAOH,EAAMC,CAAI,GACnBE,IAAS,QAAaD,EAAMC,KAAMH,EAAMC,CAAI,EAAIC,EACxD,EACA,QAAS,CAACF,EAAOC,EAAMC,IAAQ,CAC3B,IAAMC,EAAOH,EAAMC,CAAI,EACnBE,GACAA,EAAK,KAAOD,EACZC,EAAK,SAELH,EAAMC,CAAI,EAAI,CAAE,IAAKC,EAAK,MAAO,CAAE,CAE3C,EACA,MAAO,CAACF,EAAOC,EAAMC,IAAQ,CACrBF,EAAMC,CAAI,IAAM,SAAWD,EAAMC,CAAI,EAAIC,EACjD,EACA,KAAM,CAACF,EAAOC,EAAMC,IAAQ,CACxBF,EAAMC,CAAI,EAAIC,CAClB,EACA,SAAU,CAACF,EAAOC,EAAMC,IAAQ,CAC5B,IAAMC,EAAOH,EAAMC,CAAI,EACnBE,EACAA,EAAK,OAAO,IAAID,CAAG,EAEnBF,EAAMC,CAAI,EAAI,CAAE,OAAQ,IAAI,IAAI,CAACC,CAAG,CAAC,CAAE,CAE/C,EACA,SAAU,CAACF,EAAOC,EAAMC,IAAQ,CAC5B,IAAMC,EAAOH,EAAMC,CAAI,EACnBE,GACAA,EAAK,KAAOD,EACZC,EAAK,cAAgBD,EAAMA,EAC3BC,EAAK,SAELH,EAAMC,CAAI,EAAI,CAAE,IAAKC,EAAK,aAAcA,EAAMA,EAAK,MAAO,CAAE,CAEpE,EACA,OAAQ,CAACF,EAAOC,EAAMC,IAAQ,CAC1B,IAAMC,EAAOH,EAAMC,CAAI,EACnBE,GACAA,EAAK,KAAOD,EACZC,EAAK,cAAgBD,EAAMA,EAC3BC,EAAK,SAELH,EAAMC,CAAI,EAAI,CAAE,IAAKC,EAAK,aAAcA,EAAMA,EAAK,MAAO,CAAE,CAEpE,CACJ,EAGME,EAA+E,CACjF,IAAK,CAACD,EAAMD,KAASC,GAAQ,GAAKD,EAClC,MAAO,CAACC,EAAMD,KAASC,GAAQ,GAAKD,EACpC,IAAK,CAACC,EAAMD,IAAQC,IAAS,QAAmBD,EAAMC,EAAbD,EAA0BC,EACnE,IAAK,CAACA,EAAMD,IAAQC,IAAS,QAAmBD,EAAMC,EAAbD,EAA0BC,EACnE,MAAO,CAACA,EAAMD,IAAQC,IAAS,OAAYD,EAAMC,EACjD,KAAM,CAACE,EAAGH,IAAQA,EAClB,QAAS,CAACC,EAAMD,IAAQC,EAClB,CAAE,IAAKA,EAAK,IAAMD,EAAI,IAAK,MAAOC,EAAK,MAAQD,EAAI,KAAM,EACzD,CAAE,IAAKA,EAAI,IAAK,MAAOA,EAAI,KAAM,EACvC,SAAU,CAACC,EAAMD,IAAQ,CACrB,GAAI,CAACC,EAAM,MAAO,CAAE,OAAQ,IAAI,IAAID,EAAI,MAAM,CAAE,EAChD,QAAWI,KAAKJ,EAAI,OAAQC,EAAK,OAAO,IAAIG,CAAC,EAC7C,OAAOH,CACX,EACA,SAAU,CAACA,EAAMD,IAAQC,EACnB,CAAE,IAAKA,EAAK,IAAMD,EAAI,IAAK,aAAcC,EAAK,aAAeD,EAAI,aAAc,MAAOC,EAAK,MAAQD,EAAI,KAAM,EAC7G,CAAE,IAAKA,EAAI,IAAK,aAAcA,EAAI,aAAc,MAAOA,EAAI,KAAM,EACvE,OAAQ,CAACC,EAAMD,IAAQC,EACjB,CAAE,IAAKA,EAAK,IAAMD,EAAI,IAAK,aAAcC,EAAK,aAAeD,EAAI,aAAc,MAAOC,EAAK,MAAQD,EAAI,KAAM,EAC7G,CAAE,IAAKA,EAAI,IAAK,aAAcA,EAAI,aAAc,MAAOA,EAAI,KAAM,CAC3E,EAUaK,EAAN,MAAMC,CAAK,CAOd,YAAoBC,EAAsB,CAAtB,aAAAA,EAFpB,KAAQ,UAAoB,EAGxB,GAAI,CAACA,EAAQ,YAAcA,EAAQ,WAAW,SAAW,EACrD,MAAM,IAAI,MAAM,oCAAoC,EAExD,KAAK,cAAgBA,EAAQ,WAAW,IAAIC,GAAKA,EAAE,GAAG,EACtD,KAAK,cAAgB,KAAK,cAAc,OACxC,KAAK,KAAO,OAAO,OAAO,IAAI,EAG9B,KAAK,iBAAmBD,EAAQ,SAAS,IAAIE,IAAM,CAC/C,KAAMA,EAAE,KACR,IAAKA,EAAE,IACP,KAAMA,EAAE,KACR,QAASZ,EAAiBY,EAAE,IAAI,EAChC,WAAYP,EAAoBO,EAAE,IAAI,CAC1C,EAAE,CACN,CAEA,IAAI,UAAmB,CACnB,OAAO,KAAK,SAChB,CAEA,IAAI,gBAAyB,CACzB,OAAO,KAAK,aAChB,CAGA,IAAI,kBAA6B,CAC7B,OAAO,KAAK,aAChB,CAEA,KAAKC,EAAuB,CACxB,IAAMC,EAAO,KAAK,KACZC,EAAW,KAAK,iBAChBC,EAAU,KAAK,cACfC,EAAU,KAAK,cACfC,EAAcH,EAAS,OACvBI,EAAaF,EAAU,EAE7B,QAASG,EAAI,EAAGC,EAAOR,EAAK,OAAQO,EAAIC,EAAMD,IAAK,CAC/C,IAAME,EAAMT,EAAKO,CAAC,EAGdG,EAAOT,EACPU,EAAQ,GAEZ,QAASb,EAAI,EAAGA,EAAIQ,EAAYR,IAAK,CACjC,IAAMc,EAASH,EAAIN,EAAQL,CAAC,CAAC,EAC7B,GAAIc,GAAU,KAAM,CAChBD,EAAQ,GACR,KACJ,CACA,IAAIE,EAAOH,EAAKE,CAAM,EACjBC,IACDA,EAAO,OAAO,OAAO,IAAI,EACzBH,EAAKE,CAAM,EAAIC,GAEnBH,EAAOG,CACX,CAEA,GAAI,CAACF,EAAO,SAGZ,IAAMG,EAAaL,EAAIN,EAAQG,CAAU,CAAC,EAC1C,GAAIQ,GAAc,KAAM,SAExB,IAAIC,EAAeL,EAAKI,CAAU,EAC7BC,IACDA,EAAe,OAAO,OAAO,IAAI,EACjCL,EAAKI,CAAU,EAAIC,GAIvB,QAAShB,EAAI,EAAGA,EAAIM,EAAaN,IAAK,CAClC,IAAMiB,EAAUd,EAASH,CAAC,EACpBT,EAAMmB,EAAIO,EAAQ,GAAG,EACvB1B,GAAO,MACP0B,EAAQ,QAAQD,EAAcC,EAAQ,KAAM1B,CAAG,CAEvD,CAEA,KAAK,WACT,CACJ,CAEA,MAAM2B,EAAwC,CAC1C,IAAMC,EAAcD,EAAK,QACnBD,EAAU,KAAK,iBAAiB,KAAKjB,GAAKA,EAAE,OAASmB,CAAW,EACtE,GAAI,CAACF,EACD,MAAM,IAAI,MAAM,YAAYE,CAAW,aAAa,EAGxD,IAAMC,EAAaF,EAAK,WACxB,GAAI,CAACE,GAAc,OAAO,KAAKA,CAAU,EAAE,SAAW,EAElD,OAAO,KAAK,aAAaH,CAAO,EAIpC,IAAMI,EAAY,IAAI,IACtB,QAAWC,KAAOF,EAAY,CAC1B,IAAMG,EAAM,KAAK,cAAc,QAAQD,CAAG,EACtCC,IAAQ,IACRF,EAAU,IAAIE,EAAKH,EAAWE,CAAG,CAAC,CAE1C,CAEA,IAAIE,EACJ,YAAK,cAAc,KAAK,KAAM,EAAGH,EAAWJ,EAAU1B,GAAQ,CAC1DiC,EAASP,EAAQ,WAAWO,EAAQjC,CAAG,CAC3C,CAAC,EAEM,KAAK,gBAAgBiC,EAAQP,EAAQ,IAAI,CACpD,CAEQ,aAAaA,EAA8C,CAC/D,IAAIO,EACEC,EAAe,CAAC,KAAK,IAAI,EACzBC,EAAuB,CAAC,CAAC,EACzBC,EAAc,KAAK,cAEzB,KAAOF,EAAM,OAAS,GAAG,CACrB,IAAMd,EAAOc,EAAM,IAAI,EACjBG,EAAQF,EAAW,IAAI,EAE7B,GAAIE,IAAUD,EAAa,CACvB,IAAMpC,EAAMoB,EAAKM,EAAQ,IAAI,EACzB1B,GAAO,OACPiC,EAASP,EAAQ,WAAWO,EAAQjC,CAAG,EAE/C,KAAO,CACH,IAAMsC,EAAO,OAAO,KAAKlB,CAAI,EAC7B,QAASmB,EAAI,EAAGC,EAAMF,EAAK,OAAQC,EAAIC,EAAKD,IAAK,CAC7C,IAAME,EAAQrB,EAAKkB,EAAKC,CAAC,CAAC,EACtBE,GAAS,OACTP,EAAM,KAAKO,CAAK,EAChBN,EAAW,KAAKE,EAAQ,CAAC,EAEjC,CACJ,CACJ,CAEA,OAAO,KAAK,gBAAgBJ,EAAQP,EAAQ,IAAI,CACpD,CAEQ,cACJN,EACAiB,EACAP,EACAJ,EACAgB,EACI,CACJ,GAAItB,GAAQ,KAAM,OAElB,GAAIiB,IAAU,KAAK,cAAe,CAC9B,IAAMrC,EAAMoB,EAAKM,EAAQ,IAAI,EACzB1B,GAAO,MAAM0C,EAAS1C,CAAG,EAC7B,MACJ,CAEA,IAAM2C,EAAWb,EAAU,IAAIO,CAAK,EACpC,GAAIM,IAAa,OAAW,CACxB,IAAMF,EAAQrB,EAAKuB,CAAQ,EACvBF,GAAS,MACT,KAAK,cAAcA,EAAOJ,EAAQ,EAAGP,EAAWJ,EAASgB,CAAQ,CAEzE,KAAO,CACH,IAAMJ,EAAO,OAAO,KAAKlB,CAAI,EAC7B,QAASmB,EAAI,EAAGC,EAAMF,EAAK,OAAQC,EAAIC,EAAKD,IACxC,KAAK,cAAcnB,EAAKkB,EAAKC,CAAC,CAAC,EAAGF,EAAQ,EAAGP,EAAWJ,EAASgB,CAAQ,CAEjF,CACJ,CAEQ,gBAAgBT,EAAaW,EAAuC,CACxE,GAAIX,GAAU,KAEd,OAAQW,EAAM,CACV,IAAK,UACD,OAAOX,EAAO,IAAMA,EAAO,MAC/B,IAAK,WACD,OAAOA,EAAO,OAAO,KACzB,IAAK,WAAY,CACb,GAAIA,EAAO,MAAQ,EAAG,MAAO,GAC7B,IAAMY,EAAOZ,EAAO,IAAMA,EAAO,MACjC,OAAQA,EAAO,aAAeA,EAAO,MAAUY,EAAOA,CAC1D,CACA,IAAK,SAAU,CACX,GAAIZ,EAAO,MAAQ,EAAG,MAAO,GAC7B,IAAMa,EAAMb,EAAO,IAAMA,EAAO,MAC1Bc,EAAYd,EAAO,aAAeA,EAAO,MAAUa,EAAMA,EAC/D,OAAO,KAAK,KAAKC,CAAQ,CAC7B,CACA,QACI,OAAOd,CACf,CACJ,CAEA,qBAAqBe,EAA8BrB,EAA2B,CAC1E,IAAMsB,EAAc,KAAK,mBAAmBD,CAAoB,EAC1Df,EAAgB,IAAI,MAAMgB,EAAY,MAAM,EAC5CC,EAAWvB,EAAK,WAAa,CAAE,GAAGA,EAAK,UAAW,EAAI,CAAC,EAE7D,QAASY,EAAI,EAAGC,EAAMS,EAAY,OAAQV,EAAIC,EAAKD,IAAK,CACpD,IAAMY,EAAOF,EAAYV,CAAC,EAC1BW,EAASF,CAAoB,EAAIG,EACjClB,EAAOM,CAAC,EAAI,CACR,MAAO,KAAK,MAAM,CAAE,WAAY,CAAE,GAAGW,CAAS,EAAG,QAASvB,EAAK,OAAQ,CAAC,EACxE,CAACqB,CAAoB,EAAGG,CAC5B,CACJ,CAEA,OAAOlB,CACX,CAEA,mBAAmBmB,EAA8B,CAC7C,IAAMC,EAAiB,KAAK,cAAc,QAAQD,CAAa,EAC/D,GAAIC,IAAmB,GACnB,MAAM,IAAI,MAAM,cAAcD,CAAa,aAAa,EAG5D,IAAMnB,EAAS,IAAI,IACbC,EAAwC,CAAC,CAAE,KAAM,KAAK,KAAM,MAAO,CAAE,CAAC,EAE5E,KAAOA,EAAM,OAAS,GAAG,CACrB,GAAM,CAAE,KAAAd,EAAM,MAAAiB,CAAM,EAAIH,EAAM,IAAI,EAClC,GAAId,GAAQ,KAAM,SAElB,IAAMkB,EAAO,OAAO,KAAKlB,CAAI,EAC7B,QAASmB,EAAI,EAAGC,EAAMF,EAAK,OAAQC,EAAIC,EAAKD,IAAK,CAC7C,IAAMR,EAAMO,EAAKC,CAAC,EACdF,IAAUgB,EACVpB,EAAO,IAAIF,CAAG,EACPM,EAAQ,KAAK,cAAgB,GACpCH,EAAM,KAAK,CAAE,KAAMd,EAAKW,CAAG,EAAG,MAAOM,EAAQ,CAAE,CAAC,CAExD,CACJ,CAEA,OAAO,MAAM,KAAKJ,CAAM,CAC5B,CAEA,MAAMN,EAAwC,CAC1C,OAAO,KAAK,MAAMA,CAAI,CAC1B,CAEA,KAAKA,EAAwC,CACzC,IAAME,EAAaF,EAAK,WACxB,GAAI,CAACE,EAAY,OAEjB,IAAMD,EAAcD,EAAK,QACnBD,EAAU,KAAK,iBAAiB,KAAKjB,GAAKA,EAAE,OAASmB,CAAW,EACtE,GAAI,CAACF,EAAS,OAGd,IAAIN,EAAO,KAAK,KAChB,QAASmB,EAAI,EAAGA,EAAI,KAAK,cAAeA,IAAK,CACzC,IAAMjB,EAASO,EAAW,KAAK,cAAcU,CAAC,CAAC,EAG/C,GAFIjB,GAAU,OACdF,EAAOA,EAAKE,CAAM,EACdF,GAAQ,MAAM,MACtB,CAEA,IAAMpB,EAAMoB,EAAKQ,CAAW,EAC5B,OAAO,KAAK,gBAAgB5B,EAAK0B,EAAQ,IAAI,CACjD,CAEA,IAAIC,EAAwC,CACxC,IAAMD,EAAU,KAAK,iBAAiB,KAAKjB,GAAKA,EAAE,OAASkB,EAAK,OAAO,EACvE,GAAI,CAACD,EACD,MAAM,IAAI,MAAM,YAAYC,EAAK,OAAO,aAAa,EAEzD,OAAO,KAAK,aAAaD,CAAO,CACpC,CAEA,OAAO4B,EAA2B3B,EAAoC,CAClE,IAAM4B,EAAS,KAAK,mBAAmBD,CAAiB,EAClDE,EAA0B,IAAI,MAAMD,EAAO,OAAS,CAAC,EACrDE,EAAY9B,EAAK,WAAa,CAAE,GAAGA,EAAK,UAAW,EAAI,CAAC,EAC9D,OAAO8B,EAAUH,CAAiB,EAElC,QAASf,EAAI,EAAGC,EAAMe,EAAO,OAAQhB,EAAIC,EAAKD,IAAK,CAC/C,IAAMvC,EAAMuD,EAAOhB,CAAC,EACpBiB,EAAQjB,CAAC,EAAI,CACT,WAAY,CAAE,CAACe,CAAiB,EAAGtD,CAAI,EACvC,MAAO,KAAK,MAAM,CAAE,WAAY,CAAE,GAAGyD,EAAW,CAACH,CAAiB,EAAGtD,CAAI,EAAG,QAAS2B,EAAK,OAAQ,CAAC,CACvG,CACJ,CAEA,OAAA6B,EAAQD,EAAO,MAAM,EAAI,CACrB,WAAY,CAAE,CAACD,CAAiB,EAAG,WAAY,EAC/C,MAAO,KAAK,MAAM,CAAE,WAAYG,EAAW,QAAS9B,EAAK,OAAQ,CAAC,CACtE,EAEO6B,CACX,CAEA,UAAUE,EAA0B/B,EAAoC,CACpE,IAAM4B,EAAS,KAAK,mBAAmBG,CAAgB,EACjDF,EAA0B,CAAC,EAC3BC,EAAY9B,EAAK,WAAa,CAAE,GAAGA,EAAK,UAAW,EAAI,CAAC,EAE9D,QAASY,EAAI,EAAGC,EAAMe,EAAO,OAAQhB,EAAIC,EAAKD,IAAK,CAC/C,IAAMvC,EAAMuD,EAAOhB,CAAC,EACdoB,EAAO,CAAE,GAAGF,EAAW,CAACC,CAAgB,EAAG1D,CAAI,EAC/C4D,EAAQ,KAAK,MAAM,CAAE,WAAYD,EAAM,QAAShC,EAAK,OAAQ,CAAC,EAChEiC,GAAS,MACTJ,EAAQ,KAAK,CAAE,WAAYG,EAAM,MAAAC,CAAM,CAAC,CAEhD,CAEA,OAAOJ,CACX,CAEA,OAAO7B,EAAgC,CACnC,IAAM6B,EAAqB,CAAC,EACtBK,EAAalC,EAAK,WAGlBmC,EAAY,IAAI,IACtB,GAAID,EACA,QAAW9B,KAAO8B,EAAY,CAC1B,IAAM7B,EAAM,KAAK,cAAc,QAAQD,CAAG,EACtCC,IAAQ,IACR8B,EAAU,IAAI9B,EAAK6B,EAAW9B,CAAG,CAAC,CAE1C,CAGJ,YAAK,eAAe,KAAK,KAAM,EAAG,OAAO,OAAO,IAAI,EAAG+B,EAAWnC,EAAK,UAAW6B,CAAO,EAClFA,CACX,CAEQ,eACJpC,EACAiB,EACA0B,EACAD,EACAE,EACAR,EACI,CACJ,GAAIpC,GAAQ,KAAM,OAElB,GAAIiB,IAAU,KAAK,cAAe,CAC9B,GAAI2B,GAAa,CAACA,EAAUD,EAAa3C,CAAI,EAAG,OAChDoC,EAAQ,KAAK,CAAE,GAAGO,EAAa,GAAG3C,CAAK,CAAC,EACxC,MACJ,CAEA,IAAM6C,EAAS,KAAK,cAAc5B,CAAK,EACjC6B,EAAYJ,EAAU,IAAIzB,CAAK,EAErC,GAAI6B,IAAc,OACd,GAAI,MAAM,QAAQA,CAAS,EACvB,QAAS3B,EAAI,EAAGC,EAAM0B,EAAU,OAAQ3B,EAAIC,EAAKD,IAAK,CAClD,IAAMnC,EAAI8D,EAAU3B,CAAC,EACjBnB,EAAKhB,CAAC,GAAK,OACX2D,EAAYE,CAAM,EAAI7D,EACtB,KAAK,eAAegB,EAAKhB,CAAC,EAAGiC,EAAQ,EAAG0B,EAAaD,EAAWE,EAAWR,CAAO,EAE1F,MACOpC,EAAK8C,CAAS,GAAK,OAC1BH,EAAYE,CAAM,EAAIC,EACtB,KAAK,eAAe9C,EAAK8C,CAAS,EAAG7B,EAAQ,EAAG0B,EAAaD,EAAWE,EAAWR,CAAO,OAE3F,CACH,IAAMlB,EAAO,OAAO,KAAKlB,CAAI,EAC7B,QAASmB,EAAI,EAAGC,EAAMF,EAAK,OAAQC,EAAIC,EAAKD,IAAK,CAC7C,IAAMR,EAAMO,EAAKC,CAAC,EAClBwB,EAAYE,CAAM,EAAIlC,EACtB,KAAK,eAAeX,EAAKW,CAAG,EAAGM,EAAQ,EAAG0B,EAAaD,EAAWE,EAAWR,CAAO,CACxF,CACJ,CACA,OAAOO,EAAYE,CAAM,CAC7B,CAEA,OAAc,CACV,KAAK,KAAO,OAAO,OAAO,IAAI,EAC9B,KAAK,UAAY,CACrB,CAEA,iBAAiBb,EAAyD,CACtE,GAAIA,EAAe,CACf,IAAMe,EAAS,KAAK,QAAQ,WAAW,KAAK3D,GAAKA,EAAE,MAAQ4C,CAAa,EACxE,GAAI,CAACe,EACD,MAAM,IAAI,MAAM,cAAcf,CAAa,aAAa,EAE5D,IAAMG,EAAS,KAAK,mBAAmBH,CAAa,EACpD,MAAO,CACH,IAAKe,EAAO,IACZ,KAAMA,EAAO,KACb,YAAaZ,EAAO,OACpB,OAAAA,CACJ,CACJ,CAEA,OAAO,KAAK,QAAQ,WAAW,IAAI/C,GAAK,CACpC,IAAM+C,EAAS,KAAK,mBAAmB/C,EAAE,GAAG,EAC5C,MAAO,CACH,IAAKA,EAAE,IACP,KAAMA,EAAE,KACR,YAAa+C,EAAO,OACpB,OAAAA,CACJ,CACJ,CAAC,CACL,CAEA,gBAAqE,CACjE,OAAO,KAAK,QAAQ,SAAS,IAAI9C,IAAM,CACnC,KAAMA,EAAE,KACR,IAAKA,EAAE,IACP,KAAMA,EAAE,IACZ,EAAE,CACN,CAEA,eAAgC,CAC5B,MAAO,CACH,QAAS,KAAK,QACd,iBAAkB,KAAK,cACvB,KAAM,KAAK,iBAAiB,KAAK,IAAI,EACrC,SAAU,KAAK,SACnB,CACJ,CAMA,MAAM,qBAAuC,CACzC,GAAM,CAAE,KAAA2D,CAAK,EAAI,KAAM,QAAO,MAAM,EAC9B,CAAE,UAAAC,CAAU,EAAI,KAAM,QAAO,MAAM,EACnCC,EAAYD,EAAUD,CAAI,EAE1BG,EAAO,KAAK,UAAU,KAAK,cAAc,CAAC,EAChD,OAAOD,EAAU,OAAO,KAAKC,EAAM,OAAO,CAAC,CAC/C,CAKA,yBAAkC,CAC9B,GAAM,CAAE,SAAAC,CAAS,EAAI,EAAQ,MAAM,EAC7BD,EAAO,KAAK,UAAU,KAAK,cAAc,CAAC,EAChD,OAAOC,EAAS,OAAO,KAAKD,EAAM,OAAO,CAAC,CAC9C,CAKA,aAAa,eAAe5D,EAA6B,CACrD,GAAM,CAAE,OAAA8D,CAAO,EAAI,KAAM,QAAO,MAAM,EAChC,CAAE,UAAAJ,CAAU,EAAI,KAAM,QAAO,MAAM,EAGnCE,GAAQ,MAFMF,EAAUI,CAAM,EAEJ9D,CAAI,GAAG,SAAS,OAAO,EACvD,OAAOL,EAAK,SAAS,KAAK,MAAMiE,CAAI,CAAC,CACzC,CAKA,OAAO,mBAAmB5D,EAAoB,CAC1C,GAAM,CAAE,WAAA+D,CAAW,EAAI,EAAQ,MAAM,EAC/BH,EAAOG,EAAW/D,CAAI,EAAE,SAAS,OAAO,EAC9C,OAAOL,EAAK,SAAS,KAAK,MAAMiE,CAAI,CAAC,CACzC,CAEQ,iBAAiBnD,EAAgB,CACrC,GAAIA,GAAQ,MAAQ,OAAOA,GAAS,SAAU,OAAOA,EACrD,GAAIA,EAAK,kBAAkB,IACvB,MAAO,CAAE,OAAQ,MAAM,KAAKA,EAAK,MAAM,CAAE,EAG7C,IAAMa,EAAc,CAAC,EACfK,EAAO,OAAO,KAAKlB,CAAI,EAC7B,QAAS,EAAI,EAAGoB,EAAMF,EAAK,OAAQ,EAAIE,EAAK,IAAK,CAC7C,IAAMT,EAAMO,EAAK,CAAC,EAClBL,EAAOF,CAAG,EAAI,KAAK,iBAAiBX,EAAKW,CAAG,CAAC,CACjD,CACA,OAAOE,CACX,CAEA,OAAO,SAAS0C,EAA6B,CACzC,IAAMC,EAAO,IAAItE,EAAKqE,EAAM,OAAO,EACnC,OAAAC,EAAK,KAAOtE,EAAK,gBAAgBqE,EAAM,IAAI,EAC3CC,EAAK,UAAYD,EAAM,UAAY,EAC5BC,CACX,CAEA,OAAe,gBAAgBxD,EAAgB,CAC3C,GAAIA,GAAQ,MAAQ,OAAOA,GAAS,SAAU,OAAOA,EACrD,GAAIA,EAAK,QAAU,MAAM,QAAQA,EAAK,MAAM,EACxC,MAAO,CAAE,OAAQ,IAAI,IAAIA,EAAK,MAAM,CAAE,EAG1C,IAAMa,EAAc,OAAO,OAAO,IAAI,EAChCK,EAAO,OAAO,KAAKlB,CAAI,EAC7B,QAAS,EAAI,EAAGoB,EAAMF,EAAK,OAAQ,EAAIE,EAAK,IAAK,CAC7C,IAAMT,EAAMO,EAAK,CAAC,EAClBL,EAAOF,CAAG,EAAIzB,EAAK,gBAAgBc,EAAKW,CAAG,CAAC,CAChD,CACA,OAAOE,CACX,CACJ","names":["MEASURE_UPDATERS","store","name","val","curr","MEASURE_AGGREGATORS","_","v","Qube","_Qube","options","d","m","rows","data","measures","dimKeys","numDims","numMeasures","lastDimIdx","r","rLen","row","node","valid","dimVal","next","lastDimVal","measureStore","measure","opts","measureName","dimensions","fixedDims","key","idx","result","stack","depthStack","targetDepth","depth","keys","i","len","child","callback","fixedVal","type","mean","avg","variance","dimensionToEnumerate","enumeration","baseDims","item","dimensionName","dimensionIndex","dimensionToRollup","values","results","baseQuery","dimensionToDrill","dims","value","filterDims","filterMap","currentDims","predicate","dimKey","filterVal","dimDef","gzip","promisify","gzipAsync","json","gzipSync","gunzip","gunzipSync","sQube","cube"]}