{"map":"{\"version\":3,\"file\":\"groupby.js\",\"sourceRoot\":\"\",\"sources\":[\"../../../src/select/groupby.ts\"],\"names\":[],\"mappings\":\"AACA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAyB,MAAM,UAAU,CAAC;AAE5E,MAAM,UAAU,mBAAmB,CACjC,SAAyB,EACzB,UAAyB;IAEzB,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,kCAAkC,CAAC,CAAC;IAElE,IAAI,KAAK,GAA8B,IAAI,cAAc,EAAE,CAAC;IAC5D,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAE5B,UAAU,CAAC,OAAO,CAAC,UAAA,OAAO;QACxB,MAAM,CACJ,OAAO,CAAC,IAAI,KAAK,YAAY,EAC7B,iDAAiD,CAClD,CAAC;QACF,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,OAAQ,KAAiC,CAAC;AAC5C,CAAC;AAED,SAAS,kBAAkB,CACzB,SAAoC,EACpC,OAAoB;IAEpB,IAAM,WAAW,GAAqB,EAAE,CAAC;IAEzC,IAAI,SAAS,YAAY,cAAc,EAAE;QACvC,mCAAmC;QACnC,IAAM,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC;QAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;YAChC,IAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAEnC,8DAA8D;YAC9D,uDAAuD;YACvD,IAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAExD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE;gBACtC,WAAW,CAAC,UAAU,CAAC,GAAG,IAAI,cAAc,EAAE,CAAC;aAChD;YAEA,WAAW,CAAC,UAAU,CAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACjE;QAED,OAAO,WAAW,CAAC;KACpB;SAAM;QACL,sEAAsE;QACtE,IAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,aAAa,CAAC,OAAO,CAAC,UAAA,KAAK;YACzB,WAAW,CAAC,KAAK,CAAC,GAAG,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;KACpB;AACH,CAAC;AAED;IAUE,wBAAmB,GAAY;QAAZ,QAAG,GAAH,GAAG,CAAS;QAT/B,cAAS,GAAmB,EAAE,CAAC;QAC/B,SAAI,GAAyB;YAC3B,GAAG,EAAE,EAAE;YACP,GAAG,EAAE,EAAE;YACP,GAAG,EAAE,EAAE;YACP,GAAG,EAAE,EAAE;YACP,KAAK,EAAE,EAAE;SACV,CAAC;IAEgC,CAAC;IACrC,qBAAC;AAAD,CAAC,AAXD,IAWC\"}","code":"import { assert, safeGet, contains } from '../utils';\r\nexport function applyGroupByLocally(documents, astGroupBy) {\r\n    assert(astGroupBy.length > 0, 'GROUP BY needs at least 1 group.');\r\n    var group = new DocumentsGroup();\r\n    group.documents = documents;\r\n    astGroupBy.forEach(function (groupBy) {\r\n        assert(groupBy.type === 'column_ref', 'GROUP BY only supports grouping by field names.');\r\n        group = applySingleGroupBy(group, groupBy);\r\n    });\r\n    return group;\r\n}\r\nfunction applySingleGroupBy(documents, groupBy) {\r\n    var groupedDocs = {};\r\n    if (documents instanceof DocumentsGroup) {\r\n        // We just have a list of documents\r\n        var numDocs = documents.documents.length;\r\n        for (var i = 0; i < numDocs; i++) {\r\n            var doc = documents.documents[i];\r\n            // Since we're going to use the value as an object key, always\r\n            // coherce it to a string in case it's some other type.\r\n            var groupValue = String(safeGet(doc, groupBy.column));\r\n            if (!contains(groupedDocs, groupValue)) {\r\n                groupedDocs[groupValue] = new DocumentsGroup();\r\n            }\r\n            groupedDocs[groupValue].documents.push(doc);\r\n        }\r\n        return groupedDocs;\r\n    }\r\n    else {\r\n        // We have documents that have already been grouped with another field\r\n        var currentGroups = Object.keys(documents);\r\n        currentGroups.forEach(function (group) {\r\n            groupedDocs[group] = applySingleGroupBy(documents[group], groupBy);\r\n        });\r\n        return groupedDocs;\r\n    }\r\n}\r\nvar DocumentsGroup = /** @class */ (function () {\r\n    function DocumentsGroup(key) {\r\n        this.key = key;\r\n        this.documents = [];\r\n        this.aggr = {\r\n            sum: {},\r\n            avg: {},\r\n            min: {},\r\n            max: {},\r\n            total: {}\r\n        };\r\n    }\r\n    return DocumentsGroup;\r\n}());\r\nexport { DocumentsGroup };\r\n//# sourceMappingURL=groupby.js.map","dts":{"name":"C:/www/npm-packages/fire-sql/dist/types/select/groupby.d.ts","writeByteOrderMark":false,"text":"import { SQL_GroupBy } from 'node-sqlparser';\r\nimport { DocumentData } from '../utils';\r\nexport declare function applyGroupByLocally(documents: DocumentData[], astGroupBy: SQL_GroupBy[]): GroupedDocuments;\r\nexport declare class DocumentsGroup {\r\n    key?: string | undefined;\r\n    documents: DocumentData[];\r\n    aggr: GroupAggregateValues;\r\n    constructor(key?: string | undefined);\r\n}\r\nexport interface GroupedDocuments {\r\n    [key: string]: GroupedDocuments | DocumentsGroup;\r\n}\r\nexport interface GroupAggregateValues {\r\n    sum: {\r\n        [k: string]: number;\r\n    };\r\n    avg: {\r\n        [k: string]: number;\r\n    };\r\n    min: {\r\n        [k: string]: number | string;\r\n    };\r\n    max: {\r\n        [k: string]: number | string;\r\n    };\r\n    total: {\r\n        [k: string]: number;\r\n    };\r\n}\r\n"}}
