Warehouse Performance Inbound Interface
This page describes the Warehouse Performance object, the streams and rules it uses, and the logic designed for its streams, including:
Overview
The purpose of the Warehouse Performance Inbound interface is to upload Total, Segment-level and Index Constituent Performance returns into the Eagle data warehouse from external sources.Â
It assumes that performance has been calculated and data is committed to the database in order to establish the classification structure that reflects the model of the index or fund being loaded (e.g. Country/Sector). This structure is defined by the grouping rule of the Performance Calculation report and it is the PACE commit process that ensures the structure is written to the PACE dictionary and dictionary_detail tables. The configuration of the performance model must exist in order for data to be loaded.
Warehouse Performance inbound interface loads and updates data in the following database tables:
PERFORMDBO.PERF_SUMMARY
PERFORMDBO.PERF_SEC_RETURNS
You can use pipe-delimited and EagleML-formatted files as incoming data.
Stream Logic
EagleML Processing Sequence
Warehouse Performance is loaded into DB via eagle_ml-2-0_default_in_xml_warehouse_preproc in two steps:
XSLT transformation. XSLT rule 'eagle_default/in/xml/xslt/wrh_egl_gen_interface3.xsl' is used.
Loading data into the database. The 'eagle_default/in/xml/xml-warehouse_v2.xml' rule is used.
To load or update data in Warehouse Performance database tables send an EagleML message into the eagle_ml-2-0_default_in_xml_warehouse_preproc stream.
CSV Processing Sequence
Warehouse Performance is loaded to DB with the following streams:
eagle_default_in_csv_warehouse  - this is PRF stream which consist of two steps transform and load
eagle_default_in_csv_warehouse_t - transformation CSV to EagleML
_performance.xml​ {_}rule
eagle_ml-2-0_default_in_xml_warehouse_preproc
XSLT transformation. XSLT rule 'eagle_default/in/xml/xslt/wrh_egl_gen_interface3.xsl' is used.
Loading data into the database. The 'eagle_default/in/xml/xml-warehouse_v2.xml' rule is used
To load or update data in Warehouse Performance tables, send your CSV message to the eagle_default_in_csv_warehouse stream.
Pipe-delimited Processing Sequence
Warehouse Performance is loaded to database with the following streams:
eagle_default_in_pipe_warehouseCLP  - this is PRF stream which consist of two steps transform and load
​eagle_default_in_pipe_warehouseCLP_t - transformation PIPE to XMLDBAPI
​pipe-wrhs_performance_xmldbapi.xml rule
eagle_ml-2-0_default_in_xml_warehouse – loading data into the database. In this step the rule eagle_default/in/xml/xml-dbdirect_invar.xml ​is used.
To load or update data in Warehouse Performance tables, send your pipe-delimited message to the eagle_default_in_pipe_warehouseCLP stream.
Please keep in mind that pipe-delimited messages are loaded without header elements.
Required Elements
The following elements are required in the EagleML message: Effective Date, Entity Id (or Entity Identifiers), Source Name, Lot Number, identifiers to resolve Security Alias.
Effective Date: warehouseTransaction/warehousePerformance/effectiveDateÂ
Entity Id: warehouseTransaction/warehousePerformance/entityId (or warehouseTransaction/warehousePerformance/xrefAccountId and warehouseTransaction/warehousePerformance/xrefAccountIdType) – mapped to PERFORMDBO.PERF_SUMMARY.ENTITY_ID
Source Name: warehouseTransaction/warehousePerformance/sourceName​
Security Identifiers to resolve the Security Alias (see the section 'Security Resolution Logic'), Security Alias is mapped to PERFORMDBO.PERF_SEC_RETURNS.SECURITY_ALIAS
Security Resolution Logic
Constituent level records will need to resolve to the SECURITY_ALIAS found in the security.xreference table. Records at the 'Total' or 'Segment' level are loaded to the performance table with a security alias of '0'. To resolve security alias the procedure will do the following:
The element Security Alias should not be specified in the incoming EagleML message. Please refer to Security Resolution for Warehouse Objects
Entity Resolution Logic
There are two ways to define Entity Id for Warehouse objects:
1. Refer to Entity Resolution for Warehouse Objects.
2. Providing EntityXrefIdType and EntityXrefId in the Batch Key in the incoming message.
The procedure will resolve the record to the proper EntityID based on the value provided in EntityXrefIdType(BatchKey - Field #2). If the incoming value in EntityXrefIdType is NULL, then the procedure will get entity_id from the EntityId of the incoming record (BatchKey - Field #1).  If the incoming value in EntityXrefIdType is not NULL then entity_id will be resolved from table RULESDBO.ENTITY_XREFERENCE where xref_account_id is the value from incoming record EntityId (BatchKey - Field #1) and xref_account_id_type is the value from the incoming record EntityXrefIdType (BatchKey - Field #2).
BatchKey
To facilitate the identification of a unique batch within the file, the procedure will use BatchKey as the unique batch parameter. The BatchKey is the concatenation of
EntityXrefId^EntityXrefIdType^EndEffectiveDate^SourceName^FrequencyCode^DictionaryName^PerfSummaryType (if you use Entity Xref for EntityId resolution) orÂ
EntityId^^EndEffectiveDate^SourceName^FrequencyCode^DictionaryName^PerfSummaryType (if you use direct EntityId value.)
 | Element | Optional/ Required | Sample | Description |
---|---|---|---|---|
1 | EntityID(EntityXrefId) | R | TSTVAL01 | ENTITY_ID from the RULESDBO.ENTITY table |
2 | EntityXrefIdType | O |  | XREF_ACCOUNT_ID_TYPE from the RULESDBO.entity_xreference table. |
3 | EndEffectiveDate | R | 20130713 | Date in format (YYYYMMDD) |
4 | SourceName | R | EAGLE PACE | SHORT_DESC from the PACE_MASTERDBO.INTERFACES table |
5 | FrequencyCode | O/R | D | D - DAY |
6 | DictionaryName | R | TestValue2 | DICTIONARY_NAME from the RULESDBO.DICTIONARIES table |
7 | PerfSummaryType | R | S | S -Â Index Constituent Performance Record(s) |
For example: Â ENTVALUE^^20130713^EAGLE PACE^D^DICTIONARY1^S
Constituent Insertion Logic
All Constituent records (Security_alias != "0") are loaded to the perform..perf_summary and Perform..Perf_Sec_Returns tables with the following values:
Perf_summary.Dictionary_id = "0"
Perf_summary.Perf_summary_type = "S"
Perf_Sec_Returns.Perf_rollup_returns_id = "0"
The procedure will then move to the Perf Sec Rollup Relation Section.Â
Dictionary ID Resolution Logic
A performance dictionary (model) must be established in the target environment prior to any data load. Â If one does not exist, please contact your Eagle representative to review the alternatives for establishing a performance dictionary.In order to load the returns to the appropriate performance model, the procedure will perform a lookup in the rules..dictionaries table and select dictionary_id where dictionary_name is equal to DictionaryName (BatchKey - Field #6)
If the result is Null, the procedure will generate an error with the message: "Invalid Dictionary/Model Name."
If the result is NOT NULL, the procedure will consider the result to be the dictionary_id variable.
Dictionary Item ID Resolution
Severity can take the following values: F, W.
Once the dictionary_id is resolved, the Dictionary Node within the appropriate dictionary level must be resolved. This is also referred to as the Dictionary Item ID. If a dictionary Node is not found, the procedure will be permitted to add that node only if the severity on the edit 'Dictionary item not found' is set to 'W' (which stands for warning).  If the severity level is set to 'F' (fatal), this will result in an error condition as documented below. Constituent/Security returns (Security_alias != 0) are stored in the Perform.Perf_Sec_Returns table with a perf_rollup_returns_id of '0'. The procedure will not have the ability to establish new levels within a dictionary, only nodes within established levels.Â
The steps to resolve the Dictionary Item ID are as follows:
The procedure will evaluate variables (dictLevel2… dictLevel8) in the incoming record to determine which is the first column having a NULL value:
If none of the variables are null, the incoming record is assigned DICTIONARY_LEVEL_CODE of 8.
If a column other than DL1 (not input from file) is found to be NULL, the procedure will check whether any subsequent columns in the subset are NOT NULL.
If any subsequent columns are NOT NULL, an error will be given that 'Invalid Dictionary Levels Found'.
If no subsequent columns in the subset are NULL, the procedure will assign DICTIONARY_LEVEL_CODE based on the first column that was found to be NULL in accord with the table below.
The procedure will perform a lookup in the rulesdbo.dictionary table selecting Dictionary_item_id where the following characteristics are met:
Dictionary_id = Dictionary_id
DICT_L1_CODE_VALUE = DL1
DICT_L2_CODE_VALUE = DL 2
DICT_L3_CODE_VALUE = DL 3
DICT_L4_CODE_VALUE = DL 4
DICT_L5_CODE_VALUE = DL 5
DICT_L6_CODE_VALUE = DL 6
DICT_L7_CODE_VALUE = DL 7
DICT_L8_CODE_VALUE = DL 8
If the result is NOT NULL, the procedure will consider the variable to be DICTIONARY_ITEM_ID and store the record in accord with the data map.Â
If the result is NULL, the procedure will check the severity level of the edit 'Dictionary Item Not Found.'
If the edit is not found or if the result is anything other than 'F' or 'W' the procedure will give an error that 'Dictionary Item ID unclear'.
If the result is 'F', the procedure will fail the record with the error 'Dictionary Item not found.
If the result is 'W', the procedure will count the number of records in the rulesdbo.dictionary_format table having the following attributes:
Dictionary_id = DICTIONARY_ID
Dictionary_level = DICTIONARY_LEVEL_CODE
First NULL Column in Subset | DICTIONARY_LEVEL_CODE |
---|---|
DL 2 (dictLevel2) | 1 |
DL 3 (dictLevel3) | 2 |
DL 4 (dictLevel4) | 3 |
DL 5 (dictLevel5) | 4 |
DL 6 (dictLevel6) | 5 |
DL 7 (dictLevel7) | 6 |
DL 8 (dictLevel8) | 7 |
If the count is zero, an error will be given that 'Invalid Dictionary levels Found'.
If the count is greater than zero, the procedure will give the warning 'Dictionary Item not Found AND perform a series of checks to determine whether the higher-level nodes exist. As illustrated in the table below, this iterative check requires the lower level values to be considered NULL. The DL1 Code does not require a check as there can be only one node with one value at this level.
If any of the higher level nodes are not found in the dictionary_detail table, they will be inserted along with the node for the incoming record in accord with the table below
Column in Table | Content from the incoming record | Content for the next-higher level node, if needed. (Example assumes incoming record has DICTIONARY_LEVEL_CODE of 4.) | Content for the next-higher level node, if needed |
---|---|---|---|
DICTIONARY_ID | DICTIONARY_ID | DICTIONARY_ID | DICTIONARY_ID |
SOURCE_CODE_ID | Set to 99 | Set to 99 | Set to 99 |
DICT_L1_CODE_VALUE | Set to 'TOTAL' | Set to 'TOTAL' | Set to 'TOTAL' |
DICT_L2_CODE_VALUE | DL 2 CODE (dictLevel2) | DL 2 CODE (dictLevel2) | DL 2 CODE (dictLevel2) |
DICT_L3_CODE_VALUE | DL 3 CODE (dictLevel3) | DL 3 CODE (dictLevel3) | NULL |
DICT_L4_CODE_VALUE | DL 4 Â CODE (dictLevel4) | NULL | NULL |
DICT_L5_CODE_VALUE | DL 5 Â CODE (dictLevel5) | DL 5 Â CODE (dictLevel5) | DL 5 Â CODE (dictLevel5) |
DICT_L6_CODE_VALUE | DL 6 Â CODE (dictLevel6) | DL 6 Â CODE (dictLevel6) | DL 6 Â CODE (dictLevel6) |
DICT_L7_CODE_VALUE | DL 7 Â CODE (dictLevel7) | DL 7 Â CODE (dictLevel7) | DL 7 Â CODE (dictLevel7) |
DICT_L8_CODE_VALUE | DL 8 CODE (dictLevel8) | DL 8 CODE (dictLevel8) | DL 8 CODE (dictLevel8) |
DICTIONARY_DETAIL_ID | Assigned as next instance. | Assigned as next instance. | Assigned as next instance. |
UPDATE_SOURCE | update_source | update_source | update_source |
UPDATE_DATE | Set to system date. | Set to system date. | Set to system date. |
DICTIONARY_ITEM_ID | Set equal to 1+(the maximum value in the dictionary_item_id columns for records having the same Dictionary_id) | Set equal to 1 + (the maximum value in the Dictionary_item_ID column for records having the same Dictionary_id | Set equal to 1 + (the maximum value in the Dictionary_Item_ID column for records having the same Dictionary_ID) |
PROCESS_FLAG | Set to 'N' | Set to 'N' | Set to 'N' |
TRANS_FLAG | Set to 'N' | Set to 'N' | Set to 'N' |
Additional Logic
If the incoming record does not have a startDate (BEGIN EFFECTIVE DATE) the FrequencyCode(BatchKey - Field #5) Â will be used to determine the begin_effective_date using the business calendar for the 'Eagle PACE' source. The logic is as follows:
If FrequencyCode(BatchKey - Field #5)Â = 'D', the begin_effective_date will be the prior business date relative to EndEffectiveDate (BatchKey - Field #3)
If FrequencyCode(BatchKey - Field #5) = 'M', the begin_effective_date will be the last day of the prior month relative to END EndEffectiveDate (BatchKey - Field #3)
If FrequencyCode(BatchKey - Field #5)Â = 'Q', the begin_effective_date will be the last day of the prior quarter relative to EndEffectiveDate (BatchKey - Field #3)
If FrequencyCode(BatchKey - Field #5)Â = 'Y', the begin_effective_date will be the last day of the prior year relative to EndEffectiveDate (BatchKey - Field #3)
Update the business calendar to reflect the appropriate day, month, quarter or year-end flag (set the flag to 1 only) for the date corresponding to EndEffectiveDate (BatchKey - Field #3) if the flag is missing on the business calendar row for the source data being loaded.
Records resolved to the constituent/security level (Security_alias != 0) need to have additional processing logic. That logic is outlined in the Perf Sec Rollup Relation Instance and Perf Sec Universe Instance logic below.Â
Perf Sec Rollup Relation Instance
Perf_sec_rollup_relation stores the relationship of a security to the rollup level that the security belongs to in a specific performance model by effective date.
The INSTANCE is defined as the unique combination of EntityId (BatchKey - Field #1), EndEffectiveDate (BatchKey - Field #3), Dictionary_id resolved from the DictionaryName (BatchKey - Field #6), security_alias resolved from XrefIdentifiers and dictionary_item_id(Perf Rollup Returns ID) resolved from(dictLevel2… dictLevel8). If the interface finds that records exist for the same data as is found for the incoming record for EntityId, and Dictionary_id resolved from DictionaryName, then the procedure will do the following:
Retrieve the most recent record corresponding to the incoming record. This is the record where Perf_sec_rollup_relation.Entity_id = EntityId on incoming record, Perf_sec_rollup_relation.Dictionary_id = Dictionary_id on incoming record, Security_alias = security_alias on incoming record and Perf_sec_rollup_relation.Effective_date = Max(Effective_date) where effective_date <= EndEffectiveDate on Incoming recordÂ
If Perf_rollup_returns_id on record retrieved in Step 1 is equal to Dictionary_item_id resolved from(dictLevel2… dictLevel8)., then the perf_sec_rollup_relation table will not be updated.
If Perf_rollup_returns_id on record retrieved in Step 1 is NOT equal to Dictionary_item_id resolved from(dictLevel2… dictLevel8), then the perf_sec_rollup_relation table will be updated. If EndEffectiveDate = Effective_date on retrieved record in Step1, then this record will be updated according to the data map below. If EndEffectiveDate > Effective_date on retrieved record in Step1, then a new record will be inserted to the Perf_sec_rollup_relation table according to the data map below.
Perf Sec Universe InstanceÂ
Perf_sec_universe stores the universe of all securities that have been held by an entity.
The INSTANCE is defined as the unique combination of EntityId (BatchKey - Field #1), and Security Alias resolved from XrefIdentifiers
Since this table stores the security universe across time, the data matching entity_id and security_alias should not be replaced by the batch. Records will be inserted if the combination of Entity_id and Security_alias does not currently exist.
The procedure will perform a lookup in the Perf_sec_universe table using the entity_id and security_alias.
If a match is found, the procedure will ignore the record.Â
If a match is not found, the procedure will insert a new record according to the data map
PACE Derived Fields
Field No. | Derived Field | Description | Notes | PACE Database | PACE Table(s) | PACE Field | Format | Validation | STAR Tag |
---|---|---|---|---|---|---|---|---|---|
89 | Update Date | Update Date | The procedure will populate current system date into the update_date field. The update_date in perf_summary and Perf_Sec_Returns should always be the same, even when there is no change to the perf_summary record directly. | Perform | Perf_summary/ | Update_date | Datetime |  |  |
90 | Dictionary Id | Dictionary Id | Refer to the Dictionary ID Resolution Logic section. | Perform | Perf_Summary | Dictionary_id |  |  |  |
91 | Calendar Month End | Calendar Month End | Actual calendar month end for a specific month. For example, June 2004 would have a Calendar Month End date of 06/30/2004. | Perform | Perf_summary | End_effective_date | Datetime |  |  |
92 | Begin Effective Date | Begin Effective Date | The Begin effective date is derived from the end effective date. For example, June 2004 would have a Begin Effective Date of 06/01/2004. | Perform | Perf_Summary | Begin_Effective_date | Datetime |  |  |
93 | LEVEL TYPE | Level Type | Â | Perform | Perf_summary | Level_type | Char(8) | Â | Â |
94 | PERF SEC ROLLUP RELATION INSTANCE | Instance Number | Perform | Perf_sec_rollup_relation | Instance | Number | Â | Â | |
95 | PERF SEC UNIVERSE INSTANCE | Instance Number | Refer to Perf Sec Universe Instance Logic | Perform | Perf_sec_universe | Instance | Number | Â | Â |
Â
Â