注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

TypeScript v1 から TypeScript v2 に移行する

このガイドでは、既存の TypeScript 関数を v1 から v2 に移行する際に直面する可能性のある構文と構造の違いについて説明します。v2 の機能強化と各バージョンがサポートする内容については、機能サポートのドキュメントを参照してください。

関数を宣言する

TypeScript v1 で関数をプラットフォームに公開するには、@foundry/functions-api パッケージの @Function() デコレーターでアノテーションを付ける必要があります。また、その関数は、リポジトリのルートにある index.ts ファイルからエクスポートされるクラスのメソッドである必要があります。

Copied!
1 2 3 4 5 6 7 8 9 10 11 // src/index.ts import { Function } from "@foundry/functions-api"; export class MyFunctions { @Function() public reverseStringArray(arr: string[]): string[] { return arr.reverse(); } }

TypeScript v2 で関数をプラットフォームに公開するには、src/functions ディレクトリ内のファイルに関数を記述し、export default を使用してエクスポートする必要があります。各ファイルからエクスポートできる関数は1個です。

Copied!
1 2 3 4 5 6 7 // src/functions/reverseStringArray.ts export default function reverseStringArray( arr: string[] ): string[] { return arr.reverse(); }

リポジトリを整理するために、関連する関数を src/functions ディレクトリ内のサブディレクトリにグループ化することを推奨します。たとえば、次のフォルダー構造では、責務の分離をより明確にするために、関数を payroll と staffing のサブディレクトリに整理しています。

TypeScript v2 関数のフォルダー構造の例。

詳細については、TypeScript v2 関数のはじめにのドキュメントを参照してください。

@osdk/functions パッケージを使用する

TypeScript v1 では、Integer や Double などのプリミティブ型をシグネチャで使用するには、@foundry/functions-api パッケージからインポートする必要があります。一方、TypeScript v2 では、代わりに @osdk/functions パッケージを使用する必要があります。

次の例では、@foundry/functions-api パッケージから Integer 型をインポートし、2つの整数の最大公約数を計算する TypeScript v1 関数のシグネチャで使用しています。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 import { Function, Integer } from "@foundry/functions-api"; export class MyFunctions { @Function() public gcd(a: Integer, b: Integer): Integer { if (b === 0) { return a; } return gcd(b, a % b); } }

TypeScript v2 でも、主要な TypeScript ロジックは同じですが、@osdk/functions パッケージの Integer 型を使用する必要があります。

Copied!
1 2 3 4 5 6 7 8 import { Integer } from "@osdk/functions"; export default function gcd(a: Integer, b: Integer): Integer { if (b === 0) { return a; } return gcd(b, a % b); }

TypeScript v1 と TypeScript v2 の両方の関数で、シグネチャに使用するデータ型をインポートして使用する例については、データ型リファレンスを参照してください。

日付とタイムスタンプ

TypeScript v1 では、時間に関するデータを扱うために、@foundry/functions-api パッケージの LocalDate 型と Timestamp 型を使用します。TypeScript v2 では、これらを @osdk/functions パッケージの DateISOString 型と TimestampISOString 型に置き換えています。これらのデータ型は、日付とタイムスタンプを ISO 8601 ↗ 形式の文字列で表します。

TypeScript v2 関数では、dayjs ↗、date-fns ↗、luxon ↗ など、NPM エコシステムで利用可能な任意の日付とタイムスタンプのライブラリを使用できます。

オントロジー SDK を生成する

TypeScript v2 関数は、オントロジー SDK を通じたオントロジーのクエリと編集を標準でサポートしています。TypeScript v1 と同様に、TypeScript v2 のリポジトリでは、リソースのインポートサイドバーからオントロジーリソースをインポートできます。オブジェクトタイプとリンクタイプを追加すると、オントロジー SDK の初期バージョンを作成するためのプロンプトが表示されます。

TypeScript コードリポジトリで最初のオントロジー SDK を作成するためのプロンプト。

