/* -----------------------------------------------------------------------
 *
 * 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
 *
 *   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.
 *
 * ----------------------------------------------------------------------- */

/* -----------------------------------------------------------------------------
 * Test load custom function helper functions
 * -------------------------------------------------------------------------- */

m4_include(`SQLCommon.m4')

\i m4_regexp(MODULE_PATHNAME,
             `\(.*\)libmadlib\.so',
             `\1../../modules/deep_learning/test/madlib_keras_custom_function.setup.sql_in'
)

/* Test successful table creation where no table exists */
DROP TABLE IF EXISTS test_custom_function_table;
SELECT load_custom_function('test_custom_function_table', custom_function_object(), 'sum_fn', 'returns sum');

SELECT assert(UPPER(atttypid::regtype::TEXT) = 'INTEGER', 'id column should be INTEGER type')
    FROM pg_attribute WHERE attrelid = 'test_custom_function_table'::regclass
        AND attname = 'id';
SELECT assert(UPPER(atttypid::regtype::TEXT) = 'BYTEA', 'object column should be BYTEA type' )
    FROM pg_attribute WHERE attrelid = 'test_custom_function_table'::regclass
        AND attname = 'object';
SELECT assert(UPPER(atttypid::regtype::TEXT) = 'TEXT',
    'name column should be TEXT type')
    FROM pg_attribute WHERE attrelid = 'test_custom_function_table'::regclass
        AND attname = 'name';
SELECT assert(UPPER(atttypid::regtype::TEXT) = 'TEXT',
    'description column should be TEXT type')
    FROM pg_attribute WHERE attrelid = 'test_custom_function_table'::regclass
        AND attname = 'description';

/*  id should be 1 */
SELECT assert(id = 1, 'Wrong id written by load_custom_function')
    FROM test_custom_function_table;

/* Validate function object created */
SELECT assert(read_custom_function(object, 2, 3) = 5, 'Custom function should return sum of args.')
    FROM test_custom_function_table;

/* Test custom function insertion where valid table exists */
SELECT load_custom_function('test_custom_function_table', custom_function_object(), 'sum_fn1');
SELECT assert(name = 'sum_fn', 'Custom function sum_fn found in table.')
    FROM test_custom_function_table WHERE id = 1;
SELECT assert(name = 'sum_fn1', 'Custom function sum_fn1 found in table.')
    FROM test_custom_function_table WHERE id = 2;

/* Test adding an existing function name should error out */
SELECT assert(MADLIB_SCHEMA.trap_error($TRAP$
SELECT load_custom_function('test_custom_function_table', custom_function_object(), 'sum_fn1');
$TRAP$) = 1, 'Should error out for duplicate function name');

/* Test deletion by id where valid table exists */
/* Assert id exists before deleting */
SELECT assert(COUNT(id) = 1, 'id 2 should exist before deletion!')
    FROM test_custom_function_table WHERE id = 2;
SELECT delete_custom_function('test_custom_function_table', 2);
SELECT assert(COUNT(id) = 0, 'id 2 should have been deleted!')
    FROM test_custom_function_table WHERE id = 2;

/* Test deletion by name where valid table exists */
SELECT load_custom_function('test_custom_function_table', custom_function_object(), 'sum_fn1');
/* Assert id exists before deleting */
SELECT assert(COUNT(id) = 1, 'function name sum_fn1 should exist before deletion!')
    FROM test_custom_function_table WHERE name = 'sum_fn1';
SELECT delete_custom_function('test_custom_function_table', 'sum_fn1');
SELECT assert(COUNT(id) = 0, 'function name sum_fn1 should have been deleted!')
    FROM test_custom_function_table WHERE name = 'sum_fn1';

/* Test deleting an already deleted entry should error out */
SELECT assert(MADLIB_SCHEMA.trap_error($TRAP$
SELECT delete_custom_function('test_custom_function_table', 2);
$TRAP$) = 1, 'Should error out for trying to delete an entry that does not exist');

/* Test delete drops the table after deleting last entry*/
SELECT delete_custom_function('test_custom_function_table', 1);
SELECT assert(COUNT(relname) = 0, 'Table test_custom_function_table should have been deleted.')
    FROM pg_class where relname='test_custom_function_table';

/* Test deletion where empty table exists */
SELECT load_custom_function('test_custom_function_table', custom_function_object(), 'sum_fn', 'returns sum');
DELETE FROM test_custom_function_table;
SELECT assert(MADLIB_SCHEMA.trap_error($$SELECT delete_custom_function('test_custom_function_table', 1)$$) = 1,
    'Deleting function in an empty table should generate an exception.');

/* Test deletion where no table exists */
DROP TABLE IF EXISTS test_custom_function_table;
SELECT assert(MADLIB_SCHEMA.trap_error($$SELECT delete_custom_function('test_custom_function_table', 1)$$) = 1,
              'Deleting a non-existent table should raise exception.');

/* Test where invalid table exists */
SELECT load_custom_function('test_custom_function_table', custom_function_object(), 'sum_fn', 'returns sum');
ALTER TABLE test_custom_function_table DROP COLUMN id;
SELECT assert(MADLIB_SCHEMA.trap_error($$SELECT delete_custom_function('test_custom_function_table', 2)$$) = 1,
    'Deleting an invalid table should generate an exception.');

SELECT assert(MADLIB_SCHEMA.trap_error($$SELECT load_custom_function('test_custom_function_table', custom_function_object(), 'sum_fn', 'returns sum')$$) = 1,
    'Passing an invalid table to load_custom_function() should raise exception.');

/* Test input validation */
DROP TABLE IF EXISTS test_custom_function_table;
SELECT assert(MADLIB_SCHEMA.trap_error($$
  SELECT load_custom_function('test_custom_function_table', custom_function_object(), NULL, NULL);
$$) = 1, 'Name cannot be NULL');
SELECT assert(MADLIB_SCHEMA.trap_error($$
  SELECT load_custom_function('test_custom_function_table', NULL, 'sum_fn', NULL);
$$) = 1, 'Function object cannot be NULL');
SELECT assert(MADLIB_SCHEMA.trap_error($$
  SELECT load_custom_function('test_custom_function_table', 'invalid_obj'::bytea, 'sum_fn', NULL);
$$) = 1, 'Invalid custom function object');
SELECT load_custom_function('test_custom_function_table', custom_function_object(), 'sum_fn', NULL);
SELECT assert(name IS NOT NULL AND description IS NULL, 'validate name is not NULL.')
    FROM test_custom_function_table;
SELECT assert(MADLIB_SCHEMA.trap_error($$
  SELECT delete_custom_function('test_custom_function_table', NULL);
$$) = 1, 'id/name cannot be NULL!');
