배열 속성의 리듀서
속성 리듀서(Property reducer)는 배열에서 값 하나를 선택하여 표시하거나 단일 값의 인터페이스(Interface)를 구현하는 데 사용합니다. 원본 속성(Property)의 자료형이나 저장된 배열은 바꾸지 않습니다. 최근 검사일만 표에 표시하면서 전체 날짜 이력을 계속 조회하는 구성이 예입니다.
리듀서는 베타 기능이며 플랫폼 인스턴스(Enrollment)에 아직 제공되지 않거나 개발 중 동작이 바뀔 수 있습니다.
지원 자료형과 선택 기준
| 배열 원소 | 선택 기준 |
|---|---|
| Byte, Short, Integer, Long, Float, Double, Decimal | 가장 큰 값 또는 작은 값 |
| Date, Timestamp | 가장 최근 또는 가장 이른 값 |
| String | 사전식 정렬의 첫 값 또는 마지막 값 |
| Boolean | true 우선 또는 false 우선 |
| Struct | 지원되는 내부 필드를 기준으로 선택 |
String의 첫 값과 마지막 값은 원래 배열 위치가 아니라 사전식 순서를 뜻합니다. 구조체는 구조체 자체를 비교하지 않고 숫자, 시각, 문자열 또는 Boolean 필드로 비교합니다.
다음 원소 종류의 배열에는 리듀서를 사용할 수 없습니다: Attachment, Cipher Text, Geohash, Geoshape, Geotemporal Series Reference, Marking, Media Reference, Time Dependent와 Vector.
리듀서 설정
Ontology Manager의 Object types에서 유형을 선택하고 Properties의 배열 속성을 엽니다. 오른쪽 Interaction 탭의 Reduce array로 이동합니다.
Add array reducer를 선택하고 자료형에 맞는 기준을 고른 뒤 Save합니다.
설정은 기반 열의 존재와 독립적이므로 편집 전용 속성에도 사용할 수 있습니다. 수정하거나 제거할 때 재인덱싱은 필요하지 않으며 변경이 즉시 적용됩니다.
구조체 배열과 동률 처리
가상의 Product.customerReviews 구조체 배열은 rating(Integer), reviewDate(Date), reviewerName(String)과 verifiedPurchase(Boolean)을 가진다고 가정합니다.
| rating | reviewDate | reviewerName | verifiedPurchase |
|---|---|---|---|
| 5 | 2024-11-20 | Alice Chen | true |
| 3 | 2024-11-15 | Bob Smith | false |
| 4 | 2024-11-22 | Carol Lee | true |
reviewDate의 최신 값을 기준으로 선택하면 2024-11-22에 작성한 Carol Lee의 평점 4 리뷰 구조체를 표시합니다. 전체 리뷰 배열은 계속 접근할 수 있습니다.
같은 날짜의 리뷰가 여러 개이면 rating이 높은 값을 보조 기준으로 사용할 수 있습니다. 먼저 최신 날짜의 후보만 남기고 그 안에서 동률일 때만 평점 기준을 적용합니다. 추가 리듀서도 같은 방식으로 앞 기준의 동률 후보에만 적용합니다.
원시 값 배열이나 보조 기준 없는 구조체 배열에서 끝까지 동률이면 결정적이지만 순서가 보장되지 않는 방식으로 값 하나를 반환합니다. 입력 배열의 첫 항목을 고른다고 가정하지 않습니다.
앱과 SDK에서 읽기
지원 앱은 표와 목록에서 대표 값만 표시하고 확장 보기나 포인터를 올리는 방식으로 전체 배열을 보여 줍니다. 예를 들어 셀에는 2024-11-22만 보이지만 전체 날짜 배열을 열 수 있습니다. 아직 지원하지 않는 앱은 기존 배열 표시를 유지합니다.
TypeScript OSDK 2.x에서 속성을 $select로 선택하는 것만으로 배열을 줄이지는 않습니다. 반환 표현을 바꾸려면 $applyModifiers에서 해당 속성에 적용할 옵션을 지정합니다.
| 옵션 | 반환 표현 |
|---|---|
| applyReducers | 리듀서가 고른 배열 원소 |
| applyMainValue | 구조체의 대표 필드 값 또는 필드 부분집합 |
| applyReducersAndExtractMainValue | 구조체 배열에서 원소를 고른 뒤 대표 필드 추출 |
인터페이스에 단일 값 제공
Asset 인터페이스가 lastMaintenanceDate라는 Date를 요구하고 Equipment에는 maintenanceHistory 날짜 배열이 있다고 가정합니다. 값이 [2024-01-15, 2024-03-22, 2024-11-01]이면 최신 날짜 리듀서로 2024-11-01을 인터페이스의 단일 값에 제공할 수 있습니다.
구조체 대표 필드와 결합
가상의 Event.locations는 streetName(String), dateCollected(Date)와 numberOfGuests(Integer)를 가진 구조체 배열입니다. streetName을 대표 필드(Main field), dateCollected의 최신 값을 리듀서 기준으로 지정합니다.
속성 전체의 구성된 표현으로 구현할 수 있는 형태는 다음과 같습니다.
| 속성 전체의 구성 | 제공 가능한 형태 |
|---|---|
| 둘 다 없음 | Struct Array |
| 대표 필드만 | Struct Array, String Array |
| 리듀서만 | Struct Array, Struct |
| 둘 다 | Struct Array, String Array, Struct, String |
두 기능을 함께 쓰면 먼저 최신 위치 구조체를 고르고 그 구조체의 streetName을 추출하여 Event street name 같은 단일 문자열 계약에 제공할 수 있습니다.
이 표는 속성 전체의 구성된 표현을 비교합니다. 인터페이스 선택기에서 특정 구조체 필드를 직접 선택하는 경우에는 대표 필드로 표시하지 않은 필드도 사용할 수 있습니다.
질의와 편집 제한
검색과 필터는 선택된 대표 원소만이 아니라 원본 배열 전체를 평가합니다. 화면에 최신 값 하나가 보인다는 이유로 그 값만 검색된다고 생각하지 않습니다.
리듀서나 구조체 대표 필드 변환으로 구현한 속성을 수정하는 인터페이스 액션은 오류가 발생합니다. 선택한 원소나 필드 부분집합만으로 원래 배열과 나머지 구조체 값을 재구성할 수 없기 때문입니다. 해당 속성을 수정하지 않는 인터페이스 액션이나 이런 변환 없이 직접 구현한 객체에 대한 액션은 사용할 수 있습니다.