作成するを選択し、オントロジー SDK の名前を決めます。この名前は、最初のバージョンが生成された後は変更できません。新しいバージョンを作成を選択して、オントロジー SDK を生成します。

最初のオントロジー SDK を生成する前に名前を決めます。

オントロジー SDK が作成されると、ワークスペースにインストールする選択肢が表示されます。インストールを選択すると、オントロジー SDK が package.json ファイルに依存関係として追加され、TypeScript コードで使用できるようになります。

TypeScript コードリポジトリからオントロジー SDK をインストールするためのプロンプト。

TypeScript でオントロジーを操作する包括的な例については、サイドバーのドキュメントタブを表示します。

オントロジーにクエリを実行する

TypeScript v1 では、オントロジーを検索するために、@foundry/ontology-api パッケージから Objects をインポートする必要があります。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 import { Function, Integer } from "@foundry/functions-api"; import { Objects } from "@foundry/ontology-api"; export class MyFunctions { @Function() public async countAircraft(): Promise<Integer> { const count = await Objects.search().aircraft().count() ?? 0; return count; } }

TypeScript v2 では、関数シグネチャの最初の引数にオントロジー SDK クライアントを指定して、そのクライアントにアクセスする必要があります。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 import { Aircraft } from "@ontology/sdk"; import { Client } from "@osdk/client"; import { Integer } from "@osdk/functions"; export default async function countAircraft(client: Client): Promise<Integer> { const aircraft = await client(Aircraft).aggregate({ $select: { $count: "unordered" } }); return aircraft.$count; }

このセクションの残りの部分では、TypeScript v1 のクエリ用語を、それに対応する TypeScript v2 の用語に対応付けます。TypeScript v2 のクエリ用語の全体については、TypeScript オントロジー SDK リファレンスを参照してください。

どちらのバージョンでも、絞り込み、並べ替え、集計に使用するすべてのプロパティを、Ontology Manager で検索可能に指定する必要があります。検索可能の設定はプロパティのインデックス化の方法を制御するため、この要件はどちらかの SDK ではなく、オントロジーに属します。変わるのは、要件を満たしていないことが判明するタイミングです。TypeScript v1 では、コードジェネレーターが指定されていないプロパティのフィルター、並べ替え、集計メソッドを生成しないため、それらを使用するとコンパイルに失敗します。一方、オントロジー SDK では、.where()、$orderBy、.aggregate() にオブジェクトタイプの任意のプロパティを指定できます。

移行前に検索可能の設定を確認する

移行前に、絞り込み、並べ替え、集計に使用するすべてのプロパティが、Ontology Manager で検索可能に指定されていることを確認してください。TypeScript v2 では、指定されていないプロパティもコンパイルされるため、問題が現れるのは関数の実行時だけです。$containsAnyTerm などの全文検索述語は、エラーではなく空のページを返すため、フィルターが何にも一致していなくても、成功と報告されることがあります。

フィルター演算子の対応関係

TypeScript v1 では、.filter() メソッドに、絞り込み対象のプロパティのデータ型に応じて選択したフィルター定義を渡します。TypeScript v2 では、この一連のメソッドが、句オブジェクトを受け取る単一の .where() 呼び出しに置き換えられます。次のテーブルは、TypeScript v1 の各フィルターメソッドと、対応する TypeScript v2 の where 句のキー、および適用対象のプロパティタイプを示しています。

TypeScript v2 の制限は、対応する TypeScript v1 の制限より厳しくなっています。地理空間プロパティには $within、$intersects、$isNull のみを指定でき、配列プロパティには $contains と $isNull のみを指定できます。ドキュメントに記載されている各フィルターの形式については、TypeScript オントロジー SDK リファレンスの絞り込みを参照してください。そこでは $within、$intersects、$interval は扱っていません。

