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


DROP TABLE IF EXISTS minibatch_preprocessing_input;
CREATE TABLE minibatch_preprocessing_input(
    sex TEXT,
    id SERIAL NOT NULL,
    length DOUBLE PRECISION,
    diameter DOUBLE PRECISION,
    height DOUBLE PRECISION,
    whole DOUBLE PRECISION,
    shucked DOUBLE PRECISION,
    viscera DOUBLE PRECISION,
    shell DOUBLE PRECISION,
    rings INTEGER);

INSERT INTO minibatch_preprocessing_input(id,sex,length,diameter,height,whole,shucked,viscera,shell,rings) VALUES
(1040,'F',0.66,0.475,0.18,1.3695,0.641,0.294,0.335,6),
(3984,'F',0.585,0.45,0.125,0.874,0.3545,0.2075,0.225,6),
(2551,'I',0.28,0.22,0.08,0.1315,0.066,0.024,0.03,5),
(516,'M',0.27,0.195,0.08,0.1,0.0385,0.0195,0.03,6);

-- check if an integer dependent var is being one-hot-encoded
DROP TABLE IF EXISTS minibatch_preprocessing_out, minibatch_preprocessing_out_standardization, minibatch_preprocessing_out_summary;
SELECT minibatch_preprocessor('minibatch_preprocessing_input',
                              'minibatch_preprocessing_out',
                              'rings',
                              'ARRAY[diameter,height,whole,shucked,viscera,shell]',
                              NULL,
                              4,
                              TRUE);
