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