TypeScript v1TypeScript v2 の where 句のキー適用対象
.exactMatch(value)$eq、または値そのものブール値、日時、数値、文字列
.exactMatch(...values)$in: [...]ブール値、日時、数値、文字列
Filters.not(exactMatch)$neブール値、日時、数値、文字列
.hasProperty()$isNull: false配列、ブール値、日時、Geopoint、Geoshape、数値、文字列
Filters.not(hasProperty())$isNull: true配列、ブール値、日時、Geopoint、Geoshape、数値、文字列
.range().lt(x)$lt日時、数値
.range().lte(x)$lte日時、数値
.range().gt(x)$gt日時、数値
.range().gte(x)$gte日時、数値
.isTrue() / .isFalse()$eq: true / $eq: falseブール値
.matchAnyToken(...)$containsAnyTerm文字列
.matchAllTokens(...)$containsAllTerms文字列
.phrase(...)$containsAllTermsInOrder文字列
.phrasePrefix(), .prefixOnLastToken()$interval。検索文字列を $match に指定し、$prefixOnLastTerm: true を設定します文字列
.contains(...)$contains。内部フィルターをちょうど1個受け取ります配列
.withinDistanceOf(), .withinPolygon(), .withinBoundingBox()$withinGeopoint、Geoshape
.intersectsPolygon(), .intersectsBoundingBox()$intersectsGeoshape
.doesNotIntersectPolygon(), .doesNotIntersectBoundingBox()$intersects を囲む $notGeoshape
.isPresent()対応する where 句のキーはありませんリンク

3つの動作の違いによって、変換後のフィルターの形式が変わります。TSv2 の句の形式に関するルール自体については、絞り込みを参照してください。

  • 上限と下限のある範囲は2個の句になります。 TypeScript v1 の .range().gte(a).lte(b) チェーンは単一の呼び出しですが、TypeScript v2 ではプロパティごとに演算子キーを1個しか指定できないため、同じフィルターは $and: [{ p: { $gte: a } }, { p: { $lte: b } }] になります。
  • 複数の値を持つ .contains() は $or になります。 TypeScript v1 の .contains() は複数の値を受け取り、そのいずれかに一致します。一方、TypeScript v2 の $contains は内部フィルターをちょうど1個受け取ります。
  • 日時の比較には ISO 8601 文字列を指定します。 たとえば、{ $gt: "2010-10-01T00:00:00Z" } のように指定します。

リンク走査の対応関係

TypeScript v1 では、各オブジェクトのインターフェースにリンクタイプごとのフィールドが生成され、オブジェクトセットにはリンクタイプごとの searchAround メソッドが生成されます。TypeScript v2 では、リンクごとのアクセサーが $link の下にネストされ、searchAround メソッド群全体が単一の pivotTo() メソッドに置き換えられます。

TypeScript v1TypeScript v2
.get() または .getAsync() で読み取る SingleLink フィールド$link.{linkApiName}.fetchOne()、または例外をスローする代わりに { value } / { error } ラッパーを返す fetchOneWithErrors()。存在しない場合の動作の変更に注意してください。.get() は undefined を返しますが、fetchOne() は例外をスローし、fetchOneWithErrors() はほかの失敗と区別できない { error } を返します
.all() または .allAsync() で読み取る MultiLink フィールド$link.{linkApiName}。これはすでに ObjectSet であり、asyncIter() で反復処理します
オブジェクトセットの searchAround<LinkApiName>()pivotTo("<linkApiName>")

searchAround メソッド名からリンクのAPI名を導き出さないでください。メソッド名にAPI名が確実に保持されているとは限りません。代わりに、リンクのAPI名を確認してください。生成された TypeScript v2 SDK では、オブジェクトタイプの $link コンテナのキーがリンクのAPI名そのものであり、pivotTo() にはその値をそのまま渡します。たとえば、API名が toOtherObjectType のリンクは、pivotTo("toOtherObjectType") で走査します。

