Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

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();
}