TypeScript v2 편집 배치
TSv2의 일반 온톨로지 편집 함수는 createEditBatch로 편집을 모아 목록을 반환합니다. 실제 적용은 함수 기반 액션이 수행합니다. 편집 직후 조회에 새 값을 반영해야 하면 적용 대기 쓰기를 사용합니다.
선언과 기본 동작
Edits.Object는 객체 유형, Edits.Interface는 인터페이스, Edits.Link는 출발 유형과 링크 API 이름의 변경을 선언합니다. 여러 대상은 타입 합집합으로 정합니다.
import { Employee, Person, Ticket } from "@ontology/sdk";
import { Edits } from "@osdk/functions";
type OntologyEdit = Edits.Object<Employee> | Edits.Interface<Person> |
Edits.Object<Ticket> | Edits.Link<Employee, "assignedTickets">;
함수에는 Foundry가 제공한 Client를 받고 createEditBatch<OntologyEdit>(client)를 만듭니다. 마지막에 batch.getEdits()를 반환해야 해당 편집을 액션에 전달합니다.
속성 수정
batch.update(employee, { lastName: newName })으로 한 개 이상의 속성을 바꿉니다. 객체를 미리 로드하지 않았다면 { $apiName: "Employee", $primaryKey: 23 } 같은 객체 식별을 사용할 수 있습니다. 숫자 23은 설명용 기본 키입니다.
같은 유형의 객체 값 전체를 다른 객체에 복사하려면 batch.update(employee1, employee2)를 사용할 수 있습니다. 기존 객체의 기본 키는 변경할 수 없습니다.
batch.update는 이미 로드한 employee 객체의 getter 값을 바꾸지 않습니다. 같은 실행에서 employee.lastName을 읽어도 배치에 넣은 새 값이 보이지 않습니다.
링크 변경
다대다 관계는 batch.link와 batch.unlink를 사용하고 Edits.Link를 선언합니다. 다중 대상 링크에는 대상 배열을 넘길 수 있으며 각 원소가 별도 링크 편집이 됩니다. 양끝은 로드한 객체나 API 이름과 기본 키로 지정할 수 있습니다.
일대일과 일대다는 외래 키를 가진 객체 속성을 수정합니다. 가상의 Ticket.assignedEmployeeId가 그 외래 키라면 Edits.Object<Ticket>만 선언하고 다음처럼 설정하거나 해제합니다.
batch.update({ $apiName: "Ticket", $primaryKey: 13 }, { assignedEmployeeId: 52 });
batch.update({ $apiName: "Ticket", $primaryKey: 13 }, { assignedEmployeeId: undefined });
두 줄은 설정과 해제의 대안입니다. 한 배치에 둘을 순서대로 넣으면 같은 관계를 다시 해제하므로 필요한 동작만 사용합니다.
티켓 생성과 연결
가상의 Ticket은 Integer 기본 키 ticketId와 Date 속성 dueDate를, Employee는 assignedTickets 다대다 링크를 가진다고 가정합니다. createNewTicketAndAssignToEmployee.ts의 예제는 UTC 기준 7일 뒤의 날짜를 넣습니다.
import { Employee, Ticket } from "@ontology/sdk";
import { Client, Osdk } from "@osdk/client";
import { createEditBatch, Edits, Integer } from "@osdk/functions";
type OntologyEdit = Edits.Object<Ticket> | Edits.Link<Employee, "assignedTickets">;
export default function createNewTicketAndAssignToEmployee(
client: Client,
employee: Osdk.Instance<Employee>,
ticketId: Integer
): OntologyEdit[] {
const batch = createEditBatch<OntologyEdit>(client);
batch.create(Ticket, {
ticketId,
dueDate: new Date(Date.now() + 7 * 86_400_000).toISOString().slice(0, 10),
});
batch.link(employee, "assignedTickets", { $apiName: "Ticket", $primaryKey: ticketId });
return batch.getEdits();
}
새 객체는 아직 실제 조회 가능한 인스턴스가 아니어도 API 이름과 기본 키로 같은 배치의 링크에 사용할 수 있습니다.
삭제
batch.delete에 객체나 API 이름과 기본 키를 전달합니다. 직원의 연결 티켓 전체를 삭제하는 예제는 다음과 같습니다.
import { Employee, Ticket } from "@ontology/sdk";
import { Client, Osdk } from "@osdk/client";
import { createEditBatch, Edits } from "@osdk/functions";
type OntologyEdit = Edits.Object<Ticket>;
export default async function deleteAssignedTickets(
client: Client,
employee: Osdk.Instance<Employee>
): Promise<OntologyEdit[]> {
const batch = createEditBatch<OntologyEdit>(client);
for await (const ticket of employee.$link.assignedTickets.asyncIter()) {
batch.delete(ticket);
}
return batch.getEdits();
}
deleteAssignedTickets.ts에 두며, 이 동작은 관계만 끊는 unlink가 아니라 티켓 객체 삭제입니다. 단일 키를 사용하는 대안은 batch.delete({ $apiName: "Ticket", $primaryKey: 12 })입니다.
인터페이스 편집
인터페이스 인스턴스에 batch.update로 공통 속성을 설정할 수 있습니다. 그 속성이 실제 구현 유형의 기본 키에 매핑되어 있으면 바꿀 수 없습니다. batch.delete도 인터페이스 인스턴스를 받아 실제 객체를 삭제합니다.
생성에는 인터페이스 정의와 $objectType으로 구체 유형을 지정하고, 그 유형의 기본 키에 매핑한 인터페이스 속성을 반드시 채워야 합니다. 가상의 Person.personId가 Employee.employeeId에 매핑되며 두 키가 Integer라고 가정한 createPerson.ts입니다.
import { Person } from "@ontology/sdk";
import { Client } from "@osdk/client";
import { createEditBatch, Edits, Integer } from "@osdk/functions";
type OntologyEdit = Edits.Interface<Person>;
export default function createPerson(
client: Client,
personId: Integer,
firstName: string,
lastName: string
): OntologyEdit[] {
const batch = createEditBatch<OntologyEdit>(client);
batch.create(Person, { $objectType: "Employee", personId, firstName, lastName });
return batch.getEdits();
}
구조체 속성
일반 배치에서는 객체 및 인터페이스의 구조체 속성을 편집할 수 있습니다. 사용자 지정 타입의 필드가 온톨로지 구조체 필드의 API 이름과 일치해야 합니다.
가상의 Employee.address에 아래 다섯 String 필드가 있다고 가정한 updateEmployeeAddress.ts입니다.
import { Client, Osdk } from "@osdk/client";
import { Employee } from "@ontology/sdk";
import { createEditBatch, Edits } from "@osdk/functions";
interface Address {
street: string;
city: string;
state: string;
country: string;
zipcode: string;
}
type OntologyEdit = Edits.Object<Employee>;
export default function updateEmployeeAddress(
client: Client,
employee: Osdk.Instance<Employee>,
newAddress: Address
): OntologyEdit[] {
const batch = createEditBatch<OntologyEdit>(client);
batch.update(employee, { address: newAddress });
return batch.getEdits();
}