Hi Chathura,

AggregateFields are the fields which are needed to calculate the aggregate
values. For example, If you want to calculate SUM of "subject_mark" of
records representing students, then subject_marks will be the only element
in aggregateFields, since calculating SUM only involves one field.
AggregateFields are constant for a specific AggregateFunction. But the name
of the field can be changed. AggregateFields are defined using REST APIs or
JS APIs as shown below.

*Calling custom aggregate functions through Javascript API*

var queryInfo = {
    tableName:"Students", //table name on which the aggregation is performed
    searchParams : {
        groupByField:"location", //grouping field if any
        query : "Grade:10" //additional filtering query
        aggregateFields:[
        {
           * fields:["Height", "Weight"],* //fields necessary for aggregate
function
            aggregate:"CUSTOM_AGGREGATE", //unique name of the aggregate
function, this is what we return using "getAggregateName" method above.
            alias:"aggregated_result" //Alias for the result of the
aggregate function
        }]
    }
}

client.searchWithAggregates(queryInfo, function(data) {
      console.log (data["message"]);
}, function(error) {
      console.log("error occured: " + error["message"]);
});



*Aggregates REST APIs*This is as same as the Javascript API.

POST https://localhost:9443/analytics/aggregates
{
 "tableName":"Students",
 "groupByField":"location",
 "aggregateFields":[
   {
     *"fields":["Height", "Weight"],*
     "aggregate":"CUSTOM_AGGREGATE",
     "alias":"aggregated_result"
   }]
}

Once you define, the aggregateFields using REST APIs or JS APIs, those
fields will be available as aggregateFields array in the process method.

On Mon, Mar 21, 2016 at 10:18 AM, Chathura Ekanayake <[email protected]>
wrote:

>
>
>
> This method will get called for all the records which need to be
>> aggregated. RecordValuesContext will contain the record values of the
>> current record being processed. aggregateFields will contain an array of
>> fields which will be used for the aggregation. The order of the
>> aggregateFields will matter when we implement the logic. For example, lets
>> say we are going to implement SUM aggregate. Then we know that only one
>> field will be required to calculate SUM and always aggregateFields will
>> contain one field name in it, which is the name of the field being SUMed.
>>
>> public void process(RecordValuesContext ctx, String[] aggregateFields)
>>             throws AnalyticsException {
>>         if (aggregateFields == null || aggregateFields.length == 0) {
>>             throw new AnalyticsException("Field to be aggregated, is
>> missing");
>>         }
>>         Object value = ctx.getValue(aggregateFields[0]);
>>         if (value == null) {
>>             throw new AnalyticsException("Error while calculating SUM:
>> value of the field, " +
>>                                          aggregateFields[0] + " is null");
>>         }
>>         if (value instanceof Number) {
>>             sum += ((Number)value).doubleValue();
>>         } else {
>>             throw new AnalyticsException("Error while calculating
>> Average: Value '" + value.toString() +
>>                                          "', being aggregated is not
>> numeric.");
>>         }
>>     }
>>
>>
>>
> Hi Gimantha
>
> Is aggregateFields parameter a constant for an AggregateFunction object?
> In that case, can we set it just after instantiating an object?
>

I assume that you are asking if we can define the aggregateFields inside
AggregateFunction object itself, without passing them using REST API or JS
API. Yes, we can do that also. In that case, we will be hard-coding the
aggregateFields names inside the process method and your custom aggregate
function cannot be used for any other field.

>
> Regards,
> Chathura
>
>
>
>


-- 
Gimantha Bandara
Software Engineer
WSO2. Inc : http://wso2.com
Mobile : +94714961919
_______________________________________________
Architecture mailing list
[email protected]
https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture

Reply via email to