@servicetitan/data-query 36.0.0 → 37.0.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"transducers.d.ts","sourceRoot":"","sources":["../src/transducers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOpH;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,UAAK,EAAE,gBAAe,aAAa,CAAC,CAAC,CAAM,MASlE,QAAG,EAAE,UAAK,QAarB,CAAC;AAGF;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,eAAe;IAC5B,CAAC,SAAS,EAAE,MAAM,GAAG;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,cAAc,CAAC,EAAE,MAAM,CAAA;KAC1B,CAAC;CACL;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAW,KAAG,eAQ9C,CAAC;AAwEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,EAAE,gBAAW,EAAE,gBAAe,aAAa,CAAC,CAAC,CAAM,MA0B7E,UAAK,EAAE,UAAK,QACvB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,KAAG,CAAC,EAG/C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,GAAG,GAAI,cAAS,KAAG,OAI/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,MAAM,GAAI,cAAS,KAAG,OAIlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,EAAE,QAAQ,iBAAiB,CAAC,CAAC,CAAC,KAAG,MAAM,IAAI,iBAAiB,CAAC,CAAC,CAElG,CAAC;AAYF;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAI,OAAO,MAAM,KAAG,OAIpC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,WAAW,SAAS,KAAG,OAIhD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAI,OAAO,MAAM,KAAG,OAIpC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,CAAC,EAAE,WAAW,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,EAAE,KAAG,CAa/E,CAAC"}
1
+ {"version":3,"file":"transducers.d.ts","sourceRoot":"","sources":["../src/transducers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOpH;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,UAAK,EAAE,gBAAe,aAAa,CAAC,CAAC,CAAM,MASlE,QAAG,EAAE,UAAK,QAarB,CAAC;AAGF;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,eAAe;IAC5B,CAAC,SAAS,EAAE,MAAM,GAAG;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,cAAc,CAAC,EAAE,MAAM,CAAA;KAC1B,CAAC;CACL;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAW,KAAG,eAQ9C,CAAC;AAyFF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,EAAE,gBAAW,EAAE,gBAAe,aAAa,CAAC,CAAC,CAAM,MA0B7E,UAAK,EAAE,UAAK,QACvB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,KAAG,CAAC,EAG/C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,GAAG,GAAI,cAAS,KAAG,OAI/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,MAAM,GAAI,cAAS,KAAG,OAIlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,EAAE,QAAQ,iBAAiB,CAAC,CAAC,CAAC,KAAG,MAAM,IAAI,iBAAiB,CAAC,CAAC,CAElG,CAAC;AAYF;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAI,OAAO,MAAM,KAAG,OAIpC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,WAAW,SAAS,KAAG,OAIhD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAI,OAAO,MAAM,KAAG,OAIpC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,CAAC,EAAE,WAAW,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,EAAE,KAAG,CAa/E,CAAC"}
@@ -39,6 +39,21 @@ const valueToString = (value)=>{
39
39
  });
40
40
  return result;
41
41
  };
