注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
オブジェクトテーブルウィジェットは、オブジェクトデータをテーブル形式で表示するために使用します。オブジェクトテーブルウィジェットを設定するモジュール作成者は、次の機能を使用できます。
次のスクリーンショットは、フライトアラートデータを表示するように設定されたオブジェクトテーブルの例です。

オブジェクトテーブルウィジェットの主な設定オプションは次のとおりです。
入力データ
列の設定
列: このセクションでは、オブジェクトテーブル内に表示する列を決定します。初期オブジェクトセットにデータが入ると、この設定オプションがより詳細に表示され、そのオブジェクトセット内のプロパティタイプが表示されます。また、特殊な列の種類を使用すると、モジュール作成者はリンクされたオブジェクト、パラメーター化された URL リンク、時系列データ、関数によってその場で生成される派生列を表示できます。表示モードのユーザーも、表示される列を設定できます。閲覧者は、列ヘッダーの横にある矢印から列を設定するを選択すると、オブジェクトテーブルに表示する列とその順序を選択できます。時系列データの詳細については、後述の時系列プロパティセクションを、派生列の設定方法の詳細については、関数ベースの列セクションを参照してください。
表示用の列名はテキストフィールドであり、追加時のデフォルトはオブジェクトタイプのプロパティ名です。 その後、オントロジーでオブジェクトタイプのプロパティ名を更新しても、オブジェクトテーブルの表示用の列名は自動的には変更されません。
派生プロパティ: モジュールレベルで設定された派生プロパティは、オブジェクトテーブルの列として表示できます。これらのプロパティは、リンクされたオブジェクトの値または集計に基づいて実行時に計算されます。設定の詳細とサポートされているウィジェットについては、派生プロパティのドキュメントを参照してください。
サポートされていないプロパティタイプ: サイズの大きい一部のプロパティ(たとえば、Geoshape やベクトル)は、パフォーマンスを維持するため、デフォルトでは読み込まれません。表示モードでは、ユーザーはセルの「...」オーバーフローメニューを選択し、サポートされていないプロパティの値を必要に応じて読み込めます。ウィジェットエディターでは、サポートされていないプロパティに警告アイコンとツールチップが表示され、パフォーマンスに影響する可能性があることを示します。
インライン編集を有効にする: この切り替えを有効にすると、オブジェクトテーブル内でセル単位の編集を設定できます。この高度な機能の設定方法の詳細については、後述のインライン編集(セル単位のライトバック)セクションを参照してください。
デフォルトの並べ替え: この設定では、1つ以上のデフォルトの並べ替えをテーブルに適用できます。モジュール作成者は、テーブル内に表示されているプロパティタイプでも、表示されていない非表示のプロパティタイプでも並べ替えができます。並べ替えを適用しない場合、データは並べ替えられません。必要に応じて並べ替えを指定することを推奨します。
変数に基づく列の表示設定と並び順: 有効にすると、表示する列のAPI名を含む文字列配列変数を使用して、どの列を表示するか制御できます。この配列変数は、列の表示順序も制御します。文字列配列が空の場合、設定されたすべての列がテーブルに表示されます。
列の設定を非表示にする: 有効にすると、閲覧モードのテーブルのヘッダーメニューにある列を設定するオプションが非表示になります。
右クリックメニュー
選択
表示と書式設定
オブジェクトに画像の URL を格納するプロパティがある場合は、タイプクラス hubble:icon を追加すると、オブジェクトタイプの設定時に選択したアイコンの代わりに画像を表示できます。この機能を使用すると、データとともにピクトグラムや画像を表示できます。
シナリオ
ユーザーの列設定を保存するには、次のステップに沿って、状態の保存を使用する文字列配列変数を設定します。
このセクションのチュートリアルでは、お使いの Foundry 環境では利用できない可能性がある Flight Alert オブジェクトタイプを使用しています。これをガイドとして、Foundry インスタンス内の同等のオブジェクトタイプを使って手順を進めてください。Functions については、専用の Functions ドキュメントをご覧ください。
1個以上の関数ベースの列を返す関数を作成するには、次の仕様を満たす必要があります。
関数の入力パラメーターには、ObjectSet<ObjectType> パラメーターを含める必要があります(任意でほかの入力パラメーターを含めることもできます)。この ObjectSet<ObjectType> パラメーターにより、テーブルに表示されているオブジェクトを関数に渡し、目的の派生列を生成できます。ObjectType[] パラメーターも使用できますが、パフォーマンスが低いため、この選択肢は推奨しません。
関数の戻り値の型は、オブジェクトタイプから値またはカスタム型へのマップである必要があります。これにより、関数はオブジェクトから値、または1個以上のフィールドを含むことができるカスタム型へのマッピングを返せます。
FunctionsMap<ObjectType, CustomType> を使用します。Record<ObjectSpecifier<ObjectType>, CustomType> を使用します。dict[ObjectType, CustomType] を使用します。上記の条件を満たす関数を設定して公開すると、オブジェクトテーブルの設定内で関数ベースのプロパティ列を設定できます。詳細なチュートリアルについては、以下をご覧ください。
オブジェクトテーブルウィジェットは、Functions によってその場で計算される関数ベースのプロパティの表示をサポートしています。これにより、モジュール作成者は柔軟に列を表示でき、たとえば次のようなことができます。
この例では、関数ベースのプロパティを使用して、ユーザーが Flight Alert チケットの優先度を確認し、扱えるようにします。ここでの目的は、Time of Delay(時間単位)という既存のプロパティを調べ、このプロパティから Urgency という新しい関数ベースの列を生成することです。派生列 Urgency は、長時間の遅延(4時間超)を緊急度「High」、中程度の遅延(2~4時間)を緊急度「Medium」、短時間の遅延(2時間未満)を緊急度「Low」としてマークします。この派生プロパティ Urgency によって、ユーザーはオブジェクトテーブルをすばやく確認し、どのアラートから対応すべきかを判断しやすくなります。
この関数ベースのプロパティを設定するには、まず、期待される入力(たとえば、Flight Alert オブジェクトのオブジェクトセット)を受け取り、関数ベースのプロパティに対してオブジェクトテーブルが必要とする、期待されるマップ出力(たとえば、Flight Alert オブジェクトから緊急度の文字列へのマップ)を返す関数を設定します。この例では、以下に示すように、緊急度を計算するロジックを関数自体にハードコーディングしています。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23import { Function, FunctionsMap } from "@foundry/functions-api"; import { FlightAlertWorkshopTutorial, ObjectSet } from "@foundry/ontology-api"; export class MyFunctions { @Function() public flightAlertCalculateUrgency(flightAlerts: ObjectSet<FlightAlertWorkshopTutorial>): FunctionsMap<FlightAlertWorkshopTutorial, string>{ const map = new FunctionsMap<FlightAlertWorkshopTutorial, string>(); flightAlerts.all().forEach(flightAlert => { var hoursDelayed = flightAlert.timeOfDelayHours if (hoursDelayed! > 4) { map.set(flightAlert, "High") } else if (hoursDelayed! > 2) { map.set(flightAlert, "Medium") } else { map.set(flightAlert, "Low") } }); return map; } }
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21import { ObjectSet, ObjectSpecifier } from "@osdk/client"; import { FlightAlertWorkshopTutorial } from "@ontology/sdk"; async function flightAlertCalculateUrgency( flightAlerts: ObjectSet<FlightAlertWorkshopTutorial> ): Promise<Record<ObjectSpecifier<FlightAlertWorkshopTutorial>, string>> { const map: Record<ObjectSpecifier<FlightAlertWorkshopTutorial>, string> = {}; for await(const flightAlert of flightAlerts.asyncIter({"$select": ["timeOfDelayHours"]})) { const hoursDelayed = flightAlert.timeOfDelayHours; if (hoursDelayed! > 4) { map[flightAlert.$objectSpecifier] = "High"; } else if (hoursDelayed! > 2) { map[flightAlert.$objectSpecifier] = "Medium"; } else { map[flightAlert.$objectSpecifier] = "Low"; } } return map; } export default flightAlertCalculateUrgency;
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18from functions.api import function from ontology_sdk.ontology.objects import FlightAlertWorkshopTutorial from ontology_sdk.ontology.object_sets import FlightAlertWorkshopTutorialObjectSet @function def flight_alert_calculate_urgency( flight_alerts: FlightAlertWorkshopTutorialObjectSet, ) -> dict[FlightAlertWorkshopTutorial, str]: result = {} for flight_alert in flight_alerts.iterate(): hours_delayed = flight_alert.time_of_delay_hours if hours_delayed is not None and hours_delayed > 4: result[flight_alert] = "High" elif hours_delayed is not None and hours_delayed > 2: result[flight_alert] = "Medium" else: result[flight_alert] = "Low" return result
この関数を公開したら、派生プロパティ Urgency がこの Workshop モジュールに表示されるように設定します。まず、Workshop モジュール内のオブジェクトテーブルの設定パネルで、列を追加ボタンを選択し、関数ベースのプロパティを追加する選択肢を選択します。

