Anypoint DataGraph でのオブジェクト種別のマージのしくみ

API スキーマのオブジェクト種別を、統合スキーマの別のオブジェクト種別か、同じ API スキーマの別のオブジェクト種別のいずれかにマージできます。種別のマージにより、類似の種別を 1 つの種別に結合して項目やデータセットを拡張し、クエリ結果を向上させることができます。

オブジェクト種別は他のオブジェクト種別にのみマージできます。​拡張マージ​では種別のマージによってデータが結合され、​複合マージ​では種別のマージによって統合スキーマが整理されますが、この場合は主キーなしで結合されます。

Anypoint DataGraph では、マージを設定する種別を​現在の種別​、マージ先の種別を​対象種別​とします。

コラボレーションが有効な 2 つの種別のマージ

現在の種別をコラボレーションが有効になっている対象種別にマージできます。両方の種別が主キーを指定している場合は、両方の主キーが同じオブジェクトを表し、そのオブジェクトの同じレコードを識別することを確認します。拡張マージと呼ばれるこの種のマージでは、両方のオブジェクト種別から同じデータセットが返されます。

たとえば、デフォルトの ​customersById(id)​ クエリメソッドと ​id​ 主キーを使用して ​Customer​ 種別を返す Customer API スキーマがあるとします。

customersById(id): Customer
--------------------
--------------------
Customer
--------------------
id: string!
email:
firstName:
lastName:
telephone:

また、​User​ 種別がある ​UserAccount​ という API スキーマもあります。

usersById(id): User
--------------------
--------------------
User
--------------------
id:
email:
address: Address
accountId:
type:
organization:
--------------------
--------------------
Address
--------------------
addressLine1:
addressLine2:
city:
postalCode:
state:
country:

Customer 種別と User 種別の両方が同じオブジェクト種別を参照し、その同じオブジェクトの同じ情報を返すとします。主キーの値を同じにするには、両方の種別が同じ Customer オブジェクトを識別する必要があります。さらに、両方の種別に共通する項目も、同じ値を返す必要があります。たとえば、​Customer​ 種別の ​id = 1​ と ​User​ 種別の ​id = 1​ の場合、メール項目の値がまったく同じでなければなりません。

この 2 つの種別をマージすると、同じ顧客に関するデータが結合され、1 回の要求で照合できます。

また、どちらの種別にも、同じオブジェクトを取得するデフォルトのクエリメソッドが設定されているため、この 2 つの種別をマージして、統合スキーマに結合されたクエリメソッドと種別が 1 つだけ存在するようにすることも可能です。

  • Customer 種別

    • デフォルトのクエリメソッド: customersById(id): Customer

    • 主キー: id

  • UserAccount 種別:

    • デフォルトのクエリメソッド: usersById(id): User

    • 主キー: id

この結果、統合スキーマにマージされ、拡張された種別が 1 つ存在することになります。

マージ後の種別の順序

統合スキーマに最初に追加された種別が、マージ後の種別と対応するデフォルトのクエリメソッドの名前を優先的に定義します。

この例では、Customer API の種別が最初に追加されたため、統合スキーマに生成された種別は ​Customer​ という名前になり、Customer 種別と UserAccount 種別の両方のすべての項目が含まれます。生成されたクエリメソッドは ​customersById​ という名前で、マージされた ​Customer​ 種別を返します。

customersById(id): Customer
--------------------
--------------------
Customer
--------------------
id: string!
email:
firstName:
lastName:
telephone:
address: Address
accountId:
type:
organization:
--------------------
--------------------
Address
--------------------
addressLine1:
addressLine2:
city:
postalCode:
state:
country:

一方のコラボレーションのみが有効になっている 2 つの種別のマージ

2 つの種別の一方のコラボレーションのみが有効になっている場合でもマージできます。この種のマージでは、現在の種別 (マージを設定する種別) が対象種別 (マージ先の種別) への​参照​として機能します。マージを実行するためには、対象種別のコラボレーションが有効になっている必要があり、また、両方の種別が 1 つの主キーを定義するか、​複合キー​を使用する必要があります。

マージが完了すると、参照が宣言され、対象種別の項目のみを取得できます。現在の種別の主キー以外の項目は非表示になり、照会できません。

たとえば、​Product​ 種別を返す ​Order​ API スキーマがあるとします。

ordersById(id: string!) : Order
Order
----------
id: string!
amount: float!
date: string!
product: Product
-----------
-----------
Product
-----------
id: string!
name: string
------------

Product API Schema​ も ​Product​ 種別を返します。

productsById(id: string!) : Product
Product
------------
id: string!
name: string
brand: string
description: string
unitPrice: float!
quantityRemaining: int!
-----------

Order API スキーマの Product 種別を Product API スキーマの Product 種別にマージできます。この場合、Order API スキーマの Product 種別が Product API スキーマの Product 種別の参照になります。