TypeScript v1 では、単一のオブジェクトのインスタンスからたどったリンクで実行できる操作も制限されます。MultiLink はオブジェクトセットに変換できないため、先にそのオブジェクトからオブジェクトセットを再構築する必要があります。TypeScript v2 では、多重度が多の $link エントリはすでに ObjectSet であり、pivotTo() も ObjectSet を返すため、直接チェーンできます。TSv2 の API 自体については、TypeScript オントロジー SDK リファレンスのリンクを参照してください。

グループ化戦略のマッピング

TypeScript v1 では、プロパティタイプに応じたバケット化メソッドで .groupBy() を呼び出して、集計をバケットに分けます。TypeScript v2 では、1回の .aggregate() 呼び出しの $groupBy オブジェクト内の値として、同じ情報を指定します。次のテーブルは、TypeScript v1 の各バケット化メソッドと TypeScript v2 の $groupBy の値の対応を示しています。

$ranges は2要素のタプルの配列を受け取り、$duration は [value, unit] タプルを受け取ります。範囲は TypeScript v1 と同じく、開始値を含み、終了値を含みません。任意の値を指定できるのは "seconds"、"minutes"、"hours"、"days" のみで、それより大きい単位では 1 のみを指定できます。グループ化戦略自体については、グループ化の種類を参照してください。

TypeScript v1TypeScript v2 の $groupBy の値
.exactValues()"exact"
.exactValues({ maxBuckets: n }){ $exactWithLimit: n }
.topValues()"exact"
.byFixedWidth(50){ $fixedWidth: 50 }
.byRanges({ min: 0, max: 50 }, { min: 50, max: 100 }){ $ranges: [[0, 50], [50, 100]] }
.byYear(){ $duration: [1, "years"] }
.byQuarter(){ $duration: [1, "quarters"] }
.byMonth(){ $duration: [1, "months"] }
.byWeek(){ $duration: [1, "weeks"] }
.byDays(n){ $duration: [n, "days"] }
.byHours(n), .byMinutes(n), .bySeconds(n){ $duration: [n, "hours"] }, { $duration: [n, "minutes"] }, { $duration: [n, "seconds"] }
.segmentBy(...)同じ $groupBy オブジェクト内の2個目のキー

完全一致値によるグループ化リクエストには必ず最大バケット数が指定され、デフォルトはバージョンによって異なります。TypeScript v1 の .topValues() のデフォルトは1,000ですが、TypeScript v2 の "exact" のデフォルトは10,000です。結果が正確になるのは、プロパティの一意な値の数がこの件数以内に収まる場合のみです。この件数を超えると、返されるグループからオブジェクトが除外され、集計は近似になります。プラットフォームは、結果が正確か近似かをすべてのレスポンスで報告しますが、TypeScript オントロジー SDK はそのフィールドを公開しません。そのため、TypeScript v2 関数内では、近似の結果と正確な結果を同じように読み取ることになります。カーディナリティの高いプロパティでは、{ $exactWithLimit: n } で件数を増やすか、先に .where() でオブジェクトセットを絞り込みます。ブールプロパティの一意な値は最大2個なので、ブールプロパティに対する "exact" は常に正確です。

集計メトリクスのマッピング

TypeScript v1 では、オブジェクトセットをグループ化した後、.count() や .average() などの集計メソッドを呼び出してメトリクスを計算します。TypeScript v2 では、1回の .aggregate() 呼び出しの $select オブジェクトでメトリクスを選択します。次のテーブルは、TypeScript v1 の各集計メソッドと TypeScript v2 の $select キーの対応を示しています。

件数以外のキーはすべて "<propertyApiName>:<metric>" 形式の文字列で、値はすべて並べ替えの指定("unordered"、"asc"、"desc")です。数値型のプロパティではすべての接尾辞を指定できます。日時型およびタイムスタンプ型のプロパティでは min、max、approximateDistinct、exactDistinct のみを指定でき、それ以外のすべてのデータ型では、一意な値の件数を求める2つの接尾辞のみを指定できます。集計の概念については、TypeScript オントロジー SDK リファレンスの集計を参照してください。

