diff --git a/MccColony/resources/queries/study/demographics/.qview.xml b/MccColony/resources/queries/study/demographics/.qview.xml
index a35d07baa..3bb77e21b 100644
--- a/MccColony/resources/queries/study/demographics/.qview.xml
+++ b/MccColony/resources/queries/study/demographics/.qview.xml
@@ -26,6 +26,7 @@
+
diff --git a/mGAP/src/org/labkey/mgap/columnTransforms/LuceneIndexTransform.java b/mGAP/src/org/labkey/mgap/columnTransforms/LuceneIndexTransform.java
index 35e9787db..55fb8c77e 100644
--- a/mGAP/src/org/labkey/mgap/columnTransforms/LuceneIndexTransform.java
+++ b/mGAP/src/org/labkey/mgap/columnTransforms/LuceneIndexTransform.java
@@ -1,14 +1,11 @@
package org.labkey.mgap.columnTransforms;
-import org.apache.commons.io.FileUtils;
import org.jetbrains.annotations.Nullable;
+import org.labkey.api.jbrowse.JBrowseService;
import org.labkey.api.pipeline.PipelineJobException;
-import org.labkey.api.sequenceanalysis.run.SimpleScriptWrapper;
import org.labkey.mgap.etl.EtlQueueManager;
import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
public class LuceneIndexTransform extends OutputFileTransform
{
@@ -27,6 +24,7 @@ protected File doFileCopy(File f, File subdir, @Nullable String name) throws Pip
// NOTE: lucene is a special case since the DB tracks one file, but we need this whole folder:
File sourceDir = f.getParentFile();
File targetDir = new File(subdir, "LuceneIndex");
+ JBrowseService.get().clearLuceneCacheEntry(targetDir);
EtlQueueManager.get().queueRsyncCopy(getContainerUser().getContainer(), sourceDir, targetDir);
return new File(targetDir, sourceDir.getName() + "/" + f.getName());
diff --git a/mGAP/src/org/labkey/mgap/pipeline/mGapSummarizer.java b/mGAP/src/org/labkey/mgap/pipeline/mGapSummarizer.java
index c27fc0794..ced520a20 100644
--- a/mGAP/src/org/labkey/mgap/pipeline/mGapSummarizer.java
+++ b/mGAP/src/org/labkey/mgap/pipeline/mGapSummarizer.java
@@ -174,7 +174,7 @@ private static class FieldData
public static void filterCodingPotential(Set codingPotential)
{
//due to overlapping transcripts, this is often added. remove these less-specific terms in order
- for (String type : Arrays.asList("intragenic_variant", "non_coding_transcript_variant", "intron_variant"))
+ for (String type : Arrays.asList("custom", "intergenic_variant", "intragenic_variant"))
{
if (codingPotential.size() > 1)
{
@@ -184,9 +184,8 @@ public static void filterCodingPotential(Set codingPotential)
if (codingPotential.contains("synonymous_variant") || codingPotential.contains("missense_variant"))
{
+ codingPotential.remove("intergenic_variant");
codingPotential.remove("intragenic_variant");
- codingPotential.remove("non_coding_transcript_variant");
- codingPotential.remove("intron_variant");
}
}
diff --git a/mcc/package-lock.json b/mcc/package-lock.json
index fa19fb024..6303d5198 100644
--- a/mcc/package-lock.json
+++ b/mcc/package-lock.json
@@ -4839,12 +4839,12 @@
}
},
"node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"dependencies": {
- "fill-range": "^7.0.1"
+ "fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
@@ -6509,9 +6509,9 @@
}
},
"node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
diff --git a/mcc/resources/etls/mcc.xml b/mcc/resources/etls/mcc.xml
index b4f41a9c4..70da9b5f3 100644
--- a/mcc/resources/etls/mcc.xml
+++ b/mcc/resources/etls/mcc.xml
@@ -38,7 +38,7 @@
objectid
-
+
@@ -56,7 +56,7 @@
objectid
-
+
@@ -72,7 +72,7 @@
objectid
-
+
@@ -89,7 +89,7 @@
objectid
-
+
@@ -106,7 +106,7 @@
objectid
-
+
@@ -127,7 +127,7 @@
marmosetsShipped
-
+
diff --git a/mcc/resources/queries/mcc/aggregatedDemographics.sql b/mcc/resources/queries/mcc/aggregatedDemographics.sql
index 4f481572f..39586b680 100644
--- a/mcc/resources/queries/mcc/aggregatedDemographics.sql
+++ b/mcc/resources/queries/mcc/aggregatedDemographics.sql
@@ -19,6 +19,7 @@ SELECT
WHEN d.calculated_status = 'Alive' AND (SELECT COUNT(f.flag.value) as total FROM "/data/Colonies/SNPRC/".study.flags f WHERE f.Id = d.Id AND f.isActive = true) > 0 THEN true
ELSE false
END as u24_status,
+ d.litterId,
d.Id.mostRecentDeparture.mostRecentDeparture,
o.availability,
o.current_housing_status,
@@ -67,6 +68,7 @@ SELECT
WHEN d.calculated_status = 'Alive' AND (SELECT COUNT(f.flag.value) as total FROM "/data/Colonies/WNPRC/".study.flags f WHERE f.Id = d.Id AND f.isActive = true) > 0 THEN true
ELSE false
END as u24_status,
+ d.litterId,
d.Id.mostRecentDeparture.mostRecentDeparture,
o.availability,
o.current_housing_status,
@@ -112,6 +114,7 @@ SELECT
d.objectid,
d.calculated_status,
d.u24_status,
+ d.litterId,
d.Id.mostRecentDeparture.mostRecentDeparture,
o.availability,
o.current_housing_status,
@@ -160,6 +163,7 @@ SELECT
d.objectid,
d.calculated_status,
d.u24_status,
+ d.litterId,
d.Id.mostRecentDeparture.mostRecentDeparture,
o.availability,
o.current_housing_status,
diff --git a/mcc/resources/queries/study/demographics.js b/mcc/resources/queries/study/demographics.js
index 1b0016228..4ce83cf7a 100644
--- a/mcc/resources/queries/study/demographics.js
+++ b/mcc/resources/queries/study/demographics.js
@@ -111,6 +111,13 @@ function onUpsert(helper, scriptErrors, row, oldRow){
}
}
+ if (oldRow && oldRow.Id) {
+ var existingId = triggerHelper.getMccAlias(oldRow.Id);
+ if (existingId) {
+ idToMccAlias[row.Id] = existingId;
+ }
+ }
+
if (!row.date) {
row.date = new Date();
}
diff --git a/mcc/resources/queries/study/demographics.query.xml b/mcc/resources/queries/study/demographics.query.xml
index 3de9b0e1a..b0ce71b6e 100644
--- a/mcc/resources/queries/study/demographics.query.xml
+++ b/mcc/resources/queries/study/demographics.query.xml
@@ -9,7 +9,7 @@
-
+
true
@@ -121,6 +121,13 @@
Alternate IDs
+
+ Litter ID
+ /query/executeQuery.view?schemaName=study&
+ query.queryName=Demographics&
+ query.litterId~eq=${litterId}
+
+
diff --git a/mcc/resources/queries/study/demographics/.qview.xml b/mcc/resources/queries/study/demographics/.qview.xml
index 8950e4cd5..a5c82e8f7 100644
--- a/mcc/resources/queries/study/demographics/.qview.xml
+++ b/mcc/resources/queries/study/demographics/.qview.xml
@@ -36,6 +36,7 @@
+
diff --git a/mcc/resources/queries/study/demographicsLittermates.query.xml b/mcc/resources/queries/study/demographicsLittermates.query.xml
new file mode 100644
index 000000000..acc292687
--- /dev/null
+++ b/mcc/resources/queries/study/demographicsLittermates.query.xml
@@ -0,0 +1,23 @@
+
+ Littermates of Any Animal
+
+
+
+ Littermates of Any Animal
+
+
+ true
+ true
+
+
+
+
+
+ Littermate(s)
+
+
+ Relationship
+
+
+
+
diff --git a/mcc/resources/queries/study/demographicsLittermates.sql b/mcc/resources/queries/study/demographicsLittermates.sql
new file mode 100644
index 000000000..10ddc5d29
--- /dev/null
+++ b/mcc/resources/queries/study/demographicsLittermates.sql
@@ -0,0 +1,16 @@
+SELECT
+
+d1.Id,
+d1.litterId,
+
+GROUP_CONCAT(d2.Id, ',') as litterMates,
+
+FROM study.Demographics d1
+
+JOIN study.Demographics d2 ON (d1.litterId = d2.litterId AND d1.id != d2.id)
+
+WHERE
+ d1.qcstate.publicdata = true AND
+ d2.qcstate.publicdata = true
+
+GROUP BY d1.Id, d1.litterId
\ No newline at end of file
diff --git a/mcc/resources/referenceStudy/study/datasets/datasets_metadata.xml b/mcc/resources/referenceStudy/study/datasets/datasets_metadata.xml
index 912def432..202636ca8 100644
--- a/mcc/resources/referenceStudy/study/datasets/datasets_metadata.xml
+++ b/mcc/resources/referenceStudy/study/datasets/datasets_metadata.xml
@@ -685,6 +685,9 @@
boolean
+
+ varchar
+
Demographics
diff --git a/mcc/resources/web/mcc/window/MarkShippedWindow.js b/mcc/resources/web/mcc/window/MarkShippedWindow.js
index dd369edb7..9d38932c4 100644
--- a/mcc/resources/web/mcc/window/MarkShippedWindow.js
+++ b/mcc/resources/web/mcc/window/MarkShippedWindow.js
@@ -10,11 +10,6 @@ Ext4.define('MCC.window.MarkShippedWindow', {
return;
}
- if (checked.length !== 1) {
- Ext4.Msg.alert('Error', 'Currently only one ID is supported as a time');
- return;
- }
-
Ext4.create('MCC.window.MarkShippedWindow', {
dataRegionName: dataRegionName,
rowIds: checked
@@ -37,23 +32,6 @@ Ext4.define('MCC.window.MarkShippedWindow', {
html: 'This will:
1) Mark the selected animals as shipped from this center
2) Enter a new demographics record in the selected study
3) Preserve the MCC ID for each animal.',
border: false,
style: 'padding-bottom: 10px;'
- },{
- xtype: 'checkbox',
- fieldLabel: 'Animal Will Use Previous Id',
- itemId: 'usePreviousId',
- listeners: {
- scope: this,
- change: function (field, val) {
- var target = field.up('panel').down('#newId');
- target.allowBlank = !!val;
- target.setVisible(!val);
- }
- },
- },{
- xtype: 'textfield',
- fieldLabel: 'New ID (blank if unchanged)',
- itemId: 'newId',
- allowBlank: false
},{
xtype: 'datefield',
fieldLabel: 'Effective Date',
@@ -105,7 +83,7 @@ Ext4.define('MCC.window.MarkShippedWindow', {
}
}
}
- }],
+ }, this.getAnimalIdFields()],
buttons: [{
text: 'Submit',
handler: this.onSubmit,
@@ -121,11 +99,72 @@ Ext4.define('MCC.window.MarkShippedWindow', {
this.callParent(arguments);
},
+ getAnimalIdFields: function(){
+ var fields = [{
+ xtype: 'displayfield',
+ value: 'Animal ID',
+ width: 150
+ },{
+ xtype: 'displayfield',
+ value: 'Keep Existing ID?',
+ width: 150
+ },{
+ xtype: 'displayfield',
+ value: 'New ID (blank if unchanged)',
+ }];
+
+ Ext4.Array.forEach(this.rowIds, function(rowId){
+ const animalId = this.lsidToAnimalId(rowId);
+ fields = fields.concat([{
+ xtype: 'displayfield',
+ value: animalId,
+ },{
+ xtype: 'checkbox',
+ itemId: 'usePreviousId-' + animalId,
+ checked: false,
+ listeners: {
+ scope: this,
+ change: function (field, val) {
+ var target = field.up('panel').down('#newId-' + animalId);
+ target.allowBlank = !!val;
+ target.setDisabled(val);
+ }
+ }
+ },{
+ xtype: 'textfield',
+ itemId: 'newId-' + animalId,
+ disabled: false,
+ allowBlank: true
+ }]);
+ }, this);
+
+ return {
+ layout: {
+ type: 'table',
+ columns: 3
+ },
+ border: false,
+ defaults: {
+ style: 'padding:5px;',
+ border: false
+ },
+ items: fields
+ };
+ },
+
+ lsidToAnimalId: function(lsid){
+ lsid = lsid.split(':')[4];
+ lsid = lsid.split('.');
+ lsid.shift();
+
+ return lsid.join('.');
+ },
+
onSubmit: function(btn){
Ext4.Msg.wait('Loading...');
var win = btn.up('window');
- var lsid = win.rowIds[0];
+ var lsids = win.rowIds;
var effectiveDate = win.down('#effectiveDate').getValue();
var centerName = win.down('#centerName').getValue();
var targetFolder = win.down('#targetFolder').getValue();
@@ -134,9 +173,19 @@ Ext4.define('MCC.window.MarkShippedWindow', {
return;
}
- if (!win.down('#usePreviousId').getValue() && !win.down('#newId').getValue()) {
- Ext4.Msg.hide();
- Ext4.Msg.alert('Error', 'Must enter the new ID');
+ var hasError = false;
+ Ext4.Array.forEach(this.rowIds, function(rowId) {
+ var animalId = this.lsidToAnimalId(rowId);
+ var useExisting = win.down('#usePreviousId-' + animalId).getValue();
+ if (!useExisting && !win.down('#newId-' + animalId).getValue()) {
+ Ext4.Msg.hide();
+ Ext4.Msg.alert('Error', 'Must enter the new ID for: ' + animalId);
+ hasError = true;
+ return false;
+ }
+ }, this);
+
+ if (hasError) {
return;
}
@@ -145,122 +194,125 @@ Ext4.define('MCC.window.MarkShippedWindow', {
LABKEY.Query.selectRows({
schemaName: 'study',
queryName: 'Demographics',
- filterArray: [LABKEY.Filter.create('lsid', lsid)],
+ filterArray: [LABKEY.Filter.create('lsid', lsids.join(';'), LABKEY.Filter.Types.IN)],
columns: 'Id,gender,colony,species,birth,death,center,Id/MostRecentDeparture/MostRecentDeparture,Id/mccAlias/externalAlias,calculated_status,dam,sire,damMccAlias/externalAlias,sireMccAlias/externalAlias',
scope: this,
failure: LDK.Utils.getErrorCallback(),
success: function(results) {
if (!results || !results.rows || !results.rows.length) {
Ext4.Msg.hide();
- Ext4.Msg.alert('Error', 'No row round for LSID: ' + lsid + '. This is not expected');
- return;
+ Ext4.Msg.alert('Error', 'No rows found for, this is not expected');
+ return false;
}
- var row = results.rows[0];
- var newId = win.down('#newId').getValue() || row.Id;
var commands = [];
+ Ext4.Array.forEach(results.rows, function(row){
+ var effectiveId = win.down('#usePreviousId-' + row.Id).getValue() ? row.Id : win.down('#newId-' + row.Id).getValue();
+ // This should be checked above, although perhaps case sensitivity could get involved:
+ LDK.Assert.assertNotEmpty('Missing effective ID after query', effectiveId);
- var shouldAddDeparture = !row['Id/MostRecentDeparture/MostRecentDeparture'] || row['Id/MostRecentDeparture/MostRecentDeparture'] !== Ext4.Date.format(row.effectiveDate, 'Y-m-d') || row.Id !== newId;
- if (shouldAddDeparture) {
- commands.push({
- command: 'insert',
- schemaName: 'study',
- queryName: 'Departure',
- rows: [{
- Id: row.Id,
- date: effectiveDate,
- destination: centerName,
- description: row.colony ? 'Original center: ' + row.colony : null,
- qcstate: null,
- objectId: null,
- QCStateLabel: 'Completed'
- }]
- });
- }
+ var shouldAddDeparture = !row['Id/MostRecentDeparture/MostRecentDeparture'] || row['Id/MostRecentDeparture/MostRecentDeparture'] !== Ext4.Date.format(row.effectiveDate, 'Y-m-d') || row.Id !== effectiveId;
+ if (shouldAddDeparture) {
+ commands.push({
+ command: 'insert',
+ schemaName: 'study',
+ queryName: 'Departure',
+ rows: [{
+ Id: row.Id,
+ date: effectiveDate,
+ destination: centerName,
+ description: row.colony ? 'Original center: ' + row.colony : null,
+ qcstate: null,
+ objectId: null,
+ QCStateLabel: 'Completed'
+ }]
+ });
+ }
- // If going to a new LK folder, we're creating a whole new record:
- if (targetFolderId.toUpperCase() !== LABKEY.Security.currentContainer.id.toUpperCase() || newId !== row.Id) {
- commands.push({
- command: 'insert',
- containerPath: targetFolder,
- schemaName: 'study',
- queryName: 'Demographics',
- rows: [{
- Id: newId,
- date: effectiveDate,
- alternateIds: row.Id !== newId ? row.Id : null,
- gender: row.gender,
- species: row.species,
- birth: row.birth,
- death: row.death,
- dam: row.dam,
- sire: row.sire,
- damMccAlias: row['damMccAlias/externalAlias'],
- sireMccAlias: row['sireMccAlias/externalAlias'],
- colony: centerName,
- source: row.colony,
- calculated_status: 'Alive',
- mccAlias: row['Id/mccAlias/externalAlias'],
- QCState: null,
- QCStateLabel: 'Completed',
- objectId: null
- }]
- });
+ // If going to a new LK folder, we're creating a whole new record:
+ if (targetFolderId.toUpperCase() !== LABKEY.Security.currentContainer.id.toUpperCase() || effectiveId !== row.Id) {
+ commands.push({
+ command: 'insert',
+ containerPath: targetFolder,
+ schemaName: 'study',
+ queryName: 'Demographics',
+ rows: [{
+ Id: effectiveId,
+ date: effectiveDate,
+ alternateIds: row.Id !== effectiveId ? row.Id : null,
+ gender: row.gender,
+ species: row.species,
+ birth: row.birth,
+ death: row.death,
+ dam: row.dam,
+ sire: row.sire,
+ damMccAlias: row['damMccAlias/externalAlias'],
+ sireMccAlias: row['sireMccAlias/externalAlias'],
+ colony: centerName,
+ source: row.colony,
+ calculated_status: 'Alive',
+ mccAlias: row['Id/mccAlias/externalAlias'],
+ QCState: null,
+ QCStateLabel: 'Completed',
+ objectId: null
+ }]
+ });
- commands.push({
- command: 'update',
- containerPath: null, //Use current folder
- schemaName: 'study',
- queryName: 'Demographics',
- rows: [{
- Id: row.Id, // NOTE: always change the original record
- excludeFromCensus: true
- }]
- });
- }
- else {
- // Otherwise update the existing:
- commands.push({
- command: 'update',
- containerPath: targetFolder,
- schemaName: 'study',
- queryName: 'Demographics',
- rows: [{
- Id: row.Id,
- date: effectiveDate,
- alternateIds: null,
- gender: row.gender,
- species: row.species,
- birth: row.birth,
- death: row.death,
- dam: row.dam,
- sire: row.sire,
- colony: centerName,
- source: row.colony,
- calculated_status: 'Alive',
- QCState: null,
- QCStateLabel: 'Completed',
- objectId: null
- }]
- });
+ commands.push({
+ command: 'update',
+ containerPath: null, //Use current folder
+ schemaName: 'study',
+ queryName: 'Demographics',
+ rows: [{
+ Id: row.Id, // NOTE: always change the original record
+ excludeFromCensus: true
+ }]
+ });
+ }
+ else {
+ // Otherwise update the existing:
+ commands.push({
+ command: 'update',
+ containerPath: targetFolder,
+ schemaName: 'study',
+ queryName: 'Demographics',
+ rows: [{
+ Id: row.Id,
+ date: effectiveDate,
+ alternateIds: null,
+ gender: row.gender,
+ species: row.species,
+ birth: row.birth,
+ death: row.death,
+ dam: row.dam,
+ sire: row.sire,
+ colony: centerName,
+ source: row.colony,
+ calculated_status: 'Alive',
+ QCState: null,
+ QCStateLabel: 'Completed',
+ objectId: null
+ }]
+ });
- // And also add an arrival record. NOTE: set the date after the departure to get status to update properly
- var arrivalDate = new Date(effectiveDate).setMinutes(effectiveDate.getMinutes() + 1);
- commands.push({
- command: 'insert',
- containerPath: targetFolder,
- schemaName: 'study',
- queryName: 'Arrival',
- rows: [{
- Id: newId,
- date: arrivalDate,
- source: centerName,
- QCState: null,
- QCStateLabel: 'Completed',
- objectId: null
- }]
- });
- }
+ // And also add an arrival record. NOTE: set the date after the departure to get status to update properly
+ var arrivalDate = new Date(effectiveDate).setMinutes(effectiveDate.getMinutes() + 1);
+ commands.push({
+ command: 'insert',
+ containerPath: targetFolder,
+ schemaName: 'study',
+ queryName: 'Arrival',
+ rows: [{
+ Id: effectiveId,
+ date: arrivalDate,
+ source: centerName,
+ QCState: null,
+ QCStateLabel: 'Completed',
+ objectId: null
+ }]
+ });
+ }
+ }, this);
LABKEY.Query.saveRows({
commands: commands,
diff --git a/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java b/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java
index ff6a0d31c..12373e56e 100644
--- a/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java
+++ b/mcc/src/org/labkey/mcc/query/MccEhrCustomizer.java
@@ -96,6 +96,13 @@ private void customizeAnimalTable(AbstractTableInfo ti)
ti.addColumn(col);
}
+ if (ti.getColumn("littermates") == null)
+ {
+ var col = getWrappedIdCol(ti.getUserSchema(), ti, "littermates", "demographicsLittermates");
+ col.setLabel("Littermates");
+ col.setDescription("The IDs of ");
+ ti.addColumn(col);
+ }
}
private BaseColumnInfo getWrappedIdCol(UserSchema us, AbstractTableInfo ds, String name, String queryName)
diff --git a/mcc/src/org/labkey/mcc/query/TriggerHelper.java b/mcc/src/org/labkey/mcc/query/TriggerHelper.java
index 02aed50cb..f36e999e6 100644
--- a/mcc/src/org/labkey/mcc/query/TriggerHelper.java
+++ b/mcc/src/org/labkey/mcc/query/TriggerHelper.java
@@ -260,6 +260,22 @@ public void possiblySendRabNotification(int reviewerId)
}
}
+ private TableInfo _mappingTable = null;
+
+ private TableInfo getMappingTable()
+ {
+ if (_mappingTable == null)
+ {
+ _mappingTable = QueryService.get().getUserSchema(_user, _container, MccSchema.NAME).getTable(MccSchema.TABLE_ANIMAL_MAPPING);
+ }
+
+ return _mappingTable;
+ }
+
+ public @Nullable String getMccAlias(String id) {
+ return new TableSelector(getMappingTable(), PageFlowUtil.set("externalAlias"), new SimpleFilter(FieldKey.fromString("subjectname"), id, CompareType.EQUAL), null).getObject(String.class);
+ }
+
public int ensureMccAliasExists(Collection rawIds, Map