Hi Gimantha,

Yes, hard-coding aggregateFields imposes a limitation. But, if I understood
correct.. once we do a REST API call, we have to execute process(...)
method for each record in the store. But for a single REST API call
aggregateFields is a constant. So we can set those fields (at the object
level) after receiving a REST API call (before executing the process()
method for the first record).

Regards,
Chathura


On Mon, Mar 21, 2016 at 11:12 AM, Gimantha Bandara <[email protected]>
wrote:

> 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