TypeScript v1 온톨로지 편집
TSv1은 객체 속성 대입과 링크 메서드를 실행할 때 편집을 수집합니다. OntologyEditFunction과 Edits 데코레이터를 선언하고 반환 타입을 void 또는 Promise<void>로 정합니다. 실제 변경은 함수 기반 액션을 실행할 때 적용합니다.
속성과 배열
객체 속성에 새 값을 대입하면 같은 함수 안에서 다시 읽을 때 새 값을 반환합니다. 기본 키는 변경할 수 없습니다.
배열 속성은 ReadonlyArray이므로 복사본을 수정하고 속성에 다시 대입해야 합니다. 가상의 Employee에 lastName과 문자열 배열 tags가 있다고 가정한 예제입니다.
import { Edits, OntologyEditFunction } from "@foundry/functions-api";
import { Employee } from "@foundry/ontology-api";
export class EmployeeEditFunctions {
@Edits(Employee)
@OntologyEditFunction()
public updateEmployee(employee: Employee, lastName: string, newTag: string): void {
employee.lastName = lastName;
const tags = [...(employee.tags ?? [])];
tags.push(newTag);
employee.tags = tags;
}
}
링크와 편집 대상 선언
SingleLink는 set과 clear, MultiLink는 add와 remove를 사용합니다. Employee의 supervisor가 다대일 자기 관계이고 reports가 그 역방향이라고 가정하면 다음 동작을 사용할 수 있습니다.
| 표현 | 결과 |
|---|---|
| employee.supervisor.set(newSupervisor) | 단일 상사 링크 설정 |
| employee.supervisor.clear() | 상사 링크 제거 |
| employee.reports.add(newReport) | 보고자 관계 추가 |
| employee.reports.remove(oldReport) | 보고자 관계 제거 |
편집한 링크를 같은 실행에서 다시 읽으면 새 관계를 반영합니다. Edits에는 속성을 바꾼 유형, 외래 키 기반 관계이면 그 외래 키 유형, 조인 테이블의 다대다이면 양끝 유형을 선언합니다. 정적 분석에만 맡기면 권한 검사나 액션 로그에 필요한 선언이 누락될 수 있습니다.
객체 생성과 삭제
다음 가상 Ticket은 Integer 기본 키 ticketId와 Date 속성 dueDate를 가지며 Employee.assignedTickets는 다대다 링크입니다. 생성 함수는 기본 키를 받고 7일 뒤의 날짜를 설정한 뒤 연결합니다.
import { Edits, Integer, LocalDate, OntologyEditFunction } from "@foundry/functions-api";
import { Employee, Objects, Ticket } from "@foundry/ontology-api";
export class TicketActionFunctions {
@Edits(Employee, Ticket)
@OntologyEditFunction()
public createNewTicketAndAssignToEmployee(employee: Employee, ticketId: Integer): void {
const ticket = Objects.create().ticket(ticketId);
ticket.dueDate = LocalDate.now().plusDays(7);
employee.assignedTickets.add(ticket);
}
@Edits(Ticket)
@OntologyEditFunction()
public async deleteAssignedTickets(employee: Employee): Promise<void> {
const tickets = await employee.assignedTickets.allAsync();
for (const ticket of tickets) ticket.delete();
}
}
삭제 함수는 현재 직원의 연결 티켓 전체를 삭제하는 동작입니다. 단순히 링크만 제거하는 함수가 아닙니다. 실행 결과를 적용하는 액션의 대상과 권한을 구분해야 합니다.
편집의 축약과 helper
런타임은 실행 전체에 하나의 편집 저장소를 사용합니다. 새 객체 생성 후 속성을 여러 번 넣으면 최종 속성을 가진 Create Object 하나로 합칩니다. 기존 객체의 여러 속성 수정도 Update Object 하나로 합치며, 객체를 삭제하면 그 전에 수집한 속성 수정은 제거합니다.
함수 전체가 성공해야 액션에 넘길 편집 목록을 만듭니다. 코드의 void 반환 뒤에 실제 실행 시스템이 편집 목록을 제공하므로 별도 업무 값을 동시에 반환할 수 없습니다.
private helper도 같은 실행의 편집을 만들 수 있습니다. 아래 가상의 ObjectA와 ObjectB는 String 기본 키를 사용하고 ObjectA.linkToB가 단일 링크입니다. prop1은 String, ObjectA.prop2는 Integer입니다.
import { Edits, OntologyEditFunction } from "@foundry/functions-api";
import { Objects, ObjectA, ObjectB } from "@foundry/ontology-api";
import { Uuid } from "@foundry/functions-utils";
export class HelperEditFunctions {
@Edits(ObjectA, ObjectB)
@OntologyEditFunction()
public createAndLink(): void {
const objectA = this.createObjectA();
const objectB = this.createObjectB();
objectA.linkToB.set(objectB);
}
private createObjectA(): ObjectA {
const object = Objects.create().objectA(Uuid.random());
object.prop1 = "example";
object.prop2 = 42;
return object;
}
private createObjectB(): ObjectB {
const object = Objects.create().objectB(Uuid.random());
object.prop1 = "another example";
return object;
}
}
각 클래스를 파일에 두고 index.ts에서 내보냅니다. UUID 도구의 준비는 새 객체 ID를 따릅니다.
getter와 인덱스 질의의 차이
수정한 속성 getter와 편집 전 기본 키로 다시 구체 객체를 조회하는 경로는 수집한 새 값을 보여 줍니다. 하지만 바뀐 속성이나 링크로 필터링, 탐색 또는 집계한 결과는 함수가 끝나기 전 편집을 반영하지 않습니다. 편집 적용과 검색의 예제를 따릅니다.
삭제한 객체는 편집 문맥에서 속성에 접근할 수 없고 구체 객체 결과에서 제거될 수 있습니다. 이것을 일반 객체 집합 집계가 삭제를 즉시 재계산한다는 보장으로 사용해서는 안 됩니다. 변경 후 질의가 반드시 필요하면 TSv2나 Python의 적용 대기 쓰기 모델을 사용합니다.