TypeScript v1TypeScript v2 の $select キー
.count()$count: "unordered"
.average(e => e.p)"p:avg": "unordered"
.max(e => e.p)"p:max": "unordered"
.min(e => e.p)"p:min": "unordered"
.sum(e => e.p)"p:sum": "unordered"
.cardinality(e => e.p)"p:approximateDistinct": "unordered"
TypeScript v1 に対応するメソッドなし"p:exactDistinct": "unordered"

変換後の呼び出しの形式に影響する違いが1つあります。.aggregate() は、必須の $select と任意の $groupBy という2個のキーのみを持つ単一のリクエストオブジェクトを受け取ります。where キーはないため、.aggregate() を呼び出す前に、チェーンした .where() でオブジェクトセットを絞り込みます。

結果の形式も変わるため、変換後の関数では、自身の出力の読み取り方を変更する必要があります。$select の指定、並べ替えの制限、およびグループ化された結果の読み取り方については、集計を参照してください。

TypeScript v2 に相当するものがない機能

TypeScript v1 のクエリ機能の一部には、TypeScript v2 に相当するものがありません。そのため、検索や集計を変換する前に、これらへの対応を計画してください。

フィルタリング

  • リンクの有無によるフィルタリングに対応する where 句のキーはありません。 TypeScript v1 では、.isPresent() はオブジェクトセットを、指定したタイプのリンクされたオブジェクトが1つ以上あるオブジェクトに絞り込みます。否定した場合は、該当するリンクされたオブジェクトがないオブジェクトに絞り込みます。TypeScript v2 には、これを行う $ キーがありません。最も近い方法は派生プロパティです。リンクされたオブジェクトの件数を数える派生プロパティを定義し、その件数が0より大きいという条件で絞り込みます。この方法に依存する前に、ご自身のデータでテストしてください。これは回避策であり、サポートされている同等の機能ではありません。
  • Fuzziness の編集距離に対応する TypeScript v2 の形式はありません。 TypeScript v2 の語句演算子 $containsAnyTerm と $containsAllTerms は、単純な fuzzySearch ブール値を受け付けますが、編集距離を制御できません。そのため、Fuzziness.LEVENSHTEIN_ONE と Fuzziness.LEVENSHTEIN_TWO に直接対応する TypeScript v2 の形式はありません。$containsAllTermsInOrder は、あいまい検索のオプションを一切受け付けません。$interval キーには、編集距離を保持する $fuzzy と $fuzziness サブキーがあるため、この構成に依存する前に、ご自身のデータでテストしてください。

グループ化

  • 上限または下限のない範囲バケットは廃止されました。 TypeScript v1 では、min または max を省略して、負の無限大から max まで、または min から無限大までのバケットを作成できます。TypeScript v2 の $ranges タプルには、両方の端点が必要です。
  • TypeScript v2 では Long プロパティによるグループ化はできません。 TypeScript v1 では、グループ化に利用可能な数値データ型に Long が含まれていますが、TypeScript v2 の型には、Long プロパティに対応する $groupBy の値がありません。
  • TypeScript v2 では配列プロパティによるグループ化はサポートされていません。 TypeScript v1 では、配列プロパティに対して、その要素のデータ型と同じバケット化メソッドを使用できます。TypeScript v2 の型は $groupBy で配列プロパティを受け付けるため、この誤った使い方でもコンパイルは通りますが、結果は保証されません。代わりにスカラープロパティでグループ化してください。
  • TypeScript v2 に segmentBy はありません。 TypeScript v1 では、.groupBy() の後に .segmentBy() を呼び出して、2個のプロパティでバケット化した3次元の集計を計算します。TypeScript v2 で相当するのは、同じ $groupBy オブジェクト内の2個目のキーですが、同じ形式の結果は返されません。TypeScript v1 はネストされたバケットを生成する一方、TypeScript v2 はフラットな行の配列を返します。各行には、すべてのグループ化キーの値を保持する $group オブジェクトが含まれます。そのため、3次元の集計を返す必要がある関数は、ネスト構造を自ら再構築する必要があります。各バージョンが想定する形式については、集計の型を参照してください。

