@things-factory/dataset 6.0.84 → 6.0.85

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.
@@ -118,7 +118,7 @@ async function queryDataSummaryByPeriod(period, dataSetName, params, context) {
118
118
  .map((item, index) => {
119
119
  return `summary.key0${index + 1}`;
120
120
  })
121
- .join(' ');
121
+ .join(', ');
122
122
  const orderByPeriod = period == 'today'
123
123
  ? [
124
124
  {
@@ -1 +1 @@
1
- {"version":3,"file":"query-data-summary-by-period.js","sourceRoot":"","sources":["../../server/controllers/query-data-summary-by-period.ts"],"names":[],"mappings":"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","sourcesContent":["import moment from 'moment-timezone'\n\nimport { getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\n\nimport { DataSet, DataSetSummaryPeriodType } from '../service/data-set/data-set'\n\nimport { DataSummary } from '../service/data-summary/data-summary'\nimport { DataSummaryList } from '../service/data-summary/data-summary-type'\n\nconst STAT_FUNCTION_MAP = {\n sum: 'sum',\n mean: 'mean',\n stddev: 'standardDeviation',\n variance: 'variance',\n min: 'min',\n max: 'max',\n range: 'range',\n median: 'median',\n mode: 'mode'\n}\n\nasync function getTimesForPeriod(\n period: 'today' | 'this month' | '30 days' | 'this year' | '12 months',\n context: ResolverContext\n): Promise<{ from: string; to: string }> {\n const { domain } = context.state\n const theDate = moment.tz(new Date(), domain.timezone)\n\n if (period == 'today') {\n const from = theDate.clone().format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'day').startOf('day').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == 'this month') {\n const from = theDate.clone().startOf('month').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'month').startOf('month').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == '30 days') {\n const from = theDate.clone().subtract(30, 'day').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'day').startOf('day').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == 'this year') {\n const from = theDate.clone().startOf('year').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'year').startOf('year').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == '12 months') {\n const from = theDate.clone().subtract(12, 'month').startOf('month').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'month').startOf('month').format('YYYY-MM-DD')\n\n return { from, to }\n }\n}\n\nexport async function queryDataSummaryByPeriod(\n period: 'today' | 'this month' | '30 days' | 'this year' | '12 months',\n dataSetName: string,\n params: ListParam,\n context: ResolverContext\n): Promise<DataSummary[]> {\n const { domain, user, tx } = context.state\n\n const dataSet = await getRepository(DataSet).findOne({\n where: { domain: { id: domain.id }, name: dataSetName },\n relations: ['dataKeySet']\n })\n\n if (!dataSet) {\n throw new Error(`dataSet not found by the given dataSetName(${dataSetName})`)\n }\n\n // 주어진 기간에 따라서, date의 범위를 구한다.\n // day : 시간별 서머리를 제공한다. 'today'\n // month : 일별 서머리를 제공한다. 'this month', '30 days'\n // year : 월별 서머리를 제공한다. 'this year', '12 months'\n\n // limitations\n const summaryPeriodType = dataSet.summaryPeriod\n if (\n (summaryPeriodType == DataSetSummaryPeriodType.Day || summaryPeriodType == DataSetSummaryPeriodType.WorkDate) &&\n period == 'today'\n ) {\n throw new Error(`given dataSet(${dataSetName}) is not allowed for getting summary for ${period}`)\n }\n\n const dataKeyItems = dataSet.dataKeySet?.dataKeyItems || []\n const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)\n const dataItems = dataSet.dataItems.filter(item => item.stat)\n\n const { from, to } = await getTimesForPeriod(period, context)\n\n const selectPeriod =\n period == 'today'\n ? ['summary.date', 'summary.period']\n : ['this year', '12 months'].includes(period)\n ? ['SUBSTRING(summary.date, 1, 7) AS month']\n : ['summary.date']\n const selectKeys = dataKeyItems.map((item, index) => {\n const aliasName = `key0${index + 1}`\n const columnName = `summary.${aliasName}`\n\n return `${columnName} as ${aliasName}`\n }) as string[]\n const selectData = dataItems.map((item, index) => {\n const aliasName = `data0${index + 1}`\n const columnName = `summary.${aliasName}`\n\n switch (item.stat) {\n case STAT_FUNCTION_MAP.sum:\n return `SUM(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.mean:\n // 일차 mean 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `AVG(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.stddev:\n // 일차 stddev 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `STDDEV(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.variance:\n // 일차 variance 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `VARIANCE(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.min:\n return `MIN(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.max:\n return `MAX(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.range:\n // 일차 range 값들을 다시 계산하므로, 무의미할 수 있다.\n return `MAX(${columnName}) - MIN(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.mode:\n // not guaranteed\n return `MODE() WITHIN GROUP (ORDER BY ${columnName})`\n default:\n return `AVG(${columnName}) as ${aliasName}`\n }\n })\n\n const groupByPeriod =\n period == 'today'\n ? 'summary.date, summary.period'\n : ['this year', '12 months'].includes(period)\n ? 'month'\n : 'summary.date'\n const groupByKeys = dataKeyItems\n .map((item, index) => {\n return `summary.key0${index + 1}`\n })\n .join(' ')\n\n const orderByPeriod: { sort: string; order: 'DESC' | 'ASC' }[] =\n period == 'today'\n ? [\n {\n sort: 'summary.date',\n order: 'DESC'\n },\n {\n sort: 'summary.period',\n order: 'DESC'\n }\n ]\n : ['this year', '12 months'].includes(period)\n ? [{ sort: 'month', order: 'DESC' }]\n : [{ sort: 'summary.date', order: 'DESC' }]\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSummary),\n params,\n domain,\n alias: 'summary',\n searchables: ['name', 'description'].concat(searchables)\n })\n .select('summary.dataSet')\n .addSelect('ds.name', 'name')\n .addSelect('ds.description', 'description')\n .addSelect('summary.date', 'date')\n .addSelect('summary.period', 'period')\n .addSelect(selectPeriod)\n .addSelect(selectKeys)\n .addSelect(selectData)\n .addSelect('SUM(summary.count)', 'count')\n .addSelect('SUM(summary.countOoc)', 'countOoc')\n .addSelect('SUM(summary.countOos)', 'countOos')\n .innerJoin('summary.dataSet', 'ds', 'ds.id = :dataSetName', {\n dataSetName: dataSet.id\n })\n .andWhere('summary.domain = :domain', { domain: domain.id })\n .andWhere('summary.date >= :from', { from })\n .andWhere('summary.date < :to', { to })\n .addGroupBy(groupByPeriod)\n .addGroupBy(groupByKeys)\n\n orderByPeriod.map(orderBy => {\n const { sort, order } = orderBy\n queryBuilder.addOrderBy(sort, order)\n })\n\n const items = await queryBuilder.getRawMany()\n\n return items\n}\n"]}
1
+ {"version":3,"file":"query-data-summary-by-period.js","sourceRoot":"","sources":["../../server/controllers/query-data-summary-by-period.ts"],"names":[],"mappings":"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","sourcesContent":["import moment from 'moment-timezone'\n\nimport { getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\n\nimport { DataSet, DataSetSummaryPeriodType } from '../service/data-set/data-set'\n\nimport { DataSummary } from '../service/data-summary/data-summary'\nimport { DataSummaryList } from '../service/data-summary/data-summary-type'\n\nconst STAT_FUNCTION_MAP = {\n sum: 'sum',\n mean: 'mean',\n stddev: 'standardDeviation',\n variance: 'variance',\n min: 'min',\n max: 'max',\n range: 'range',\n median: 'median',\n mode: 'mode'\n}\n\nasync function getTimesForPeriod(\n period: 'today' | 'this month' | '30 days' | 'this year' | '12 months',\n context: ResolverContext\n): Promise<{ from: string; to: string }> {\n const { domain } = context.state\n const theDate = moment.tz(new Date(), domain.timezone)\n\n if (period == 'today') {\n const from = theDate.clone().format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'day').startOf('day').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == 'this month') {\n const from = theDate.clone().startOf('month').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'month').startOf('month').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == '30 days') {\n const from = theDate.clone().subtract(30, 'day').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'day').startOf('day').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == 'this year') {\n const from = theDate.clone().startOf('year').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'year').startOf('year').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == '12 months') {\n const from = theDate.clone().subtract(12, 'month').startOf('month').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'month').startOf('month').format('YYYY-MM-DD')\n\n return { from, to }\n }\n}\n\nexport async function queryDataSummaryByPeriod(\n period: 'today' | 'this month' | '30 days' | 'this year' | '12 months',\n dataSetName: string,\n params: ListParam,\n context: ResolverContext\n): Promise<DataSummary[]> {\n const { domain, user, tx } = context.state\n\n const dataSet = await getRepository(DataSet).findOne({\n where: { domain: { id: domain.id }, name: dataSetName },\n relations: ['dataKeySet']\n })\n\n if (!dataSet) {\n throw new Error(`dataSet not found by the given dataSetName(${dataSetName})`)\n }\n\n // 주어진 기간에 따라서, date의 범위를 구한다.\n // day : 시간별 서머리를 제공한다. 'today'\n // month : 일별 서머리를 제공한다. 'this month', '30 days'\n // year : 월별 서머리를 제공한다. 'this year', '12 months'\n\n // limitations\n const summaryPeriodType = dataSet.summaryPeriod\n if (\n (summaryPeriodType == DataSetSummaryPeriodType.Day || summaryPeriodType == DataSetSummaryPeriodType.WorkDate) &&\n period == 'today'\n ) {\n throw new Error(`given dataSet(${dataSetName}) is not allowed for getting summary for ${period}`)\n }\n\n const dataKeyItems = dataSet.dataKeySet?.dataKeyItems || []\n const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)\n const dataItems = dataSet.dataItems.filter(item => item.stat)\n\n const { from, to } = await getTimesForPeriod(period, context)\n\n const selectPeriod =\n period == 'today'\n ? ['summary.date', 'summary.period']\n : ['this year', '12 months'].includes(period)\n ? ['SUBSTRING(summary.date, 1, 7) AS month']\n : ['summary.date']\n const selectKeys = dataKeyItems.map((item, index) => {\n const aliasName = `key0${index + 1}`\n const columnName = `summary.${aliasName}`\n\n return `${columnName} as ${aliasName}`\n }) as string[]\n const selectData = dataItems.map((item, index) => {\n const aliasName = `data0${index + 1}`\n const columnName = `summary.${aliasName}`\n\n switch (item.stat) {\n case STAT_FUNCTION_MAP.sum:\n return `SUM(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.mean:\n // 일차 mean 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `AVG(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.stddev:\n // 일차 stddev 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `STDDEV(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.variance:\n // 일차 variance 된 값들을 다시 계산하므로, 무의미할 수 있다.\n return `VARIANCE(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.min:\n return `MIN(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.max:\n return `MAX(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.range:\n // 일차 range 값들을 다시 계산하므로, 무의미할 수 있다.\n return `MAX(${columnName}) - MIN(${columnName}) as ${aliasName}`\n case STAT_FUNCTION_MAP.mode:\n // not guaranteed\n return `MODE() WITHIN GROUP (ORDER BY ${columnName})`\n default:\n return `AVG(${columnName}) as ${aliasName}`\n }\n })\n\n const groupByPeriod =\n period == 'today'\n ? 'summary.date, summary.period'\n : ['this year', '12 months'].includes(period)\n ? 'month'\n : 'summary.date'\n const groupByKeys = dataKeyItems\n .map((item, index) => {\n return `summary.key0${index + 1}`\n })\n .join(', ')\n\n const orderByPeriod: { sort: string; order: 'DESC' | 'ASC' }[] =\n period == 'today'\n ? [\n {\n sort: 'summary.date',\n order: 'DESC'\n },\n {\n sort: 'summary.period',\n order: 'DESC'\n }\n ]\n : ['this year', '12 months'].includes(period)\n ? [{ sort: 'month', order: 'DESC' }]\n : [{ sort: 'summary.date', order: 'DESC' }]\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSummary),\n params,\n domain,\n alias: 'summary',\n searchables: ['name', 'description'].concat(searchables)\n })\n .select('summary.dataSet')\n .addSelect('ds.name', 'name')\n .addSelect('ds.description', 'description')\n .addSelect('summary.date', 'date')\n .addSelect('summary.period', 'period')\n .addSelect(selectPeriod)\n .addSelect(selectKeys)\n .addSelect(selectData)\n .addSelect('SUM(summary.count)', 'count')\n .addSelect('SUM(summary.countOoc)', 'countOoc')\n .addSelect('SUM(summary.countOos)', 'countOos')\n .innerJoin('summary.dataSet', 'ds', 'ds.id = :dataSetName', {\n dataSetName: dataSet.id\n })\n .andWhere('summary.domain = :domain', { domain: domain.id })\n .andWhere('summary.date >= :from', { from })\n .andWhere('summary.date < :to', { to })\n .addGroupBy(groupByPeriod)\n .addGroupBy(groupByKeys)\n\n orderByPeriod.map(orderBy => {\n const { sort, order } = orderBy\n queryBuilder.addOrderBy(sort, order)\n })\n\n const items = await queryBuilder.getRawMany()\n\n return items\n}\n"]}