Purpose :
- Design for Experiment API's to populate,list,delete the experiment definition
- Design the experiment definition schema
- Design Data product to map the users/devices to experiments
Design Flow :
Experiment API :
CREATE API :
URL : POST /experiment/create
Input :
Sample User Criteria Input Request:
UserType Request Body
"request": { "expId": "U1234", // Unique Id for Experiment "name": "USER_ORG", // Name for Experiment "createdBy": "User1", // Name of the user who created this experiment "description": "Experiment to get users with orgname = sunbird", // Short Description about the experiment "criteria": { // Criteria for the Experiment "type": "user", // Type of the Criteria "filters": { // Array of Filters Criteria with User Filter field Name and List of Values "organisations.orgName": ["sunbird"] // List of Values } }, "data" : { // Experiment Data "startDate" : "2019-08-01", // Start date of the Experiment "endDate" : "2019-08-02", // End date of the Experiment "key" : "/org/profile", // Experiment Key "client" : "portal" // name of the client (app/portal/desktop) } }
Device Criteria Input Request:
DeviceType Criteria Request Body
"request": { "expId": "D1234", // Unique Id for Experiment "name": "Device_STATE_AP", // Name for Experiment "createdBy": "User2", // Name of the user who created this experiment "description": "Experiment to get devices with state = AndhraPradesh", // Short Description about the experiment "criteria": { // Criteria for the Experiment "type": "device", // Type of the Criteria "filters": { // Array of Filters "name": "state", // Name of the field "operator": "IN", // Filter Operator "value": ["Karnataka"] // List of Values } }, "data" : { // Experiment Data "startDate" : "2019-08-01", // Start date of the Experiment "endDate" : "2019-08-02", // End date of the Experiment "key" : "3fksjfksdlfj", // Experiment Key "client" : "app" // name of the client (app/portal/desktop) } }
Output :
- Process the request and save the request parameters to Experiment-Definition Cassandra Table with status "SUBMITTED"
- Response : "Experiment Submitted Sucessfully "
Note :
- All fields are mandatory
- Same Experiment will not be allowed to submit again unless the status of the experiment is FAILED
- If the experiment is submitted more than once , will send a response "Experiment already submitted"
GET API
URL : GET /experiment/:id
Request Params : ExperimentId
Repsonse : Experiment Details for the respective experiment Id
Sample Response :
Sample Get API ReSposne
{ "expId": "U1234", "expName": "USER_ORG", "expDescription": "Experiment to get users with orgname = sunbird", "expData": { "startDate": "2019-08-01", "endDate": "2019-08-04", "key": "/org/profile" }, "createdBy": "User1", "updatedBy": "ExperimentDataProduct", "udpatedOn": "2019-08-02 19:00:00", "createdOn": "2019-08-01 10:00:00", "criteria": { "type": "user", "filter": { "organisations.orgName": [ "sunbird" ] } }, "status": "active", "status_msg": "Experiment is actively mapped", "stats": { "usersMatched": 234, "devicesMatched": 0 } }
GET LIST API :
URL : GET /experiment/list
Output : List of all Experiments
Sample Response :
Experiment Definition Schema:
Field | type | Description | |
---|---|---|---|
1 | expId | String | unique id for experiment |
2 | expName | String | name of the experiment |
3 | expDescription | String | descirption of the experiment |
expData | Map<String,String> | Experiment Data
| |
5 | createdBy | String | name of the user who created the experiment |
6 | updatedBy | String | name of product that last updated the experiment |
7 | udpatedOn | Timestamp | last udpated date by the source |
8 | createdOn | Timestamp | created date for the experiment |
9 | criteria | Map<String,String> | criteria of the experiment
|
10 | status | String | status of the experiment(SUBMITTED/PROCESSING/ACTIVE/FAILED/STOPPED/INACTIVE) |
11 | status_message | String | status description of the experiment |
12 | stats | Map<String,Long> | Statistic Data
|
Experiment Data Product :
Purpose
- To compute the user/device experiment mapping based on the experiment criteria and save it to elastic search
Input:
- Experiment_Definition Cassandra Table
Output
User experiment mapping index to elastic search
Experiment Index
User Experiment : { "name" : "USER_ORG", "expType" : "user", "lastUpdatedOn" : "2019-07-30T00:00:00", "endDate" : "2019-07-28T00:00:00", "url" : null, "deviceIdMod" : 0, "key" : "2392438420", "id" : "A1234", "userIdMod" : 0, "userId" : "d5fd92df-2683-4357-8620-45bc0683f38c", "platform" : "portal", "deviceId" : null, "startDate" : "2019-07-25T00:00:00" } Device Experiment : { "name" : "DEVICE_LOCATION", "expType" : "device", "lastUpdatedOn" : "2019-07-30T00:00:00", "endDate" : "2019-08-30T00:00:00", "url" : null, "deviceIdMod" : 0, "key" : "4584583045489", "id" : "B1534", "userIdMod" : 0, "userId" : null, "platform" : "app", "deviceId" : "3f3da025f07f2d6e4ead9042710b8b78", "startDate" : "2019-07-29T00:00:00" }