集計メトリクス

  • 日付またはタイムスタンプの平均の計算は、TypeScript v1 でのみ利用できます。 TypeScript v1 の .average() は、タイムスタンプおよび日付プロパティを受け付けます。TypeScript v2 では、日付またはタイムスタンププロパティに対して min、max、approximateDistinct、exactDistinct のみを提供しており、avg も sum も利用できません。
  • TypeScript v2 にはメトリクスのエイリアス機能がありません。 結果のキーは常にプロパティとメトリクスから生成されるため、$count または "property:metric" 形式の文字列以外の $select キーは、型エラーになります。

並べ替えと読み込み

  • TypeScript v2 に .take() や .limit() はありません。 並べ替えはチェーンされた句ではなくなり、fetchPage() または asyncIter() のオプションオブジェクト内の $orderBy に移ります。また、同じオプションオブジェクト内の $pageSize で結果の件数を制限します。
  • TypeScript v2 に .all() はありません。 TypeScript v1 の .all() と .allAsync() は、オブジェクトセット全体を一度に実体化します。TypeScript v2 では、オブジェクトをメモリーに読み込むで説明しているように、asyncIter() で反復処理するか、fetchPage() で1ページを読み込みます。
  • 最近傍数の上限が拡大されました。 TypeScript v1 では k の値が 0 < K <= 100 に制限されますが、TypeScript v2 の nearestNeighbors() メソッドは、1から500までの numNeighbors を受け付けます。そのため、TypeScript v1 で範囲の上限を使用していた検索は、移行後に5倍の最近傍をリクエストできます。
  • 関連度による並べ替えは最近傍検索でのみ機能します。 TypeScript v2 では、$orderBy: "relevance" は nearestNeighbors() 検索に適用されます。この検索では、numNeighbors が結果の件数を制限し、返される各オブジェクトに $score が含まれます。トークン一致の where 句には効果がないため、.matchAnyToken() で絞り込み、関連度で並べ替え、最初の N 件の結果を取得するという TypeScript v1 のパターンに相当するものは、TypeScript v2 にはありません。

オブジェクトを識別する

TypeScript v1 では、オブジェクトの識別情報が rid、primaryKey、typeId フィールドを通じて公開されます。TypeScript v2 では、組み込みの識別子フィールドすべてに接頭辞 $ を付けて、オブジェクト自身のプロパティと区別します。また、オブジェクトタイプと主キーの両方をエンコードした単一の文字列である $objectSpecifier が追加されます。$rid は、読み取り時に $includeRid: true を指定した場合にのみ存在するため、TypeScript v2 では、識別用のロジックの基準として $rid ではなく $objectSpecifier を使用してください。

識別子リファレンス

次のテーブルは、TypeScript v1 の各識別子と型を、相当する TypeScript v2 のものに対応付けています。

TypeScript v1TypeScript v2注記
obj.ridobj.$rid読み取り時に $includeRid: true を渡した場合にのみ存在します。
obj.primaryKeyobj.$primaryKey常に存在します。
obj.typeIdobj.$apiName または obj.$objectType常に存在します。どちらもオブジェクトタイプのAPI名を保持しますが、リテラル型なのは $apiName のみです。
利用不可obj.$objectSpecifier常に存在します。文字列 "<apiName>:<primaryKey>" です。
EmployeeOsdk.Instance<Employee>読み込まれたオブジェクトのインスタンスの型です。
OntologyObject相当するものなし@osdk/api の OsdkBase が最も近い型です。
IsOntologyObject相当するものなし削除されており、直接の代替はありません。
オブジェクトキーを持つ FunctionsMap<T, V>Record<ObjectSpecifier<T>, V>スカラーキーを持つ FunctionsMap は、通常の Record<K, V> になります。オブジェクトのマッピングを参照してください。