42
+ /*
43
+ * this function checks if value is applicable to count_distinct in accordance with Reporting BE logic
44
+ * https://servicetitan.atlassian.net/browse/RD-15293?focusedCommentId=2337000
45
+ * null, undefined, empty string, and strings consisting of only whitespaces are not counted
46
+ * 0 values are counted
47
+ * all other values are counted
48
+ */ const isDistinctValue = (value)=>{
49
+ if (value === null || value === undefined) {
50
+ return false;
51
+ }
52
+ if (typeof value === "string" && !value.trim().length) {
53
+ return false;
54
+ }
55
+ return true;
56
+ };
42
57
  const aggregatesFuncs = (name)=>({
43
58
  average: ()=>{
44
59
  let value = 0;
@@ -97,7 +112,7 @@ const aggregatesFuncs = (name)=>({
97
112
  count_distinct: ()=>{
98
113
  const state = new Set();
99
114
  return {
100
- calc: (value)=>state.add(isPresent(value) && typeof value === 'object' && value.toString ? value.toString() : value),
115
+ calc: (value)=>isDistinctValue(value) && state.add(typeof value === 'object' && value.toString ? value.toString() : value),
101
116
  result: ()=>state.size
102
117
  };
103
118
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/transducers.ts"],"sourcesContent":["import { isPresent, isNumeric, isDate } from './utils';\nimport { getter } from './accessor';\nimport { Combinator, Predicate, Reducer, Transformer, TransformerResult, Preprocessors } from './common.interfaces';\n\nconst valueToString = (value): string => {\n value = isPresent(value) && value.getTime ? value.getTime() : value;\n return value + \"\";\n};\n\n/**\n * @hidden\n */\nexport const groupCombinator = <T>(field, preprocessors: Preprocessors<T> = {}) => {\n const prop = a => {\n const value = getter(field, true)(a);\n const preprocessor = preprocessors[field];\n return preprocessor ? preprocessor(value) : value;\n };\n\n let position = 0;\n\n return (agg, value) => {\n agg[field] = agg[field] || {};\n\n const groupValue = prop(value);\n const key = valueToString(groupValue);\n const values = agg[field][key] || { __position: position++, aggregates: {}, items: [], value: groupValue };\n\n values.items.push(value);\n\n agg[field][key] = values;\n\n return agg;\n };\n};\n\n// tslint:disable:max-line-length\n/**\n * The result of the [aggregate operation]({% slug api_kendo-data-query_aggregateby %}) where the keys are the field name used for the calculation and the values are an object with the aggregate function name and a resulting value.\n *\n * @example\n * ```js-no-run\n * const result = <AggregateResult>{\n * \"unitPrice\": { \"sum\": 53, \"count\": 2 },\n * \"unitsInStock\": { \"sum\": 66, \"count\": 3 }\n * };\n *\n * console.log(result[\"unitPrice\"].sum); //53\n *\n * ```\n */\n// tslint:enable:max-line-length\nexport interface AggregateResult {\n [fieldName: string]: {\n count?: number;\n sum?: number;\n average?: number;\n min?: number;\n max?: number;\n count_distinct?: number\n };\n}\n\n/**\n * @hidden\n */\nexport const expandAggregates = (result = {}): AggregateResult => {\n Object.keys(result).forEach(field => {\n const aggregates = result[field];\n Object.keys(aggregates).forEach(aggregate => {\n aggregates[aggregate] = aggregates[aggregate].result();\n });\n });\n return result;\n};\n\nconst aggregatesFuncs = (name) => ({\n average: () => {\n let value = 0;\n let count = 0;\n let lastNonNumeric: any = undefined;\n return {\n calc: (curr) => {\n if (isNumeric(curr)) {\n value += curr;\n count++;\n } else {\n lastNonNumeric = curr;\n }\n },\n result: () => count ? value / count : lastNonNumeric\n };\n },\n count: () => {\n let state = 0;\n return {\n calc: () => state++,\n result: () => state\n };\n },\n max: () => {\n let state = Number.NEGATIVE_INFINITY;\n return {\n calc: (value) => {\n state = isNumeric(state) || isDate(state) ? state : value;\n\n if (state < value && (isNumeric(value) || isDate(value))) {\n state = value;\n }\n },\n result: () => state\n };\n },\n min: () => {\n let state = Number.POSITIVE_INFINITY;\n return {\n calc: (value) => {\n state = isNumeric(state) || isDate(state) ? state : value;\n\n if (state > value && (isNumeric(value) || isDate(value))) {\n state = value;\n }\n },\n result: () => state\n };\n },\n sum: () => {\n let state = 0;\n return {\n calc: (value) => state += value,\n result: () => state\n };\n },\n count_distinct: () => {\n const state = new Set();\n return {\n calc: (value) => state.add(\n isPresent(value) && typeof value === 'object' && value.toString\n ? value.toString()\n : value\n ),\n result: () => state.size,\n };\n }\n}[name]());\n\n/**\n * @hidden\n */\nexport const aggregatesCombinator = <T>(descriptors, preprocessors: Preprocessors<T> = {}) => {\n const functions = descriptors.map(descriptor => {\n const fieldAccessor = a => {\n const value = getter(descriptor.field, true)(a);\n const preprocessor = preprocessors[descriptor.field];\n return preprocessor ? preprocessor(value) : value;\n };\n const aggregateName = (descriptor.aggregate || \"\").toLowerCase();\n const aggregateAccessor = getter(aggregateName, true);\n\n return (state, value) => {\n const fieldAggregates = state[descriptor.field] || {};\n\n const aggregateFunction = aggregateAccessor(fieldAggregates)\n || aggregatesFuncs(aggregateName);\n\n aggregateFunction.calc(fieldAccessor(value));\n\n fieldAggregates[descriptor.aggregate] = aggregateFunction;\n\n state[descriptor.field] = fieldAggregates;\n\n return state;\n };\n });\n\n return (state, value) => functions.reduce((agg, calc) => calc(agg, value), state);\n};\n\n/**\n * @hidden\n * Adds the value to the `arr` and produces a new array.\n *\n * > The original array will be modified.\n */\nexport const concat = <T>(arr: T[], value: T): T[] => {\n arr.push(value);\n return arr;\n};\n\n/**\n * @hidden\n * Returns a reducer that will apply the specified transformation to the value.\n */\nexport const map = (transform): Reducer => (\n (reduce: Combinator): Transformer => (\n (acc, curr, index) => reduce(acc, transform(curr, index))\n )\n);\n\n/**\n * @hidden\n * Returns a reducer that will filter out items which do not match the `Predicate`.\n */\nexport const filter = (predicate): Reducer => (\n (reduce: Combinator): Transformer => (\n (acc, curr) => predicate(curr) ? reduce(acc, curr) : acc\n )\n);\n\n/**\n * @hidden\n */\nexport const isTransformerResult = <T>(source: TransformerResult<T>): source is TransformerResult<T> => {\n return isPresent((<TransformerResult<T>>source).__value);\n};\n\nconst reduced = <T>(x): TransformerResult<T> => {\n if (isTransformerResult(x)) {\n return <TransformerResult<T>>x;\n }\n return {\n __value: x,\n reduced: true\n };\n};\n\n/**\n * @hidden\n * Returns a reducer that will take the specified number of items.\n */\nexport const take = (count: number): Reducer => (\n (reduce: Combinator): Transformer => (\n (acc, curr) => count-- > 0 ? reduce(acc, curr) : reduced(acc)\n )\n);\n\n/**\n * @hidden\n * Returns a reducer that will take the specified number of items.\n */\nexport const takeWhile = (predicate: Predicate): Reducer => (\n (reduce: Combinator): Transformer => (\n (acc, curr) => predicate(curr) ? reduce(acc, curr) : reduced(acc)\n )\n);\n\n/**\n * @hidden\n * Returns a reducer that will skip the specified number of items.\n */\nexport const skip = (count: number): Reducer => (\n (reduce: Combinator): Transformer => (\n (acc, curr) => count-- <= 0 ? reduce(acc, curr) : acc\n )\n);\n\n/**\n * @hidden\n * Transforms the data by applying the supplied transformer.\n */\nexport const exec = <T, U>(transform: Transformer, initialValue: U, data: T[]): U => {\n let result: any = initialValue;\n\n for (let idx = 0, length = data.length; idx < length; idx++) {\n result = transform(result, data[idx], idx);\n\n if (isTransformerResult(result)) {\n result = result.__value;\n break;\n }\n }\n\n return result;\n};\n"],"names":["isPresent","isNumeric","isDate","getter","valueToString","value","getTime","groupCombinator","field","preprocessors","prop","a","preprocessor","position","agg","groupValue","key","values","__position","aggregates","items","push","expandAggregates","result","Object","keys","forEach","aggregate","aggregatesFuncs","name","average","count","lastNonNumeric","undefined","calc","curr","state","max","Number","NEGATIVE_INFINITY","min","POSITIVE_INFINITY","sum","count_distinct","Set","add","toString","size","aggregatesCombinator","descriptors","functions","map","descriptor","fieldAccessor","aggregateName","toLowerCase","aggregateAccessor","fieldAggregates","aggregateFunction","reduce","concat","arr","transform","acc","index","filter","predicate","isTransformerResult","source","__value","reduced","x","take","takeWhile","skip","exec","initialValue","data","idx","length"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/transducers.ts"],"sourcesContent":["import { isPresent, isNumeric, isDate } from './utils';\nimport { getter } from './accessor';\nimport { Combinator, Predicate, Reducer, Transformer, TransformerResult, Preprocessors } from './common.interfaces';\n\nconst valueToString = (value): string => {\n value = isPresent(value) && value.getTime ? value.getTime() : value;\n return value + \"\";\n};\n\n/**\n * @hidden\n */\nexport const groupCombinator = <T>(field, preprocessors: Preprocessors<T> = {}) => {\n const prop = a => {\n const value = getter(field, true)(a);\n const preprocessor = preprocessors[field];\n return preprocessor ? preprocessor(value) : value;\n };\n\n let position = 0;\n\n return (agg, value) => {\n agg[field] = agg[field] || {};\n\n const groupValue = prop(value);\n const key = valueToString(groupValue);\n const values = agg[field][key] || { __position: position++, aggregates: {}, items: [], value: groupValue };\n\n values.items.push(value);\n\n agg[field][key] = values;\n\n return agg;\n };\n};\n\n// tslint:disable:max-line-length\n/**\n * The result of the [aggregate operation]({% slug api_kendo-data-query_aggregateby %}) where the keys are the field name used for the calculation and the values are an object with the aggregate function name and a resulting value.\n *\n * @example\n * ```js-no-run\n * const result = <AggregateResult>{\n * \"unitPrice\": { \"sum\": 53, \"count\": 2 },\n * \"unitsInStock\": { \"sum\": 66, \"count\": 3 }\n * };\n *\n * console.log(result[\"unitPrice\"].sum); //53\n *\n * ```\n */\n// tslint:enable:max-line-length\nexport interface AggregateResult {\n [fieldName: string]: {\n count?: number;\n sum?: number;\n average?: number;\n min?: number;\n max?: number;\n count_distinct?: number\n };\n}\n\n/**\n * @hidden\n */\nexport const expandAggregates = (result = {}): AggregateResult => {\n Object.keys(result).forEach(field => {\n const aggregates = result[field];\n Object.keys(aggregates).forEach(aggregate => {\n aggregates[aggregate] = aggregates[aggregate].result();\n });\n });\n return result;\n};\n\n/*\n * this function checks if value is applicable to count_distinct in accordance with Reporting BE logic\n * https://servicetitan.atlassian.net/browse/RD-15293?focusedCommentId=2337000\n * null, undefined, empty string, and strings consisting of only whitespaces are not counted\n * 0 values are counted\n * all other values are counted\n */\nconst isDistinctValue = (value: any) => {\n if(value === null || value === undefined) {\n return false;\n }\n if(typeof value === \"string\" && !value.trim().length) {\n return false;\n }\n return true;\n}\n\nconst aggregatesFuncs = (name) => ({\n average: () => {\n let value = 0;\n let count = 0;\n let lastNonNumeric: any = undefined;\n return {\n calc: (curr) => {\n if (isNumeric(curr)) {\n value += curr;\n count++;\n } else {\n lastNonNumeric = curr;\n }\n },\n result: () => count ? value / count : lastNonNumeric\n };\n },\n count: () => {\n let state = 0;\n return {\n calc: () => state++,\n result: () => state\n };\n },\n max: () => {\n let state = Number.NEGATIVE_INFINITY;\n return {\n calc: (value) => {\n state = isNumeric(state) || isDate(state) ? state : value;\n\n if (state < value && (isNumeric(value) || isDate(value))) {\n state = value;\n }\n },\n result: () => state\n };\n },\n min: () => {\n let state = Number.POSITIVE_INFINITY;\n return {\n calc: (value) => {\n state = isNumeric(state) || isDate(state) ? state : value;\n\n if (state > value && (isNumeric(value) || isDate(value))) {\n state = value;\n }\n },\n result: () => state\n };\n },\n sum: () => {\n let state = 0;\n return {\n calc: (value) => state += value,\n result: () => state\n };\n },\n count_distinct: () => {\n const state = new Set();\n return {\n calc: (value) => isDistinctValue(value) && state.add(\n typeof value === 'object' && value.toString\n ? value.toString()\n : value\n ),\n result: () => state.size,\n };\n }\n}[name]());\n\n/**\n * @hidden\n */\nexport const aggregatesCombinator = <T>(descriptors, preprocessors: Preprocessors<T> = {}) => {\n const functions = descriptors.map(descriptor => {\n const fieldAccessor = a => {\n const value = getter(descriptor.field, true)(a);\n const preprocessor = preprocessors[descriptor.field];\n return preprocessor ? preprocessor(value) : value;\n };\n const aggregateName = (descriptor.aggregate || \"\").toLowerCase();\n const aggregateAccessor = getter(aggregateName, true);\n\n return (state, value) => {\n const fieldAggregates = state[descriptor.field] || {};\n\n const aggregateFunction = aggregateAccessor(fieldAggregates)\n || aggregatesFuncs(aggregateName);\n\n aggregateFunction.calc(fieldAccessor(value));\n\n fieldAggregates[descriptor.aggregate] = aggregateFunction;\n\n state[descriptor.field] = fieldAggregates;\n\n return state;\n };\n });\n\n return (state, value) => functions.reduce((agg, calc) => calc(agg, value), state);\n};\n\n/**\n * @hidden\n * Adds the value to the `arr` and produces a new array.\n *\n * > The original array will be modified.\n */\nexport const concat = <T>(arr: T[], value: T): T[] => {\n arr.push(value);\n return arr;\n};\n\n/**\n * @hidden\n * Returns a reducer that will apply the specified transformation to the value.\n */\nexport const map = (transform): Reducer => (\n (reduce: Combinator): Transformer => (\n (acc, curr, index) => reduce(acc, transform(curr, index))\n )\n);\n\n/**\n * @hidden\n * Returns a reducer that will filter out items which do not match the `Predicate`.\n */\nexport const filter = (predicate): Reducer => (\n (reduce: Combinator): Transformer => (\n (acc, curr) => predicate(curr) ? reduce(acc, curr) : acc\n )\n);\n\n/**\n * @hidden\n */\nexport const isTransformerResult = <T>(source: TransformerResult<T>): source is TransformerResult<T> => {\n return isPresent((<TransformerResult<T>>source).__value);\n};\n\nconst reduced = <T>(x): TransformerResult<T> => {\n if (isTransformerResult(x)) {\n return <TransformerResult<T>>x;\n }\n return {\n __value: x,\n reduced: true\n };\n};\n\n/**\n * @hidden\n * Returns a reducer that will take the specified number of items.\n */\nexport const take = (count: number): Reducer => (\n (reduce: Combinator): Transformer => (\n (acc, curr) => count-- > 0 ? reduce(acc, curr) : reduced(acc)\n )\n);\n\n/**\n * @hidden\n * Returns a reducer that will take the specified number of items.\n */\nexport const takeWhile = (predicate: Predicate): Reducer => (\n (reduce: Combinator): Transformer => (\n (acc, curr) => predicate(curr) ? reduce(acc, curr) : reduced(acc)\n )\n);\n\n/**\n * @hidden\n * Returns a reducer that will skip the specified number of items.\n */\nexport const skip = (count: number): Reducer => (\n (reduce: Combinator): Transformer => (\n (acc, curr) => count-- <= 0 ? reduce(acc, curr) : acc\n )\n);\n\n/**\n * @hidden\n * Transforms the data by applying the supplied transformer.\n */\nexport const exec = <T, U>(transform: Transformer, initialValue: U, data: T[]): U => {\n let result: any = initialValue;\n\n for (let idx = 0, length = data.length; idx < length; idx++) {\n result = transform(result, data[idx], idx);\n\n if (isTransformerResult(result)) {\n result = result.__value;\n break;\n }\n }\n\n return result;\n};\n"],"names":["isPresent","isNumeric","isDate","getter","valueToString","value","getTime","groupCombinator","field","preprocessors","prop","a","preprocessor","position","agg","groupValue","key","values","__position","aggregates","items","push","expandAggregates","result","Object","keys","forEach","aggregate","isDistinctValue","undefined","trim","length","aggregatesFuncs","name","average","count","lastNonNumeric","calc","curr","state","max","Number","NEGATIVE_INFINITY","min","POSITIVE_INFINITY","sum","count_distinct","Set","add","toString","size","aggregatesCombinator","descriptors","functions","map","descriptor","fieldAccessor","aggregateName","toLowerCase","aggregateAccessor","fieldAggregates","aggregateFunction","reduce","concat","arr","transform","acc","index","filter","predicate","isTransformerResult","source","__value","reduced","x","take","takeWhile","skip","exec","initialValue","data","idx"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/data-query",
3
- "version": "36.0.0",
3
+ "version": "37.0.0",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "type": "git",
@@ -34,5 +34,5 @@
34
34
  "cli": {
35
35
  "webpack": false
36
36
  },
37
- "gitHead": "aafdfc3cb503509159642338517d94ca7f5c672b"
37
+ "gitHead": "307168f771cf472154019492936165c9a31ed1e9"
38
38
  }
@@ -74,6 +74,23 @@ export const expandAggregates = (result = {}): AggregateResult => {
74
74
  return result;
75
75
  };
76
76
 
77
+ /*
78
+ * this function checks if value is applicable to count_distinct in accordance with Reporting BE logic
79
+ * https://servicetitan.atlassian.net/browse/RD-15293?focusedCommentId=2337000
80
+ * null, undefined, empty string, and strings consisting of only whitespaces are not counted
81
+ * 0 values are counted
82
+ * all other values are counted
83
+ */
84
+ const isDistinctValue = (value: any) => {
85
+ if(value === null || value === undefined) {
86
+ return false;
87
+ }
88
+ if(typeof value === "string" && !value.trim().length) {
89
+ return false;
90
+ }
91
+ return true;
92
+ }
93
+
77
94
  const aggregatesFuncs = (name) => ({
78
95
  average: () => {
79
96
  let value = 0;
@@ -134,8 +151,8 @@ const aggregatesFuncs = (name) => ({
134
151
  count_distinct: () => {
135
152
  const state = new Set();
136
153
  return {
137
- calc: (value) => state.add(
138
- isPresent(value) && typeof value === 'object' && value.toString
154
+ calc: (value) => isDistinctValue(value) && state.add(
155
+ typeof value === 'object' && value.toString
139
156
  ? value.toString()
140
157
  : value
141
158
  ),