Hi Gimantha, Yeah, it should be named to something like "RecordContext".
Cheers, Anjana. On Fri, Mar 18, 2016 at 12:38 PM, Gimantha Bandara <[email protected]> wrote: > Hi Sinduja, > > Yes, Simply having a map will do the job. The RecordValuesContext class is > only a wrapper around a key-value map of values of the current record being > processed. This class is only to make the method definition looks simple. > In future if we are to change the method definition we can simply change > the RecordValuesContext other than changing the method definition.In that > case we might need to change the class name to a more appropriate name. > Current name gives the impression that it only contains record values. > @Anjana WDYT? > > > On Thu, Mar 17, 2016 at 9:15 PM, Sinthuja Ragendran <[email protected]> > wrote: > >> Hi Gimantha, >> >> On Thu, Mar 17, 2016 at 9:05 PM, Gimantha Bandara <[email protected]> >> wrote: >> >>> Hi all, >>> >>> DAS 3.0.0 and DAS 3.0.1 has 5 built-in Aggregates[1][2] namely MIN, MAX, >>> SUM, AVG and COUNT which can be used in interactive analytics. Sometimes >>> some scenarios may require custom aggregate functions for aggregate >>> calculations. For this we have introduced a new interface from >>> carbon-analytics/analytics-core, which has three methods which need to be >>> implemented. >>> >>> Interface : >>> org.wso2.carbon.analytics.dataservice.core.indexing.aggregates.AggregateFunction >>> >>> Following are the three methods that need to be implemented. >>> >>> *public void process(RecordValuesContext ctx, String[] aggregateFields) >>> throws AnalyticsException*; >>> >>> 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."); >>> } >>> } >>> >>> >> What are the other details the RecordValueContext has? Is it only having >> the values for the fields to be aggregated? If so, I think we can simple >> have Map for this as key, value pair right? I cannot think of a case where >> the aggregate function is based some different field than the field which >> needs to be aggregated. Sorry, if I'm missing something.. >> >> Thanks, >> Sinthuja. >> >>> >>> >>> >>> *public Object finish() throws AnalyticsException* >>> Once the aggregation is complete for a group or for whole record set, >>> this method will be called. This will return the final result of the >>> aggregate function. for example, the SUM aggregate, >>> >>> public Number finish() throws AnalyticsException { >>> return sum; >>> } >>> >>> >>> >>> *public String getAggregateName()* >>> This method is used to identify the Aggregate function uniquely among >>> other Aggregate functions. You can return a preferred string inside this >>> method. >>> >>> *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"]); >>> }); >>> >>> >>> *Note that the order elements in attribute "fields" will be the same >>> order of aggregateFields parameter's element order in above process method. >>> That is Height will be aggregateFields[0] and Weight will be >>> aggregateFields[1] in process method. Based on that order, >>> "CUSTOM_AGGREGATE" should be implemented.* >>> >>> >>> >>> *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" >>> }] >>> } >>> >>> [1] >>> https://docs.wso2.com/display/DAS301/Retrieving+Aggregated+Values+of+Given+Records+via+REST+API >>> [2] >>> https://docs.wso2.com/display/DAS301/Retrieving+Aggregated+Values+of+Given+Records+via+JS+API >>> -- >>> 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 >>> >>> >> >> >> -- >> *Sinthuja Rajendran* >> Associate Technical Lead >> WSO2, Inc.:http://wso2.com >> >> Blog: http://sinthu-rajan.blogspot.com/ >> Mobile: +94774273955 >> >> >> >> _______________________________________________ >> Architecture mailing list >> [email protected] >> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture >> >> > > > -- > 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 > > -- *Anjana Fernando* Senior Technical Lead WSO2 Inc. | http://wso2.com lean . enterprise . middleware
_______________________________________________ Architecture mailing list [email protected] https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture
