/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *   SPDX-License-Identifier: Apache-2.0
 */

package org.apache.jena.sparql.expr.aggregate.lib;

import org.apache.jena.sparql.ARQConstants;
import org.apache.jena.sparql.expr.aggregate.AccumulatorFactory;
import org.apache.jena.sparql.expr.aggregate.AggregateRegistry;

/** Register custom aggregates in addition to the SPARQL defined ones.
 * This includes the statistics aggregate functions as custom aggregates, 
 * as {@code <http://jena.apache.org/ARQ/function#stdev} etc.
 * This is commonly abbreviated {@code afn:stdev}.
 */ 
public class StandardAggregates {
    
    public static String BASE = ARQConstants.ARQAggregateLibraryURI;
    public static String BASE2 = ARQConstants.ARQFunctionLibraryURI;   

    public static void register() {
        // PGSQL names:
//        stddev(expression)
//        stddev_pop(expression)
//        stddev_samp(expression)
//        variance(expression)
//        var_pop(expression)
//        var_samp(expression)
        
//        |  < STDEV:       "stdev" >
//        |  < STDEV_SAMP:  "stdev_samp" >
//        |  < STDEV_POP:   "stdev_pop" >
//        |  < VARIANCE:    "variance" >
//        |  < VAR_SAMP:    "var_samp" >
//        |  < VAR_POP:     "var_pop" >
       
        // The statistics aggregates
        // = stddev-samp except one element -> 0. ?????????????
        AccumulatorFactory f_Stdev      =  (agg, distinct) -> new AccStatStdDevSample(agg.getExpr(), distinct);
        AccumulatorFactory f_StdevSamp  =  (agg, distinct) -> new AccStatStdDevSample(agg.getExpr(), distinct);
        AccumulatorFactory f_StdevPop   =  (agg, distinct) -> new AccStatStdDevPopulation(agg.getExpr(), distinct);
        AccumulatorFactory f_VarPop     =  (agg, distinct) -> new AccStatVarPopulation(agg.getExpr(), distinct);
        AccumulatorFactory f_VarSamp    =  (agg, distinct) -> new AccStatVarSample(agg.getExpr(), distinct);
        
        r(AggURI.stdev,        f_Stdev);
        r(AggURI.stdev_samp,   f_StdevSamp);
        r(AggURI.stdev_pop,    f_StdevPop);
        r(AggURI.variance,     f_VarSamp);
        r(AggURI.var_samp,     f_VarSamp);
        r(AggURI.var_pop,      f_VarPop);
    }
    
    private static void r(String uri, AccumulatorFactory f) {
        AggregateRegistry.register(uri, f, null);
        // Again in the afn@ (not encouraged but easy to do)
        AggregateRegistry.register(uri.replace("/aggregate", ""), f, null);
    }
}
