@things-factory/dataset 6.0.92 → 6.0.93
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.
- package/client/pages/data-summary/data-summary-period-page.ts +1 -1
- package/dist-client/pages/data-summary/data-summary-period-page.js +1 -1
- package/dist-client/pages/data-summary/data-summary-period-page.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/controllers/query-data-summary-by-period.js +3 -7
- package/dist-server/controllers/query-data-summary-by-period.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/server/controllers/query-data-summary-by-period.ts +3 -7
@@ -126,7 +126,7 @@ async function queryDataSummaryByPeriod(period, dataSetName, dataKeys, params, c
|
|
126
126
|
const groupByPeriod = period == 'today'
|
127
127
|
? 'summary.date, summary.period'
|
128
128
|
: ['this year', '12 months'].includes(period)
|
129
|
-
? '
|
129
|
+
? 'SUBSTRING(summary.date, 1, 7)'
|
130
130
|
: 'summary.date';
|
131
131
|
const groupByKeys = dataKeyItems
|
132
132
|
.map((item, index) => {
|
@@ -152,11 +152,9 @@ async function queryDataSummaryByPeriod(period, dataSetName, dataKeys, params, c
|
|
152
152
|
params,
|
153
153
|
domain,
|
154
154
|
alias: 'summary',
|
155
|
-
searchables:
|
155
|
+
searchables: searchables
|
156
156
|
})
|
157
157
|
.select('summary.dataSet')
|
158
|
-
.addSelect('ds.name', 'name')
|
159
|
-
.addSelect('ds.description', 'description')
|
160
158
|
.addSelect(selectData)
|
161
159
|
.addSelect('SUM(summary.count)', 'count')
|
162
160
|
.addSelect('SUM(summary.countOoc)', 'countOoc')
|
@@ -169,15 +167,13 @@ async function queryDataSummaryByPeriod(period, dataSetName, dataKeys, params, c
|
|
169
167
|
.andWhere('summary.date >= :from', { from })
|
170
168
|
.andWhere('summary.date < :to', { to })
|
171
169
|
.addGroupBy('summary.dataSet')
|
172
|
-
.addGroupBy('ds.name')
|
173
|
-
.addGroupBy('ds.description')
|
174
170
|
.addGroupBy(groupByPeriod);
|
175
171
|
if (dataKeyItems.length > 0) {
|
176
172
|
queryBuilder.addSelect(selectKeys).addGroupBy(groupByKeys);
|
177
173
|
}
|
178
174
|
orderByPeriod.map(orderBy => {
|
179
175
|
const { sort, order } = orderBy;
|
180
|
-
queryBuilder.
|
176
|
+
queryBuilder.orderBy(sort, order);
|
181
177
|
});
|
182
178
|
const items = await queryBuilder.getRawMany();
|
183
179
|
return items;
|
@@ -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'\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 dataKeys: string[] | null,\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 // 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 // dataKeys 가 설정되지 않았다면, dataSet의 dataKeySet을 그대로 적용한다는 의미임.\n // dataKeys == [] 라면, dataKeySet을 적용하지 않는다는 의미임.\n // dataKeys에는 dataKeySet의 dataKey 값을 따라야 한다.\n const dataKeyItems = !dataSet.dataKeySet?.dataKeyItems\n ? []\n : dataKeys\n ? dataKeys\n .map(dataKey => {\n return dataSet.dataKeySet.dataKeyItems.find(item => item.dataKey == dataKey)\n })\n .filter(Boolean)\n : dataSet.dataKeySet.dataKeyItems\n\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 = queryBuilder => {\n if (period == 'today') {\n queryBuilder.addSelect('summary.date', 'date').addSelect('summary.period', 'period')\n } else if (['this year', '12 months'].includes(period)) {\n queryBuilder.addSelect('SUBSTRING(summary.date, 1, 7) AS month')\n } else {\n queryBuilder.addSelect('summary.date', 'date')\n }\n\n return queryBuilder\n }\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 var 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(selectData)\n .addSelect('SUM(summary.count)', 'count')\n .addSelect('SUM(summary.countOoc)', 'countOoc')\n .addSelect('SUM(summary.countOos)', 'countOos')\n\n queryBuilder = selectPeriod(queryBuilder)\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('summary.dataSet')\n .addGroupBy('ds.name')\n .addGroupBy('ds.description')\n .addGroupBy(groupByPeriod)\n\n if (dataKeyItems.length > 0) {\n queryBuilder.addSelect(selectKeys).addGroupBy(groupByKeys)\n }\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'\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 dataKeys: string[] | null,\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 // 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 // dataKeys 가 설정되지 않았다면, dataSet의 dataKeySet을 그대로 적용한다는 의미임.\n // dataKeys == [] 라면, dataKeySet을 적용하지 않는다는 의미임.\n // dataKeys에는 dataKeySet의 dataKey 값을 따라야 한다.\n const dataKeyItems = !dataSet.dataKeySet?.dataKeyItems\n ? []\n : dataKeys\n ? dataKeys\n .map(dataKey => {\n return dataSet.dataKeySet.dataKeyItems.find(item => item.dataKey == dataKey)\n })\n .filter(Boolean)\n : dataSet.dataKeySet.dataKeyItems\n\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 = queryBuilder => {\n if (period == 'today') {\n queryBuilder.addSelect('summary.date', 'date').addSelect('summary.period', 'period')\n } else if (['this year', '12 months'].includes(period)) {\n queryBuilder.addSelect('SUBSTRING(summary.date, 1, 7) AS month')\n } else {\n queryBuilder.addSelect('summary.date', 'date')\n }\n\n return queryBuilder\n }\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 ? 'SUBSTRING(summary.date, 1, 7)'\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 var queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(DataSummary),\n params,\n domain,\n alias: 'summary',\n searchables: searchables\n })\n .select('summary.dataSet')\n .addSelect(selectData)\n .addSelect('SUM(summary.count)', 'count')\n .addSelect('SUM(summary.countOoc)', 'countOoc')\n .addSelect('SUM(summary.countOos)', 'countOos')\n\n queryBuilder = selectPeriod(queryBuilder)\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('summary.dataSet')\n .addGroupBy(groupByPeriod)\n\n if (dataKeyItems.length > 0) {\n queryBuilder.addSelect(selectKeys).addGroupBy(groupByKeys)\n }\n\n orderByPeriod.map(orderBy => {\n const { sort, order } = orderBy\n queryBuilder.orderBy(sort, order)\n })\n\n const items = await queryBuilder.getRawMany()\n\n return items\n}\n"]}
|