2個のオブジェクトが等しいかどうかの比較は、移行によって簡単になります。TypeScript v1 では、主キーは単一のオブジェクトタイプ内でのみ一意であるため、typeId と primaryKey の両方を比較する必要があります。TypeScript v2 では、両方の値が $objectSpecifier にエンコードされるため、相当する確認は単一の文字列比較で行えます。この比較は、2個のオブジェクトのオブジェクトタイプが異なる場合でも正しく機能します。

Copied!
1 2 3 function isEqual(o1: { $objectSpecifier: string }, o2: { $objectSpecifier: string }): boolean { return o1.$objectSpecifier === o2.$objectSpecifier; }

両方のバージョンでオブジェクトをキーとするマップを使用する具体例については、型リファレンスのマップを参照してください。両方の例の TypeScript v1 での形式、およびオブジェクトの等価性に注意が必要な理由についての概念的な背景は、オブジェクト識別子を参照してください。

オントロジーを編集する

TypeScript v1 でオントロジー編集関数を記述するには、@foundry/functions-api パッケージの @OntologyEditFunction() デコレーターでアノテーションを付け、戻り値の型を void にする必要があります。また、@Edits デコレーターを適用して、編集するすべてのオブジェクトタイプを事前に宣言する必要があります。これにより、関数ベースのアクションが呼び出される前に、それらのオブジェクトタイプに対する権限が適用されます。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 import { Edits, OntologyEditFunction } from "@foundry/functions-api"; import { Aircraft, Employee } from "@foundry/ontology-api"; export class MyOntologyEditFunctions { @Edits(Aircraft, Employee) @OntologyEditFunction() public myFunction(aircraft: Aircraft, employee: Employee): void { aircraft.businessCapacity = 3; employee.department = "HR"; } }

TypeScript v2 では、@osdk/functions パッケージから createEditBatch 関数をインポートして、実行中に使用する編集の格納先を構築する必要があります。Edits 型を使用して、関数による編集を許可するエンティティを宣言する必要があります。これにより、コンパイル時に型安全性が強制されます。Edits 型でカバーされていないタイプのオブジェクトまたはリンクを編集しようとすると、TypeScript コンパイラーがエラーを返します。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import { createEditBatch, Edits } from "@osdk/functions"; import { Aircraft, Employee } from "@ontology/sdk"; import { Client, Osdk } from "@osdk/client"; type OntologyEdit = Edits.Object<Aircraft> | Edits.Object<Employee>; export default function myFunction( client: Client, aircraft: Osdk.Instance<Aircraft>, employee: Osdk.Instance<Employee> ): OntologyEdit[] { const batch = createEditBatch<OntologyEdit>(client); batch.update(aircraft, { businessCapacity: 3 }); batch.update(employee, { department: "HR" }); return batch.getEdits(); }

TypeScript v2 では、Edits.Interface<MyInterface> を使用して、オントロジーインターフェースのプロパティを介してオブジェクトを作成、更新、削除します。詳細については、オントロジーの編集を参照してください。

TypeScript v1 では、関数の実行中に編集がオントロジーに適用されることは_ありません_。編集とオブジェクト検索のドキュメントで説明しているとおり、オブジェクトとリンクへの変更は、関数の実行が完了した後、かつ関数ベースのアクション内で呼び出された場合にのみ伝播されます。

TypeScript v2 では、この動作がより明示的になっています。関数は、編集を暗黙的に蓄積するのではなく、編集バッチを使用して追跡し、完了時に返す必要があります。

サポートされている操作の全一覧については、TypeScript v2 ドキュメントのオントロジーの編集セクションを参照してください。

TypeScript v2 は、書き込み後の読み取りを保証する代替実行モデルであるステージングされた書き込みもサポートしています。ステージングされた書き込みを行う関数は、createEditBatch の代わりに WriteableClient を使用し、編集を明示的に返す必要はありません。

