compare recipients in two or more lists in a worklow

Kanwaljit

03-07-2017

Hi,

I have a workflow that needs to read two lists and compare their data. How can I do that ?

AFAIK, I can read a list in a javascript code but found no reference in documentation on how to compare it with another list.

/Regards

Kanwal

Accepted Solutions (1)

Accepted Solutions (1)

Amit_Kumar

MVP

04-07-2017

Yes, This is possible in js activity.

Step one: Load every list in js context(Which you have mentioned you already achieved)

Step two:  comparison Part, Write a js function to compare list based on recipient Id.

//Below example will work, front end dev will be able to help you here to make it better

/****************************************************************************************************************************************************************

  Purpose: To compare two objects based on their Ids

* Returns List of common Ids in both list

****************************************************************************************************************************************************************/

var getCommonIdsfromTwoLists = function(objectlistA, objectListB) {

//var commonList = <recipient-collection><recipient/></recipient-collection>;

//use above if you need a collection, willhave to populate from the commonList object using another loop

var commonList = {};

for each(var rowA in objectlistB.recipient){

logInfo("rowA: " + rowA.@id.toString());

for each(var rowB in objectlistA.recipient){

logInfo("rowB: " + rowB.@id.toString());

// use this when you have same structure in ListA and List B to compare

// JSON.stringify(objectlistA) === JSON.stringify(objectlistB)

//use below for all other cases

if( rowA.@id.toString() == rowB.@id.toString()){

commonList[rowA.@id.toString()] = rowA.toString();

continue;

}

}

}

}

  return commonList;

}

Step 3: use this function recursively to get common Items from lists or modify this to suit your requirements.

Hope this helps!
Regards,

Amit

Answers (4)

Answers (4)

Amit_Kumar

MVP

03-07-2017

Hi Kanwal,

If you want to compare the two lists, There can be multiple scenarios; I am going to assume that you are doing that for following cases:

  1. How many IDs are both in list A and B
  2. How many IDs are in A but not in B
  3. How many IDs are in B but not in A

Load your list in query or using file load activity, which allows you to manipulate them in workflow, Now choose your case for next step.

Case 1:

Use Intersection activity which allows you to keep only the elements common to the different inbound populations in the activity. This will give you common Ids in both lists.

Case 2:

Use Exclusion activity which is used to carry out additional filtering on inbound transition populations.

List A  will become primary set and List B becomes filtering set. List A and list B will be used as inbound transitions. Members of list B transitions will be excluded from the primary set. The outbound transition of the exclusion activity only contains the members of the primary set that were not encountered in the other inbound transitions.

Case 3:

Use Exclusion activity which is used to carry out additional filtering on inbound transition populations.

List B  will become primary set, and List A becomes filtering set. List A and list B will be used as inbound transitions. Members of list A transitions will be excluded from the primary set. The outbound transition of the exclusion activity only contains the members of the primary set that were not encountered in the other inbound transitions.

Hope this helps

Regards,

Amit

Kanwaljit

05-07-2017

Thanks Amit & Vipul,

Amit_Kumar , Vipul Raghav

This is super useful & would work great

After some more deliberation on design with factors that mentioned here and some new requirements that we unearthed in the interim, we've decided to move to a different approach.

Appreciate the feedback though

/Regards

Kanwal

Vapsy

Employee

04-07-2017

To add to the awesome response provided by Amit. Using JS to performing heavy processing can lead to exhaustion of allocated memory to JS interpreter.

There is a maxMB setting in serverConf.xml which by default is set to 64MB. So, if you are going to compare multiple lists with huge number of records, a good idea will be to get the maxMB increased to 512 MB.

If your instance is hosted by Adobe, please reach out to support for getting this done.

Regards,

VIpul

kanwalAdobe

03-07-2017

Thanks Amit,

I was wondering if there is a way to do it in a script.

I have a folder where input Lists will be available for workflow to read.

(Problem 1) : the actual number of lists is not fixed, so I can't use a union as union expects fixed set of lists in input.

(Problem 2) : There is a need to iterate over the list and apply exclusion on other lists based on specific the attributes values in the target population. AND do this to other lists

/Rgrds

Kanwal