列リストに表示される関数を利用したプロパティの選択肢内で、「fx」の Functions アイコンを選択し、目的の関数を選択します。この例では、flightAlertCalculateUrgency 関数を選択します。

次に、関数のバージョンを確認し、関数に必要な入力を設定します。実行時の入力を使用を選択すると、オブジェクトセット全体ではなく、オブジェクトテーブルに現在表示されているオブジェクトのみが派生列の関数に渡されるため、パフォーマンスが向上します。もう一方の選択肢である変数の入力を使用は、オブジェクトテーブルの元となるオブジェクトセット変数など、オブジェクトセット変数全体を渡しますが、パフォーマンスが低下する可能性があります。

最後に、関数ベースのプロパティ列のセルを選択し、この列の名前を「Urgency」などのわかりやすい名前に変更します。

最終的に、以下のオブジェクトテーブルが表示されます。このテーブルは新しい派生列 Urgency をその場で計算し、この有用な追加情報をユーザーに表示します。

次に、カスタムの戻り値の型を使用して、複数の関数ベースのプロパティを生成する単一の関数を作成する、より高度な例を見ていきます。カスタム型について詳しくはこちら。単一の関数で複数の関数ベースのプロパティを返す方法には、パフォーマンスの向上や、関連する派生プロパティのコードをより明確に整理できることなど、いくつかの利点があります。
この例では、ObjectSet<FlightAlerts> を受け取り、Departure Airport リンクをたどってリンクされた Airport オブジェクトを取得し、そのリンクされた Airport オブジェクトから3個のプロパティを返す関数を使用します。これにより、オブジェクトテーブルに表示されるデータに、リンクされたオブジェクトタイプの関連情報が追加されます。
これを実現するには、まず、この関数内で使用するカスタム型を定義します。たとえば、次のように定義できます。
Copied!1 2 3 4 5interface LinkedDepartureAirportProperties { airport: string; city: string; country: string; }
Copied!1 2 3 4 5interface LinkedDepartureAirportProperties { airport: string; city: string; country: string; }
Copied!1 2 3 4 5 6 7from dataclasses import dataclass @dataclass class LinkedDepartureAirportProperties: airport: str city: str country: str
次に、このカスタム型を使用して、Airport、City、Country の3列の関数ベースの列を返す関数を記述します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32import { Function, FunctionsMap } from "@foundry/functions-api"; import { AirportObject, FlightAlertWorkshopTutorial, ObjectSet } from "@foundry/ontology-api"; export class MyFunctions { @Function() public getColumnsFromLinkedDepartureAirport(flightAlerts: ObjectSet<FlightAlertWorkshopTutorial>): FunctionsMap<FlightAlertWorkshopTutorial, LinkedDepartureAirportProperties> { // リンクされたすべての空港を取得し、iata をキーにして辞書に格納します const iataToAirport: { [iata: string]: AirportObject } = {}; flightAlerts.searchAroundDepartureAirport().all().forEach(airport => { iataToAirport[airport.iata!] = airport; }); const map = new FunctionsMap<FlightAlertWorkshopTutorial, LinkedDepartureAirportProperties>(); flightAlerts.all().forEach(alert => { // このアラートに対応する空港を取得します const airport = iataToAirport[alert.departureAirportCode!]; // 空港が見つからない場合はスキップします if (!airport) { return; } map.set(alert, { airport: airport.airport!, city: airport.city!, country: airport.country!, }); }); return map; } }
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32import { ObjectSet, ObjectSpecifier, Osdk } from "@osdk/client"; import { AirportObject, FlightAlertWorkshopTutorial } from "@ontology/sdk"; async function getColumnsFromLinkedDepartureAirport( flightAlerts: ObjectSet<FlightAlertWorkshopTutorial> ): Promise<Record<ObjectSpecifier<FlightAlertWorkshopTutorial>, LinkedDepartureAirportProperties>> { // リンクされたすべての空港を取得し、iata をキーにして辞書に格納します const iataToAirport: { [iata: string]: Osdk.Instance<AirportObject, never, "iata" | "airport" | "city" | "country"> } = {}; for await(const airport of flightAlerts.pivotTo("departureAirport").asyncIter({"$select": ["iata", "airport", "city", "country"]})) { iataToAirport[airport.iata!] = airport; } const map: Record<ObjectSpecifier<FlightAlertWorkshopTutorial>, LinkedDepartureAirportProperties> = {}; for await(const alert of flightAlerts.asyncIter({"$select": ["departureAirportCode"]})) { // このアラートに対応する空港を取得します const airport = iataToAirport[alert.departureAirportCode!]; // 空港が見つからない場合はスキップします if (!airport) { continue; } map[alert.$objectSpecifier] = { airport: airport.airport!, city: airport.city!, country: airport.country!, }; } return map; } export default getColumnsFromLinkedDepartureAirport;
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28from functions.api import function from ontology_sdk.ontology.objects import AirportObject, FlightAlertWorkshopTutorial from ontology_sdk.ontology.object_sets import FlightAlertWorkshopTutorialObjectSet @function def get_columns_from_linked_departure_airport( flight_alerts: FlightAlertWorkshopTutorialObjectSet, ) -> dict[FlightAlertWorkshopTutorial, LinkedDepartureAirportProperties]: # リンクされたすべての空港を取得し、iata をキーにして辞書に格納します iata_to_airport: dict[str, AirportObject] = {} for airport in flight_alerts.search_around_departure_airport().iterate(): iata_to_airport[airport.iata] = airport result: dict[FlightAlertWorkshopTutorial, LinkedDepartureAirportProperties] = {} for alert in flight_alerts.iterate(): # このアラートに対応する空港を取得します airport = iata_to_airport.get(alert.departure_airport_code) # 空港が見つからない場合はスキップします if airport is None: continue result[alert] = LinkedDepartureAirportProperties( airport=airport.airport, city=airport.city, country=airport.country, ) return result
上記の関数を公開すると、Workshop 内で派生列を追加するために使用できます。前のセクションと同様に、Flight Alert オブジェクトを含むオブジェクトテーブルウィジェットに、新しい関数ベースのプロパティ列を追加します。
列一覧に表示される新しい列で、fx アイコンを選択し、派生列の基になる関数を選択します。この例では、このチュートリアルで先ほど定義した getColumnsFromLinkedDepartureAirport 関数を選択します。

次に、選択した関数の入力パラメーターを設定します。この例では、関数は flightAlerts という名前の Flight Alert オブジェクトのオブジェクトセットを、単一の入力パラメーターとして受け取ります。実行時入力を使用を選択すると、オブジェクトテーブルに現在表示されているオブジェクトのみが関数に渡され、パフォーマンスが向上します。もう一方の選択肢である変数入力を使用では、オブジェクトテーブルの元になる入力オブジェクトセット変数など、オブジェクトセット変数全体が渡されますが、パフォーマンスが低下する可能性があります。

上記のステップが完了すると、関数が正常に実行され、期待される3列の Departure Airport、Departure City、Departure Country がオブジェクトテーブル: に表示されるはずです。ここで作業を終えることも、列の表示名や列の順序を編集して、アプリケーション内での列の表示を改善することもできます。

ウィジェット設定パネルの列の設定セクションで関数ベースの列を追加した後、その下にあるデフォルトの並べ替えセクションで関数ベースの列を選択し、列の並べ替え方法を設定します。Workshop が関数ベースの列で並べ替えを行う場合、テーブル内のすべての行で関数の実行が完了するまで待ってから、データを表示します。
時系列変換で生成されたデータを含む時系列プロパティは、オブジェクトテーブルで通常のプロパティと並べて表示できます。時系列プロパティは、タイムスタンプ付きの値の履歴を保存するオブジェクトプロパティです。詳細については、Workshop の時系列プロパティを参照してください。
以下の例では、Country オブジェクトに、国名を保存する通常の文字列プロパティ Name と、その国で観測された COVID-19 の新規感染者数の日別履歴を保存する時系列プロパティ New Cases があります。オブジェクトテーブルでは、この2個のプロパティが左側の最初の2列に表示され、時系列変換を使用して New Cases プロパティから派生した3個の時系列 Case Acceleration、Weekly Cases、Total Cases も表示されます。各時系列列には、左側に時系列の最新の観測が表示され、右側に時系列の履歴を可視化するスパークラインが表示されます。

オブジェクトテーブルで時系列プロパティの列を設定する方法を説明するため、Weekly Cases 列の設定手順を見ていきます。画面右側のパネルは、Weekly Cases 列の設定の上部と下部です。設定と結果をまとめて参照できるように、これらのパネルを列自体と同じ画面に並べています。

まず、時系列変換を使用して、COVID-19 の週間感染者数の時系列を生成する必要があります。時系列変換は、入力の時系列データに対して算術演算を実行し、新しい出力時系列を生成します。時系列変換の詳細については、Workshop の時系列プロパティを参照してください。
ここでは、集計変換を使用して必要な時系列を作成できます。変換を追加ボタンを押すと変換の設定が開き、必要な時系列を生成するように設定できます。

次に、時系列サマライザー(赤い枠)を使用して、列に表示する数値を生成できます。時系列サマライザーでは、時系列データの要約統計量、つまり時系列の状態を反映する値を設定します。ここでは、単一値サマライザーを使用して、表示したい値である直近の週平均感染者数を生成します。時系列サマライザーの詳細については、Workshop の時系列プロパティを参照してください。
その後、数値の書式設定見出しの下にある値の書式設定(青い枠)と、条件付き書式設定見出しの下にある条件付き書式設定(緑の枠)を設定して、この値の表示スタイルを指定できます。値の書式設定では数値の表示方法を制御し、条件付き書式設定では値に基づくルールシステムを使用して表示色を変更します。この場合は、コンパクト表記法を使用し、COVID-19 の週平均感染者数が100を超える場合に値を赤で表示します。値の書式設定と条件付き書式設定の詳細については、Workshop の書式設定を参照してください。

最後に、週平均感染者数の時系列の履歴を表示するスパークラインの可視化を設定できます。
期間セレクター(赤い枠)では、時系列を可視化する時間ウィンドウを指定できます。期間の詳細については、Workshop の時系列プロパティを参照してください。
また、条件付き書式設定見出しの下で条件付き書式設定(青い枠)を適用し、値に基づくルールシステムを使用してスパークラインの色を変更できます。条件付き書式設定の詳細については、Workshop の書式設定を参照してください。
最後に、スパークラインの解釈を補助するベースライン(緑の枠)を設定できます。ベースラインの設定の詳細については、Workshop の時系列プロパティを参照してください。

インライン編集を有効にすると、モジュールユーザーは Object Table 内に表示されるセルレベルのデータを変更し、その編集内容をオブジェクトデータに保存できます。編集オプションは、オントロジーで設定されたアクションによって定義されます。インライン編集に関するその他の考慮事項については、アクションのインライン編集のドキュメントを参照してください。インライン編集に対応するには、アクションが次の条件を満たす必要があります。
補足事項:
Object Table ウィジェットを設定すると、列の設定セクション内の列リストの下に、インライン編集を有効にするトグルが表示されます。このトグルを true に設定すると、インライン編集を有効にする設定が有効になり、表示されるオブジェクトタイプを変更するためにオントロジー内ですでに設定したアクションを選択するよう求められます。以下の例では、Flight Alert: Inline Editing アクションによってインライン編集が有効になっています。アクションピッカーの下では、表示されるドロップダウンメニューを使用して、アクションパラメーターをテーブルの列にマッピングします。また、変数をアクションパラメーターとして渡すこともできます。その場合、ユーザーがテーブル内の項目を編集しなくても、変数が自動的にアクションに渡されます。

上記の設定後、ユーザーはテーブルのフッターに表示されるテーブルを編集ボタンで編集モードに入ることができます。このボタンのテキストは、カスタムボタンのテキスト入力項目で編集できます。また、デフォルトで編集モードを有効にするオプションをオンにすると、テーブルを常にインライン編集モードにすることもできます。編集モードに入ると、以下に示すように、アクションパラメーターにマッピングされた変更可能な列をユーザーが編集できます。関数ベースのアクションでは一度に最大20行、関数ベースではないアクションでは一度に最大200行の編集をステージングできます。ステージングされた編集は、
元に戻すボタンで元に戻せます(以下のスクリーンショットでは、テーブルの左端の列に表示されています)。

編集を行い、変更を確定する準備ができたら、テーブルの右下隅にある確定ボタンを押します。確認ダイアログが表示されるので、再度確定を押して変更を確定します。ワンクリックで確定し、この確認ダイアログを無効にするには、ワンクリック確定トグルを有効にします。
右クリックメニューにカスタムの行の操作を追加すると、ユーザーはオブジェクトテーブルで右クリックしたオブジェクトに対して、アクションやイベントを実行できます。
右クリックメニューにカスタムの行の操作を追加するには、右クリックメニューセクション内の右クリックメニューのカスタマイズトグルを有効にします。このトグルを true に設定すると、テーブル内で現在右クリックされているオブジェクトを出力する「右クリックされたオブジェクト」を作成するよう求められます。その後、項目を追加を選択して、メニューにカスタム項目を追加できます。

項目を追加を選択すると、新しいメニューが表示され(以下のスクリーンショットを参照)、右クリックメニュー内でのメニュー項目の表示方法をカスタマイズできます。また、クリック時ドロップダウンメニューから選択肢を選んで、メニュー項目にアクションを割り当てることもできます。これにより、メニュー項目がアクションとイベントのどちらをトリガーするかを選択できます。さらに、先ほど設定した「右クリックされたオブジェクト」をアクションやイベント内で使用できます。

設定後、Object Table の行を右クリックすると、変更内容が表示されます。