オブジェクトの一意の ID を生成する

TypeScript v1 で新しく作成したオブジェクトの一意の ID を生成するには、@foundry/functions-utils パッケージの Uuid ユーティリティを使用します。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 import { Edits, OntologyEditFunction } from "@foundry/functions-api"; import { Uuid } from "@foundry/functions-utils"; import { FlightScenario, Objects } from "@foundry/ontology-api"; export class ExampleEditFunctions { @Edits(FlightScenario) @OntologyEditFunction() public createFlightScenario(): void { const scenario = Objects.create().flightScenarios(Uuid.random()); scenario.scenarioName = "New scenario"; } }

TypeScript v2 は完全な Node.js 環境で実行されるため、代わりに node:crypto コアモジュールを使用できます。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import { FlightScenario } from "@ontology/sdk"; import { Client } from "@osdk/client"; import { createEditBatch, Edits } from "@osdk/functions"; import { randomUUID } from "node:crypto"; type OntologyEdit = Edits.Object<FlightScenario>; export default function createFlightScenario(client: Client): OntologyEdit[] { const batch = createEditBatch<OntologyEdit>(client); batch.create(FlightScenario, { id: randomUUID(), scenarioName: "New scenario", }); return batch.getEdits(); }

関数の本文の外側にあるモジュールのトップレベルで、randomUUID やその他の乱数値ジェネレーターを呼び出さないでください。TypeScript v2 関数はウォーム呼び出しを使用します。ウォーム呼び出しでは、モジュールレベルのすべてのコードが初期化時に1回評価され、その後の呼び出しで再利用されます。つまり、モジュールレベルの randomUUID 呼び出しは1回だけ評価され、ウォーム呼び出しのたびに同じ値を生成します。一意性を確保するため、乱数値は必ず関数の本文内で生成してください。

オブジェクトをメモリーに読み込む

TypeScript v1 関数は、特定のタイプのすべてのオブジェクトを処理のためにメモリーに読み込む .all() および .allAsync() API を提供しています。ただし、この方法では、オントロジー内のオブジェクト数が増えるにつれて、メモリー使用量が増加し、パフォーマンスが低下する可能性があります。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import { Edits, OntologyEditFunction } from "@foundry/functions-api"; import { Aircraft, Objects } from "@foundry/ontology-api"; export class MyFunctions { @Edits(Aircraft) @OntologyEditFunction() public editAircraft(): void { const aircraft = Objects.search().aircraft().all(); aircraft.forEach(a => { a.arrived = true; }); } }

TypeScript v2 関数は、オントロジー SDK を介したオブジェクトのストリーミング処理をサポートしており、すべてのオブジェクトを一度にメモリーに保持する必要がありません。可能な場合は、この方法を推奨します。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import { Aircraft } from "@ontology/sdk"; import { Client } from "@osdk/client"; import { createEditBatch, Edits } from "@osdk/functions"; type OntologyEdit = Edits.Object<Aircraft>; export default async function editAircraft(client: Client): Promise<OntologyEdit[]> { const batch = createEditBatch<OntologyEdit>(client); for await (const a of client(Aircraft).asyncIter()) { batch.update(a, { arrived: true }); } return batch.getEdits(); }

データ規模が問題にならない場合は、次の代替方法で特定のタイプのすべてのオブジェクトを読み込めます。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import { Aircraft } from "@ontology/sdk"; import { Client } from "@osdk/client"; import { createEditBatch, Edits } from "@osdk/functions"; type OntologyEdit = Edits.Object<Aircraft>; export default async function editAircraft(client: Client): Promise<OntologyEdit[]> { const batch = createEditBatch<OntologyEdit>(client); const aircraft = await Array.fromAsync(client(Aircraft).asyncIter()); aircraft.forEach(a => { batch.update(a, { arrived: true }); }); return batch.getEdits(); }