From 3e9c0e43cf9a24cbfc7e8800d52c0dddc950948f Mon Sep 17 00:00:00 2001 From: Joerg Beckert Date: Sun, 24 Feb 2019 12:22:34 -0800 Subject: [PATCH] Use campaign-experienceevent to define the mixin-class-relationship between experience and decision events. The mixin now also includes decisionevent as a class that can add the union of campaign mixins to decisioning events On the other hand decisionevent now only needs to mix in the aggregated campaign-experienceevent and decision event will get the same union of mixin properties as before (see decisionevent.example.1.json to illustrate this) Break up proposition schema into the definitions it contained, proposition and proposition-detail. proposition-metrics is now an optional part of proposition-detail. It does not need to be its own schema component. Corrected a number of examples that didn't validate against their schemas --- .../campaign-experienceevent.example.1.json | 4 +- .../campaign-experienceevent.schema.json | 9 ++- .../campaign/experienceevent-all.schema.json | 8 +-- .../experienceevent.example.click.json | 16 ++++- .../experienceevent.example.email-send.json | 4 +- .../experienceevent.example.open-push.json | 4 +- .../experienceevent.example.sms-bounce.json | 4 +- .../decisioning/decisionevent.example.1.json | 36 ++++++++-- .../decisioning/decisionevent.schema.json | 49 ++----------- ...ienceevent-with-proposition.example.1.json | 10 +-- ...json => proposition-detail.example.1.json} | 0 ...json => proposition-detail.example.2.json} | 6 +- .../proposition-detail.schema.json | 68 +++++++++++++++++++ .../decisioning/proposition.schema.json | 55 +-------------- 14 files changed, 148 insertions(+), 125 deletions(-) rename extensions/adobe/experience/decisioning/{proposition.example.1.json => proposition-detail.example.1.json} (100%) rename extensions/adobe/experience/decisioning/{proposition.example.2.json => proposition-detail.example.2.json} (78%) create mode 100644 extensions/adobe/experience/decisioning/proposition-detail.schema.json diff --git a/extensions/adobe/experience/campaign-experienceevent.example.1.json b/extensions/adobe/experience/campaign-experienceevent.example.1.json index 656bd793fc..a4d748bc1e 100644 --- a/extensions/adobe/experience/campaign-experienceevent.example.1.json +++ b/extensions/adobe/experience/campaign-experienceevent.example.1.json @@ -24,7 +24,9 @@ "xdm:value": 1 } }, - "xdm:channel": "https://ns.adobe.com/xdm/channels/email", + "xdm:channel": { + "@id": "https://ns.adobe.com/xdm/channels/email" + }, "https://ns.adobe.com/experience/campaign/message": { "xdm:id": 10000, "xdm:profile": { diff --git a/extensions/adobe/experience/campaign-experienceevent.schema.json b/extensions/adobe/experience/campaign-experienceevent.schema.json index b9c8134d51..9312071d8e 100644 --- a/extensions/adobe/experience/campaign-experienceevent.schema.json +++ b/extensions/adobe/experience/campaign-experienceevent.schema.json @@ -12,7 +12,10 @@ "description": "Campaign ExperienceEvent Mixin for use with Schemas for Solution data ingestion. Includes the core/standard ExperienceEvent as well as the required Adobe Campaign ExperienceEvent Mixins.", "meta:extensible": true, "meta:abstract": true, - "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/experienceevent"], + "meta:intendedToExtend": [ + "https://ns.adobe.com/xdm/context/experienceevent", + "https://ns.adobe.com/experience/decisioning/decisionevent" + ], "meta:extends": [ "https://ns.adobe.com/xdm/context/experienceevent-advertising", "https://ns.adobe.com/xdm/context/experienceevent-application", @@ -28,6 +31,7 @@ "https://ns.adobe.com/xdm/context/experienceevent-technical-details", "https://ns.adobe.com/xdm/context/experienceevent-web", "https://ns.adobe.com/experience/campaign/experienceevent-all", + "https://ns.adobe.com/experience/decisioning/proposition", "https://ns.adobe.com/experience/target/experienceevent-shared", "https://ns.adobe.com/experience/profile/experienceevent-shared", "https://ns.adobe.com/experience/implementations-ext", @@ -84,6 +88,9 @@ { "$ref": "https://ns.adobe.com/experience/campaign/experienceevent-all" }, + { + "$ref": "https://ns.adobe.com/experience/decisioning/proposition" + }, { "$ref": "https://ns.adobe.com/experience/target/experienceevent-shared" }, diff --git a/extensions/adobe/experience/campaign/experienceevent-all.schema.json b/extensions/adobe/experience/campaign/experienceevent-all.schema.json index 73dad72e40..09ecd45c60 100755 --- a/extensions/adobe/experience/campaign/experienceevent-all.schema.json +++ b/extensions/adobe/experience/campaign/experienceevent-all.schema.json @@ -12,9 +12,6 @@ "meta:extensible": true, "meta:abstract": true, "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/experienceevent"], - "meta:extends": [ - "https://ns.adobe.com/experience/decisioning/proposition#/definitions/propositions-mixin" - ], "description": "Adobe Campaign ExperienceEvent Full Extension. Contains all Solution added fields.", "definitions": { "campaign-experienceevent-all": { @@ -281,7 +278,7 @@ "https://ns.adobe.com/experience/campaign/offerClicked": { "title": "Offer Clicked", "description": "The offer in the message for a clicked event to an offer.", - "$ref": "https://ns.adobe.com/experience/decisioning/proposition#/definitions/proposition-detail-datatype" + "$ref": "https://ns.adobe.com/experience/decisioning/proposition-detail" } } }, @@ -299,9 +296,6 @@ { "$ref": "#/definitions/campaign-experienceevent-all" }, - { - "$ref": "https://ns.adobe.com/experience/decisioning/proposition#/definitions/propositions-mixin" - }, { "$ref": "#/definitions/mutation" } diff --git a/extensions/adobe/experience/campaign/experienceevent.example.click.json b/extensions/adobe/experience/campaign/experienceevent.example.click.json index ae9d8dc5cb..ef98077bb2 100644 --- a/extensions/adobe/experience/campaign/experienceevent.example.click.json +++ b/extensions/adobe/experience/campaign/experienceevent.example.click.json @@ -5,7 +5,9 @@ "xdm:value": 1 } }, - "xdm:channel": "https://ns.adobe.com/xdm/channels/email", + "xdm:channel": { + "@id": "https://ns.adobe.com/xdm/channels/email" + }, "xdm:endUserIDs": { "https://ns.adobe.com/experience/mcid": { "xdm:id": "92312748749128", @@ -82,5 +84,15 @@ "https://ns.adobe.com/experience/campaign/orchestration": { "xdm:eventID": "store-entry-beacon-triggered" }, - "https://ns.adobe.com/experience/campaign/eventSource": "pipelined-trackinglogd" + "https://ns.adobe.com/experience/campaign/eventSource": "pipelined-trackinglogd", + "https://ns.adobe.com/experience/campaign/offerClicked": { + "xdm:activity": { + "@id": "xcore:offer-activity:ebc48132c26ccfc" + }, + "xdm:selections": [ + { + "@id": "xcore:personalized-offer:e526a1503bf29e9" + } + ] + } } diff --git a/extensions/adobe/experience/campaign/experienceevent.example.email-send.json b/extensions/adobe/experience/campaign/experienceevent.example.email-send.json index ff10d02a54..825e0fde66 100644 --- a/extensions/adobe/experience/campaign/experienceevent.example.email-send.json +++ b/extensions/adobe/experience/campaign/experienceevent.example.email-send.json @@ -5,7 +5,9 @@ "xdm:value": 1 } }, - "xdm:channel": "https://ns.adobe.com/xdm/channels/email", + "xdm:channel": { + "@id": "https://ns.adobe.com/xdm/channels/email" + }, "xdm:endUserIDs": { "https://ns.adobe.com/experience/mcid": { "@id": "https://data.adobe.io/entities/identity/92312748749128", diff --git a/extensions/adobe/experience/campaign/experienceevent.example.open-push.json b/extensions/adobe/experience/campaign/experienceevent.example.open-push.json index adc66b151f..8bb4831f18 100644 --- a/extensions/adobe/experience/campaign/experienceevent.example.open-push.json +++ b/extensions/adobe/experience/campaign/experienceevent.example.open-push.json @@ -5,7 +5,9 @@ "xdm:value": 1 } }, - "xdm:channel": "https://ns.adobe.com/xdm/channels/apns", + "xdm:channel": { + "@id": "https://ns.adobe.com/xdm/channels/email" + }, "xdm:endUserIDs": { "https://ns.adobe.com/experience/mcid": { "@id": "https://data.adobe.io/entities/identity/92312748749128", diff --git a/extensions/adobe/experience/campaign/experienceevent.example.sms-bounce.json b/extensions/adobe/experience/campaign/experienceevent.example.sms-bounce.json index 1e3dca0062..09954fc70b 100644 --- a/extensions/adobe/experience/campaign/experienceevent.example.sms-bounce.json +++ b/extensions/adobe/experience/campaign/experienceevent.example.sms-bounce.json @@ -5,7 +5,9 @@ "xdm:value": 1 } }, - "xdm:channel": "https://ns.adobe.com/xdm/channels/sms", + "xdm:channel": { + "@id": "https://ns.adobe.com/xdm/channels/email" + }, "xdm:endUserIDs": { "https://ns.adobe.com/experience/mcid": { "@id": "https://data.adobe.io/entities/identity/92312748749128", diff --git a/extensions/adobe/experience/decisioning/decisionevent.example.1.json b/extensions/adobe/experience/decisioning/decisionevent.example.1.json index 7d342c9193..daa0c02cb7 100644 --- a/extensions/adobe/experience/decisioning/decisionevent.example.1.json +++ b/extensions/adobe/experience/decisioning/decisionevent.example.1.json @@ -6,6 +6,24 @@ { "xdm:id": "https://data.adobe.io/entities/identity/49312748749132" } ] }, + "xdm:device": { + "xdm:typeID": "IMac", + "xdm:typeIDService": "https://ns.adobe.com/xdm/external/adobecampaign", + "xdm:type": "desktop", + "xdm:manufacturer": "Apple" + }, + "xdm:placeContext": { + "xdm:localTime": "2017-09-26T15:52:25+13:00", + "xdm:geo": { + "@id": "https://data.adobe.io/entities/geo/tokyo", + "xdm:countryCode": "JP", + "xdm:stateProvince": "JP-13", + "xdm:city": "Tōkyō", + "xdm:postalCode": "141-0032", + "schema:latitude": 35.6185, + "schema:longitude": 139.73237 + } + }, "https://ns.adobe.com/experience/decisioning/propositionId": "3cc33a7e-13ca-4b19-b25d-c816eff9a70a", "https://ns.adobe.com/experience/decisioning/propositionDetails": [ { @@ -27,13 +45,21 @@ "xdm:activity": { "@id": "xcore:offer-activity:f203512e02542b5" }, - "xdm:fallback": [ - { + "xdm:fallback": { "@id": "xcore:fallback-offer:e91ce7243fd8c2a" - } - ] + } } ], "https://ns.adobe.com/adobecloudplatform/ims/organizationId": "0D8E32C65A8A91520A494008@AdobeOrg", - "https://ns.adobe.com/experience/decisioning/containerId": "c75afa32-371f-4895-8f43-b853dd9fe740" + "https://ns.adobe.com/experience/decisioning/containerId": "c75afa32-371f-4895-8f43-b853dd9fe740", + "https://ns.adobe.com/experience/campaign/offerClicked": { + "xdm:activity": { + "@id": "xcore:offer-activity:f3f13bfccb4da6e" + }, + "xdm:selections": [ + { + "@id": "xcore:personalized-offer:f3e4b72eb3808e9" + } + ] + } } diff --git a/extensions/adobe/experience/decisioning/decisionevent.schema.json b/extensions/adobe/experience/decisioning/decisionevent.schema.json index c91e915524..21d1c22c85 100644 --- a/extensions/adobe/experience/decisioning/decisionevent.schema.json +++ b/extensions/adobe/experience/decisioning/decisionevent.schema.json @@ -15,20 +15,9 @@ "meta:extends": [ "https://ns.adobe.com/xdm/data/time-series", - "https://ns.adobe.com/experience/decisioning/proposition#/definitions/propositions-mixin", - + "https://ns.adobe.com/experience/decisioning/proposition", "https://ns.adobe.com/xdm/context/identitymap", - "https://ns.adobe.com/xdm/context/experienceevent-advertising", - "https://ns.adobe.com/xdm/context/experienceevent-application", - "https://ns.adobe.com/xdm/context/experienceevent-channel", - "https://ns.adobe.com/xdm/context/experienceevent-commerce", - "https://ns.adobe.com/xdm/context/experienceevent-directmarketing", - "https://ns.adobe.com/xdm/context/experienceevent-environment-details", - "https://ns.adobe.com/xdm/context/experienceevent-marketing", - "https://ns.adobe.com/xdm/context/experienceevent-media", - "https://ns.adobe.com/xdm/context/experienceevent-search", - "https://ns.adobe.com/xdm/context/experienceevent-segmentmembership", - "https://ns.adobe.com/xdm/context/experienceevent-web" + "https://ns.adobe.com/experience/campaign-experienceevent" ], "definitions": { "decisionevent": { @@ -62,43 +51,13 @@ "$ref": "#/definitions/decisionevent" }, { - "$ref": "https://ns.adobe.com/experience/decisioning/proposition#/definitions/propositions-mixin" + "$ref": "https://ns.adobe.com/experience/decisioning/proposition" }, { "$ref": "https://ns.adobe.com/xdm/context/identitymap" }, { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-advertising" - }, - { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-application" - }, - { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-channel" - }, - { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-commerce" - }, - { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-directmarketing" - }, - { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-environment-details" - }, - { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-marketing" - }, - { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-media" - }, - { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-search" - }, - { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-segmentmembership" - }, - { - "$ref": "https://ns.adobe.com/xdm/context/experienceevent-web" + "$ref": "https://ns.adobe.com/experience/campaign-experienceevent" }, { "required": [ diff --git a/extensions/adobe/experience/decisioning/experienceevent-with-proposition.example.1.json b/extensions/adobe/experience/decisioning/experienceevent-with-proposition.example.1.json index 6ed425078d..e6c0257866 100644 --- a/extensions/adobe/experience/decisioning/experienceevent-with-proposition.example.1.json +++ b/extensions/adobe/experience/decisioning/experienceevent-with-proposition.example.1.json @@ -24,7 +24,9 @@ "xdm:value": 1 } }, - "xdm:channel": "https://ns.adobe.com/xdm/channels/email", + "xdm:channel": { + "@id": "https://ns.adobe.com/xdm/channels/email" + }, "https://ns.adobe.com/experience/campaign/message": { "xdm:id": 10000, "xdm:profile": { @@ -106,11 +108,9 @@ "xdm:filter": "xcore:offer-filter:ec5139e1a351772", "schema:name": "Sessions" }, - "xdm:fallback": [ - { + "xdm:fallback": { "@id": "xcore:fallback-offer:e91ce7243fd8c2a" - } - ] + } } ] } diff --git a/extensions/adobe/experience/decisioning/proposition.example.1.json b/extensions/adobe/experience/decisioning/proposition-detail.example.1.json similarity index 100% rename from extensions/adobe/experience/decisioning/proposition.example.1.json rename to extensions/adobe/experience/decisioning/proposition-detail.example.1.json diff --git a/extensions/adobe/experience/decisioning/proposition.example.2.json b/extensions/adobe/experience/decisioning/proposition-detail.example.2.json similarity index 78% rename from extensions/adobe/experience/decisioning/proposition.example.2.json rename to extensions/adobe/experience/decisioning/proposition-detail.example.2.json index cf7f974d16..5d17c1bba8 100644 --- a/extensions/adobe/experience/decisioning/proposition.example.2.json +++ b/extensions/adobe/experience/decisioning/proposition-detail.example.2.json @@ -2,9 +2,7 @@ "xdm:activity": { "@id": "xcore:offer-activity:f203512e02542b5" }, - "xdm:fallback": [ - { + "xdm:fallback": { "@id": "xcore:fallback-offer:e91ce7243fd8c2a" - } - ] + } } diff --git a/extensions/adobe/experience/decisioning/proposition-detail.schema.json b/extensions/adobe/experience/decisioning/proposition-detail.schema.json new file mode 100644 index 0000000000..b0ca8f878f --- /dev/null +++ b/extensions/adobe/experience/decisioning/proposition-detail.schema.json @@ -0,0 +1,68 @@ +{ + "meta:license": [ + "Copyright 2019 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$id": "https://ns.adobe.com/experience/decisioning/proposition-detail", + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Decision Proposition", + "type": "object", + "meta:abstract": true, + "meta:extensible": true, + "description": "The Decision Proposition XDM is used to capture the outcome of a decisioning process", + "definitions": { + "proposition-detail-datatype": { + "properties": { + "xdm:activity": { + "title": "Decision Activity", + "description": "Snapshot of the activity for which the proposition was made. The object contains at least the @id property value which is the URI of the decision activity. See schema https://ns.adobe.com/experience/decisioning/activity", + "$ref": "https://ns.adobe.com/xdm/data/record" + }, + "xdm:selections": { + "title": "Selected Options", + "description": "Snapshots of the options that were selected for this activity. Those options are ususally constrained. The objects contain a at least the @id property value which is the URI of an option. See schema https://ns.adobe.com/experience/decisioning/option", + "type": "array", + "items": { + "$ref": "https://ns.adobe.com/xdm/data/record" + }, + "minItems": 1, + "uniqueItems": true + }, + "xdm:fallback": { + "title": "Fallback Option", + "description": "Snapshot of the fixed fallback option that was selected because no available option satisfied all constaints. The object contains at least the @id property value which is the URI of the fallback action. See schema https://ns.adobe.com/experience/decisioning/fallback-option", + "$ref": "https://ns.adobe.com/xdm/data/record" + }, + "xdm:metrics": { + "title": "Metrics", + "description": "Additional measurements observed while the decision was made and which provided context to the decision process.", + "$ref": "https://ns.adobe.com/experience/decisioning/eventmetrics" + } + } + } + }, + "allOf": [ + { + "$ref": "https://ns.adobe.com/xdm/common/extensible#/definitions/@context" + }, + { + "$ref": "#/definitions/proposition-detail-datatype" + }, + { + "required": ["xdm:activity"] + }, + { + "oneOf": [ + { + "required": ["xdm:selections"] + }, + { + "required": ["xdm:fallback"] + } + ] + } + ], + "meta:status": "experimental" +} diff --git a/extensions/adobe/experience/decisioning/proposition.schema.json b/extensions/adobe/experience/decisioning/proposition.schema.json index 645f0425d7..4637b33f7b 100644 --- a/extensions/adobe/experience/decisioning/proposition.schema.json +++ b/extensions/adobe/experience/decisioning/proposition.schema.json @@ -13,40 +13,7 @@ "meta:extensible": true, "description": "The Decision Proposition XDM is used to capture the outcome of a decisioning process", "definitions": { - "proposition-detail-datatype": { - "properties": { - "xdm:activity": { - "title": "Decision Activity", - "description": "Snapshot of the activity for which the proposition was made. The object contains at least the @id property value which is the URI of the decision activity. See schema https://ns.adobe.com/experience/decisioning/activity", - "$ref": "https://ns.adobe.com/xdm/data/record" - }, - "xdm:selections": { - "title": "Selected Options", - "description": "Snapshots of the options that were selected for this activity. Those options are ususally constrained. The objects contain a at least the @id property value which is the URI of an option. See schema https://ns.adobe.com/experience/decisioning/option", - "type": "array", - "items": { - "$ref": "https://ns.adobe.com/xdm/data/record" - }, - "minItems": 1, - "uniqueItems": true - }, - "xdm:fallback": { - "title": "Fallback Option", - "description": "Snapshot of the fixed fallback option that was selected because no available option satisfied all constaints. The object contains at least the @id property value which is the URI of the fallback action. See schema https://ns.adobe.com/experience/decisioning/fallback-option", - "$ref": "https://ns.adobe.com/xdm/data/record" - } - } - }, - "proposition-metrics-datatype": { - "properties": { - "xdm:metrics": { - "title": "Metrics", - "description": "Additional measurements observed while the decision was made and which provided context to the decision process.", - "$ref": "https://ns.adobe.com/experience/decisioning/eventmetrics" - } - } - }, - "propositions-mixin": { + "proposition-mixin": { "meta:intendedToExtend": [ "https://ns.adobe.com/xdm/context/experienceevent", "https://ns.adobe.com/experience/decisioning/decisionevent" @@ -61,7 +28,7 @@ "title": "Propopostion Array providing the outcomes of a single decision event, one outcome per given activity", "type": "array", "items": { - "$ref": "https://ns.adobe.com/experience/decisioning/proposition#/definitions/proposition-detail-datatype" + "$ref": "https://ns.adobe.com/experience/decisioning/proposition-detail" }, "description": "Details about the individual context variables and outcomes for the decision." } @@ -73,23 +40,7 @@ "$ref": "https://ns.adobe.com/xdm/common/extensible#/definitions/@context" }, { - "$ref": "#/definitions/proposition-detail-datatype" - }, - { - "required": ["xdm:activity"] - }, - { - "oneOf": [ - { - "required": ["xdm:selections"] - }, - { - "required": ["xdm:fallback"] - } - ] - }, - { - "$ref": "#/definitions/proposition-metrics-datatype" + "$ref": "#/definitions/proposition-mixin" } ], "meta:status": "experimental"