// -*- mode: js; indent-tabs-mode: nil; js-basic-offset: 4 -*- // // This file is part of Genie // // Copyright 2019-2020 The Board of Trustees of the Leland Stanford Junior University // // Licensed 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 // // http://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. // // Author: Giovanni Campagna import * as $runtime from "../sentence-generator/runtime"; import type $SentenceGenerator from "../sentence-generator/generator"; import * as $SentenceGeneratorTypes from "../sentence-generator/types"; import * as $I18n from "../i18n/index"; import assert from 'assert'; import { Ast, Type } from 'thingtalk'; import * as C from './ast_manip'; import ThingpediaLoader from './load-thingpedia'; export const projection_Number : $SentenceGeneratorTypes.NonTerminal = "projection_Number"; export const projection_Any : $SentenceGeneratorTypes.NonTerminal = "projection_Any"; /** * Load the templates in this file. * * This is an autogenerated method that will be called by the {@link SentenceGenerator} * when the templates are imported. */ export async function $load($options : $SentenceGeneratorTypes.GrammarOptions, $locale : $I18n.LanguagePack, $grammar : $SentenceGenerator, $loader : ThingpediaLoader) : Promise { $grammar.declareSymbol("projection_Number"); if ($options.flags.aggregation) { $grammar.addRule("projection_Number", [new $runtime.NonTerminal("complete_table", "t", ["is_list" as ("is_list" extends keyof ReturnType ? string : void), (true) as ReturnType["is_list"]])], $locale._("the {number|total number|count} of {|the|this|that} ${t}"), ((t : Ast.Expression) : (Ast.Expression)|null => { assert(t.schema!.is_list); const newSchema = t.schema!.filterArguments((arg) => arg.direction !== Ast.ArgDirection.OUT) .addArguments([new Ast.ArgumentDef(null, Ast.ArgDirection.OUT, 'count', Type.Number)]); newSchema.is_list = false; const agg = new Ast.AggregationExpression(null, t, '*', 'count', newSchema); return new Ast.ProjectionExpression(null, agg, ['count'], [], [], newSchema); }), C.expressionKeyFn, { }); } $grammar.declareSymbol("projection_Any"); if ($options.flags.aggregation) { $grammar.addRule("projection_Any", [new $runtime.NonTerminal("thingpedia_complete_query", "q", undefined)], "${q}", ((q : Ast.Expression) : (Ast.Expression)|null => { if (!(q instanceof Ast.AggregationExpression)) return null; return q; }), C.expressionKeyFn, { }); if (!$options.flags.schema_org) { $grammar.addRule("projection_Any", [new $runtime.NonTerminal("out_param_Any", "p", ["is_numeric" as ("is_numeric" extends keyof ReturnType ? string : void), (true) as ReturnType["is_numeric"]]), new $runtime.NonTerminal("complete_table", "t", ["functionName" as ("functionName" extends keyof ReturnType ? string : void), 0, "functionName" as ("functionName" extends keyof ReturnType ? string : void)])], $locale._("the total ${p} of {|the|this|that} ${t}"), ((p : C.ParamSlot, t : Ast.Expression) : (Ast.Expression)|null => { const arg = t.schema!.getArgument(p.name); if (!arg || arg.is_input || !arg.type.isNumeric()) return null; if (!t.schema!.is_list) return null; const newSchema = t.schema!.filterArguments((arg) => arg.direction !== Ast.ArgDirection.OUT || arg.name === p.name); newSchema.is_list = false; const agg = new Ast.AggregationExpression(null, t, p.name, 'sum', newSchema); return new Ast.ProjectionExpression(null, agg, [p.name], [], [], newSchema); }), C.expressionKeyFn, { }); } if (!$options.flags.turking) { $grammar.addRule("projection_Any", [new $runtime.NonTerminal("out_param_Any", "p", ["is_numeric" as ("is_numeric" extends keyof ReturnType ? string : void), (true) as ReturnType["is_numeric"]]), new $runtime.NonTerminal("complete_table", "t", ["functionName" as ("functionName" extends keyof ReturnType ? string : void), 0, "functionName" as ("functionName" extends keyof ReturnType ? string : void)])], $locale._("the {average|mean} ${p} of {|the|this|that} ${t}"), ((p : C.ParamSlot, t : Ast.Expression) : (Ast.Expression)|null => { const arg = t.schema!.getArgument(p.name); if (!arg || arg.is_input || !arg.type.isNumeric()) return null; if (!t.schema!.is_list) return null; const newSchema = t.schema!.filterArguments((arg) => arg.direction !== Ast.ArgDirection.OUT || arg.name === p.name); newSchema.is_list = false; const agg = new Ast.AggregationExpression(null, t, p.name, 'avg', newSchema); return new Ast.ProjectionExpression(null, agg, [p.name], [], [], newSchema); }), C.expressionKeyFn, { }); } if ($options.flags.turking) { $grammar.addRule("projection_Any", [new $runtime.NonTerminal("out_param_Any", "p", ["is_numeric" as ("is_numeric" extends keyof ReturnType ? string : void), (true) as ReturnType["is_numeric"]]), new $runtime.NonTerminal("complete_table", "t", ["functionName" as ("functionName" extends keyof ReturnType ? string : void), 0, "functionName" as ("functionName" extends keyof ReturnType ? string : void)])], $locale._("the average ${p} of {|the|this|that} ${t}"), ((p : C.ParamSlot, t : Ast.Expression) : (Ast.Expression)|null => { const arg = t.schema!.getArgument(p.name); if (!arg || arg.is_input || !arg.type.isNumeric()) return null; if (!t.schema!.is_list) return null; const newSchema = t.schema!.filterArguments((arg) => arg.direction !== Ast.ArgDirection.OUT || arg.name === p.name); newSchema.is_list = false; const agg = new Ast.AggregationExpression(null, t, p.name, 'avg', newSchema); return new Ast.ProjectionExpression(null, agg, [p.name], [], [], newSchema); }), C.expressionKeyFn, { }); } $grammar.addRule("projection_Any", [new $runtime.NonTerminal("out_param_Any", "p", ["is_numeric" as ("is_numeric" extends keyof ReturnType ? string : void), (true) as ReturnType["is_numeric"]]), new $runtime.NonTerminal("complete_table", "t", ["functionName" as ("functionName" extends keyof ReturnType ? string : void), 0, "functionName" as ("functionName" extends keyof ReturnType ? string : void)])], $locale._("the {minimum|lowest} ${p} of {|the|this|that} ${t}"), ((p : C.ParamSlot, t : Ast.Expression) : (Ast.Expression)|null => { const arg = t.schema!.getArgument(p.name); if (!arg || arg.is_input || !arg.type.isNumeric()) return null; if (!t.schema!.is_list) return null; const newSchema = t.schema!.filterArguments((arg) => arg.direction !== Ast.ArgDirection.OUT || arg.name === p.name); newSchema.is_list = false; const agg = new Ast.AggregationExpression(null, t, p.name, 'min', newSchema); return new Ast.ProjectionExpression(null, agg, [p.name], [], [], newSchema); }), C.expressionKeyFn, { }); $grammar.addRule("projection_Any", [new $runtime.NonTerminal("out_param_Any", "p", ["is_numeric" as ("is_numeric" extends keyof ReturnType ? string : void), (true) as ReturnType["is_numeric"]]), new $runtime.NonTerminal("complete_table", "t", ["functionName" as ("functionName" extends keyof ReturnType ? string : void), 0, "functionName" as ("functionName" extends keyof ReturnType ? string : void)])], $locale._("the {maximum|highest} ${p} of {|the|this|that} ${t}"), ((p : C.ParamSlot, t : Ast.Expression) : (Ast.Expression)|null => { const arg = t.schema!.getArgument(p.name); if (!arg || arg.is_input || !arg.type.isNumeric()) return null; if (!t.schema!.is_list) return null; const newSchema = t.schema!.filterArguments((arg) => arg.direction !== Ast.ArgDirection.OUT || arg.name === p.name); newSchema.is_list = false; const agg = new Ast.AggregationExpression(null, t, p.name, 'max', newSchema); return new Ast.ProjectionExpression(null, agg, [p.name], [], [], newSchema); }), C.expressionKeyFn, { }); } };