Search code examples
aggregatefiwarecomplex-event-processing

FIWARE CEP (Proton) Error in derived event attributes with Aggregate EPA


I receive a ContextUpdate event from Orion, and I set a rule to count the numer of the received event, possibly with the same "entityId", over a specific time window. In the derived event of the aggregate EPA, I want that the "DeviceID" attribute assume the same value of the "entityId" of the received event. But, both with "Defered" or "Immediate" evaluation policy, in the DeviceID attribute of the consumer output (text file), I've got:

"DeviceID":"[Ljava.lang.Object;@4456c43f"

Any hint?

Thanks.

Here is the json configuration:

{
"epn": {
    "events": [{
        "name": "DCUPiazzaCarraraContextUpdate",
        "createdDate": "Thu Oct 22 2015",
        "attributes": [{
            "name": "entityId",
            "type": "String",
            "dimension": 0
        }, {
            "name": "entityType",
            "type": "String",
            "dimension": 0
        }, {
            "name": "battery",
            "type": "Double",
            "dimension": 0
        }, {
            "name": "temperature",
            "type": "Double",
            "dimension": 0
        }, {
            "name": "stato",
            "type": "Boolean",
            "dimension": 0
        }, {
            "name": "rssi",
            "type": "Integer",
            "dimension": 0
        }, {
            "name": "lqi",
            "type": "Integer",
            "dimension": 0
        }, {
            "name": "timestamp",
            "type": "String",
            "dimension": 0
        }, {
            "name": "numprog",
            "type": "Integer",
            "dimension": 0
        }, {
            "name": "dcu",
            "type": "String",
            "dimension": 0
        }]
    }, {
        "name": "DCUAbsence",
        "createdDate": "Sat Nov 07 2015",
        "attributes": [{
            "name": "entityId",
            "type": "String",
            "dimension": 0
        }, {
            "name": "entityType",
            "type": "String",
            "dimension": 0
        }, {
            "name": "AlertType",
            "type": "String",
            "dimension": 0
        }, {
            "name": "eventnum",
            "type": "Integer",
            "dimension": 0
        }, {
            "name": "DeviceID",
            "type": "String",
            "dimension": 0
        }, {
            "name": "DeviceContext",
            "type": "String",
            "dimension": 0
        }]
    }],
    "epas": [{
        "name": "AbsenceDCU",
        "createdDate": "Sat Nov 07 2015",
        "epaType": "Aggregate",
        "context": "AbsenceDCUComp",
        "inputEvents": [{
            "name": "DCUPiazzaCarraraContextUpdate",
            "consumptionPolicy": "Reuse",
            "instanceSelectionPolicy": "First"
        }],
        "computedVariables": [{
            "name": "eventnum",
            "aggregationType": "Count",
            "DCUPiazzaCarraraContextUpdate": "1"
        }],
        "evaluationPolicy": "Immediate",
        "cardinalityPolicy": "Unrestricted",
        "internalSegmentation": [],
        "derivedEvents": [{
            "name": "DCUAbsence",
            "reportParticipants": false,
            "expressions": {
                "entityId": "\"Alert\"",
                "entityType": "\"PiazzaCarrara\"",
                "AlertType": "\"006\"",
                "eventnum": "eventnum",
                "DeviceID": "DCUPiazzaCarraraContextUpdate.entityId",
                "DeviceContext": "DCUPiazzaCarraraContextUpdate.entityType"
            }
        }]
    }],
    "contexts": {
        "temporal": [{
            "name": "AbsenceDCUWindow",
            "createdDate": "Sat Nov 07 2015",
            "type": "TemporalInterval",
            "atStartup": false,
            "neverEnding": false,
            "initiators": [{
                "initiatorType": "Event",
                "initiatorPolicy": "Ignore",
                "name": "DCUPiazzaCarraraContextUpdate"
            }],
            "terminators": [{
                "terminatorType": "RelativeTime",
                "terminationType": "Discard",
                "relativeTime": "5000"
            }]
        }],
        "segmentation": [{
            "name": "AbsenceDCUID",
            "createdDate": "Thu Dec 17 2015",
            "participantEvents": [{
                "name": "DCUPiazzaCarraraContextUpdate",
                "expression": "DCUPiazzaCarraraContextUpdate.entityId"
            }, {
                "name": "DCUAbsence",
                "expression": "DCUAbsence.DeviceID"
            }]
        }],
        "composite": [{
            "name": "AbsenceDCUComp",
            "createdDate": "Thu Dec 17 2015",
            "temporalContexts": [{
                "name": "AbsenceDCUWindow"
            }],
            "segmentationContexts": [{
                "name": "AbsenceDCUID"
            }]
        }]
    },
    "consumers": [{
        "name": "OnFileAlert",
        "createdDate": "Thu Oct 22 2015",
        "type": "File",
        "properties": [{
            "name": "filename",
            "value": "/var/log/tomcat7/Alert.json"
        }, {
            "name": "formatter",
            "value": "json"
        }, {
            "name": "delimiter",
            "value": ";"
        }, {
            "name": "tagDataSeparator",
            "value": "="
        }, {
            "name": "SendingDelay",
            "value": "1000"
        }, {
            "name": "dateFormat",
            "value": "dd/MM/yyyy-HH:mm:ss"
        }],
        "events": [{
            "name": "DCUAbsence"
        }, {
            "name": "DCUPiazzaCarraraContextUpdate"
        }]
    }],
    "producers": [],
    "name": "CounterExample"
}

}


Solution

  • In an EPA of type Aggregate, since many events from that type can arrive during the context, when you refer to an input event attribute in the derivation expression, you get an array that holds the attribute of all the participant input events of that type.

    In your example, DCUPiazzaCarraraContextUpdate.entityId will hold an array of entityId.

    If you want a single value you can either use array access function to get one value from the array, or since you use a segmentation context over the entityId, you can get the entityId from that context.

    For getting the attribute from the context use context."segmentation-context-name" expression, which in your case is:

    context.AbsenceDCUID
    

    In the general case, you can get a specific entry from the array using array access functions. For example, getting the last value from the array:

    ArrayGet(DCUPiazzaCarraraContextUpdate.entityId, ArraySize(DCUPiazzaCarraraContextUpdate.entityId)-1)