Functions는 온톨로지의 데이터를 기반으로 커스텀 집계를 계산하는 데 사용할 수 있으며, 이를 Workshop의 차트 위젯에서 표시할 수 있습니다. 이 가이드에서는 온톨로지에서 집계된 데이터를 로드하여 결과를 조작하고 미래 결과의 프로젝션을 생성한 다음 수정된 결과를 반환하는 커스텀 집계 로직을 작성하는 방법에 대해 설명합니다.
이 섹션을 진행하는 동안 다음 참조자료가 유용할 수 있습니다:
이 예에서는 expenses
라는 온톨로지를 가지고 있다고 가정하고, 각각에는 그룹의 부서 이름, 날짜
, 그리고 비용 금액
이 포함되어 있다고 가정해 봅시다. 우리는 다음 6개월 동안 부서별 월간 지출을 추정하려고 합니다. 월간 지출에 대한 집계된 데이터를 로드하는 것으로 시작할 수 있습니다:
Copied!1 2 3 4 5 6 7 8 9 10 11 12
// Objects의 search 메소드를 실행하여 결과를 반환받습니다. const result = await Objects.search() // expenses 메소드를 통해 경비에 관련된 데이터를 검색합니다. .expenses() // groupBy 메소드를 통해 데이터를 부서 이름(departmentName)별로 그룹화합니다. // topValues 메소드는 가장 많이 나온 값들을 반환합니다. .groupBy(expense => expense.departmentName.topValues()) // segmentBy 메소드를 통해 데이터를 날짜(date)별로 세분화합니다. // byMonth 메소드는 월별로 데이터를 세분화합니다. .segmentBy(expense => expense.date.byMonth()) // sum 메소드를 통해 각 그룹별로 금액(amount)의 합계를 구합니다. .sum(expense => expense.amount);
다음으로, 우리는 각 부서의 다음 6개월 동안의 소비를 추정할 수 있습니다. 예를 들어, 매우 순진한 접근법인 마지막 달의 값이 다음 6개월 동안의 추정치로 사용합시다.
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
const modifiedBuckets = result.buckets.map(bucket => { // 가장 최근 월에 해당하는 버킷 찾기 const lastBucket = bucket.value[bucket.value.length - 1]; let nextSixMonths: IBaseBucket<IRange<Timestamp>, Double>[] = []; let currentMonth = lastBucket.key.max!; // 6번 반복 for (let i = 0; i < 6; i++) { // 이 범위의 끝(다음 달) 찾기 const nextMonth = currentMonth.plusMonths(1); // 다음 달을 날짜 범위로 사용하고 가장 최근 달을 값으로 사용하는 새 버킷 추가 nextSixMonths.push({ key: { min: currentMonth, max: nextMonth, }, value: lastBucket.value, }); currentMonth = nextMonth; } // 수정된 결과 반환 return { key: bucket.key, value: nextSixMonths }; });
이제 다음 6개월에 대한 추정치를 생성했으므로, 이 추정값을 반환할 수 있습니다:
Copied!1 2
// 코드 반환: 수정된 버킷 객체 return { buckets: modifiedBuckets };
모두 함께, 이 Function에 대한 전체 예제 코드는 다음과 같습니다:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
@Function() public async estimatedDepartmentExpenses(): Promise<ThreeDimensionalAggregation<string, IRange<Timestamp>>> { // 객체를 검색하여 비용을 그룹화하고, 부서 이름별로 최고값을 찾습니다. // 날짜별로 세그먼트를 만들고, 각 비용의 총합을 구합니다. const result = await Objects.search() .expenses() .groupBy(expense => expense.departmentName.topValues()) .segmentBy(expense => expense.date.byMonths()) .sum(expense => expense.amount); const modifiedBuckets = result.buckets.map(bucket => { // 가장 최근 월에 해당하는 버킷을 찾습니다. const lastBucket = bucket.value[bucket.value.length - 1]; let nextSixMonths: IBaseBucket<IRange<Timestamp>, Double>[] = []; let currentMonth = lastBucket.key.max!; // 6번 반복합니다. for (let i = 0; i < 6; i++) { // 이 범위의 끝 (다음 달)을 찾습니다. const nextMonth = currentMonth.plusMonths(1); // 다음 달을 날짜 범위로 사용하고 가장 최근 달을 값으로 사용하는 새 버킷을 추가합니다. nextSixMonths.push({ key: { min: currentMonth, max: nextMonth, }, value: lastBucket.value, }); currentMonth = nextMonth; } // 수정된 결과를 반환합니다. return { key: bucket.key, value: nextSixMonths }; }); // 수정된 버킷들을 반환합니다. return { buckets: modifiedBuckets }; }
결과 집계는 Workshop 차트에서 사용하여 앞으로 6개월 동안의 월별 지출 예측을 보여줄 수 있습니다.