マージ後の統合スキーマは次のようになります。

ordersById(id: string!) : Order
productsById(id: string!) : Product
Order
----------
id: string!
amount: float!
date: string!
product: Product
-----------
-----------
Product
-----------
id: string!
name: string
brand: string
description: string
unitPrice: float!
quantityRemaining: int!
-----------

Order​ 種別によって関連する商品のより多くのデータが返されるようになり、別のクエリを作成する必要がありません。

この例では、どちらの種別も主キーが ​id​ で、どちらの API も、​id​ で同じ商品オブジェクトレコードを返します。

複合キーを使用する種別のマージ

マージする種別に、​複合キー​を使用するクエリメソッドを設定することもできます。

たとえば、同じ ​Order​ API スキーマが ​Product​ 種別を返すとします。

ordersById(id: string!) : Order
Order
----------
id: string!
amount: float!
date: string!
product: Product
-----------
-----------
Product
-----------
id: string!
name: string
sku: string
------------

他方、​SalesOrder​ API は ​Product​ 種別を返しますが、​id​ と ​sku​ の複合キーを使用します。

SalesOrder(id: string!, sku: string!) : SalesOrder
Product
------------
id: string!
sku: string!
name: string
brand: string
description: string
unitPrice: float!
quantityRemaining: int!
-----------

マージ後の統合スキーマは次のようになります。

ordersById(id: string!, sku: string!) : Order
SalesOrderByID(id: string!, sku: string!) : SalesOrder
Order
----------
id: string!
amount: float!
date: string!
product: Product
-----------
-----------
Product
-----------
id: string!
sku: string!
name: string
brand: string
description: string
unitPrice: float!
quantityRemaining: int!
-----------

主キーが設定されていない 2 つの種別のマージ

マージする 2 つの種別のいずれにも主キーが定義されていない場合は、複合マージが行われます。このマージ方法では、デフォルトのクエリメソッドも主キーも指定する必要がありません。

どちらの種別にも主キーがないため、マージした場合、種別から返されるデータセットが結合されるのではなく、両方の種別が 1 つの種別に結合されます。このマージでは、同じオブジェクトを参照せず、項目を結合します。現在の種別と対象種別をマージすると、現在の種別のすべての項目が統合スキーマで null 可能になります。このマージによる種別のクエリ結果への影響はありませんが、重複する種別によって返されるデータセットが異なる場合に統合スキーマが整理されます。

たとえば、​Amount​ 種別を返す ​Europe Sales API Schema​ があるとします。

Europe Sales API スキーマ
Amount
----------
currency: String
price: float

North America API Schema​ も ​Amount​ 種別を返します。

North America API スキーマ
Amount
----------
currency: String
price: float

この 2 つをマージすると、統合スキーマには、クエリに応じて Europe Sales API と North America Sales API のいずれかから返される ​Amount​ 種別が 1 つのみ存在します。この 2 つの種別は似ていますが、データセットが結合されていません。

入力種別のマージ

入力種別は、変異を実行するときに統合スキーマの情報を変更するために使用する POST、PUT、および DELETE オブジェクトです。

すべての項目が一致する場合にのみ、2 つの入力種別をマージできます。両方の種別に同じ数の項目が必要であり、項目のサブセットを含めることはできません。

たとえば、次の同一の項目を含む ​OrderInput​ API と ​PurchaseInput​ API があるとします。

OrderInput
----------
orderId: String!
customerEmail: String!
customerId: String!
OrderDate: String!
product: Product
Status: OrderStatus
totalAmount: float

統合スキーマで ​OrderInput​ API を ​PurchaseInput​ API にマージして、これらの種別を統合できます。

入力種別をマージするために、コラボレーションを有効にする必要はなく、有効にすることもできません。

同じ API スキーマのオブジェクト間のローカルマージ

オブジェクト種別を同じ API スキーマの別のオブジェクト種別にマージする場合はローカルマージが行われます。生成されたこの種別を、ローカルの別のオブジェクト種別や統合スキーマの種別にマージすることもできます。

ローカルマージ後は、マージによって生成された種別のみを表示して編集できます。さらに、種別のコラボレーションを有効または無効にすることや、そのデフォルトのクエリメソッドや主キーを変更することはできません。オブジェクト種別や項目の名前変更、オブジェクト種別や項目の非表示、別のオブジェクト種別とのマージやリンクは実行できます。

ローカルマージの項目の表示

共通の項目がある 2 つのオブジェクト種別をローカルマージするときに、これらの項目の表示が異なる場合、ローカルでマージされた種別の項目の表示は次のようになります。

シナリオ 種別 A の項目 種別 B の項目 マージされた種別 (ローカル)

1

非表示

非表示

非表示

2

非表示

表示

表示

3

表示

非表示

表示

4

表示

表示

表示