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

package org.apache.spark.sql.hive

import org.apache.spark.sql.{AnalysisException, Row}
import org.apache.spark.sql.functions._
import org.apache.spark.sql.hive.HivemallGroupedDataset._
import org.apache.spark.sql.hive.HivemallOps._
import org.apache.spark.sql.hive.HivemallUtils._
import org.apache.spark.sql.hive.test.HivemallFeatureQueryTest
import org.apache.spark.sql.internal.SQLConf
import org.apache.spark.sql.test.VectorQueryTest
import org.apache.spark.sql.types._
import org.apache.spark.test.TestFPWrapper._
import org.apache.spark.test.TestUtils


class HivemallOpsWithFeatureSuite extends HivemallFeatureQueryTest {

  test("anomaly") {
    import hiveContext.implicits._
    val df = spark.range(1000).selectExpr("id AS time", "rand() AS x")
    // TODO: Test results more strictly
    assert(df.sort($"time".asc).select(changefinder($"x")).count === 1000)
    assert(df.sort($"time".asc).select(sst($"x", lit("-th 0.005"))).count === 1000)
  }

  test("knn.similarity") {
    import hiveContext.implicits._

    val df1 = DummyInputData.select(
      cosine_similarity(typedLit(Seq(1, 2, 3, 4)), typedLit(Seq(3, 4, 5, 6))))
    val rows1 = df1.collect
    assert(rows1.length == 1)
    assert(rows1(0).getFloat(0) ~== 0.500f)

    val df2 = DummyInputData.select(jaccard_similarity(lit(5), lit(6)))
    val rows2 = df2.collect
    assert(rows2.length == 1)
    assert(rows2(0).getFloat(0) ~== 0.96875f)

    val df3 = DummyInputData.select(
      angular_similarity(typedLit(Seq(1, 2, 3)), typedLit(Seq(4, 5, 6))))
    val rows3 = df3.collect
    assert(rows3.length == 1)
    assert(rows3(0).getFloat(0) ~== 0.500f)

    val df4 = DummyInputData.select(
      euclid_similarity(typedLit(Seq(5, 3, 1)), typedLit(Seq(2, 8, 3))))
    val rows4 = df4.collect
    assert(rows4.length == 1)
    assert(rows4(0).getFloat(0) ~== 0.33333334f)

    val df5 = DummyInputData.select(distance2similarity(lit(1.0)))
    val rows5 = df5.collect
    assert(rows5.length == 1)
    assert(rows5(0).getFloat(0) ~== 0.5f)

    val df6 = Seq((Seq("1:0.3", "4:0.1"), Map(0 -> 0.5))).toDF("a", "b")
    // TODO: Currently, just check if no exception thrown
    assert(df6.dimsum_mapper(df6("a"), df6("b")).collect.isEmpty)
  }

  test("knn.distance") {
    val df1 = DummyInputData.select(hamming_distance(lit(1), lit(3)))
    checkAnswer(df1, Row(1))

    val df2 = DummyInputData.select(popcnt(lit(1)))
    checkAnswer(df2, Row(1))

    val rows3 = DummyInputData.select(kld(lit(0.1), lit(0.5), lit(0.2), lit(0.5))).collect
    assert(rows3.length === 1)
    assert(rows3(0).getDouble(0) ~== 0.01)

    val rows4 = DummyInputData.select(
      euclid_distance(typedLit(Seq("0.1", "0.5")), typedLit(Seq("0.2", "0.5")))).collect
    assert(rows4.length === 1)
    assert(rows4(0).getFloat(0) ~== 1.4142135f)

    val rows5 = DummyInputData.select(
      cosine_distance(typedLit(Seq("0.8", "0.3")), typedLit(Seq("0.4", "0.6")))).collect
    assert(rows5.length === 1)
    assert(rows5(0).getFloat(0) ~== 1.0f)

    val rows6 = DummyInputData.select(
      angular_distance(typedLit(Seq("0.1", "0.1")), typedLit(Seq("0.3", "0.8")))).collect
    assert(rows6.length === 1)
    assert(rows6(0).getFloat(0) ~== 0.50f)

    val rows7 = DummyInputData.select(
      manhattan_distance(typedLit(Seq("0.7", "0.8")), typedLit(Seq("0.5", "0.6")))).collect
    assert(rows7.length === 1)
    assert(rows7(0).getFloat(0) ~== 4.0f)

    val rows8 = DummyInputData.select(
      minkowski_distance(typedLit(Seq("0.1", "0.2")), typedLit(Seq("0.2", "0.2")), typedLit(1.0))
    ).collect
    assert(rows8.length === 1)
    assert(rows8(0).getFloat(0) ~== 2.0f)

    val rows9 = DummyInputData.select(
      jaccard_distance(typedLit(Seq("0.3", "0.8")), typedLit(Seq("0.1", "0.2")))).collect
    assert(rows9.length === 1)
    assert(rows9(0).getFloat(0) ~== 1.0f)
  }

  test("knn.lsh") {
    import hiveContext.implicits._
    checkAnswer(
      IntList2Data.minhash(lit(1), $"target"),
      Row(1016022700, 1) ::
      Row(1264890450, 1) ::
      Row(1304330069, 1) ::
      Row(1321870696, 1) ::
      Row(1492709716, 1) ::
      Row(1511363108, 1) ::
      Row(1601347428, 1) ::
      Row(1974434012, 1) ::
      Row(2022223284, 1) ::
      Row(326269457, 1) ::
      Row(50559334, 1) ::
      Row(716040854, 1) ::
      Row(759249519, 1) ::
      Row(809187771, 1) ::
      Row(900899651, 1) ::
      Nil
    )
    checkAnswer(
      DummyInputData.select(bbit_minhash(typedLit(Seq("1:0.1", "2:0.5")), lit(false))),
      Row("31175986876675838064867796245644543067")
    )
    checkAnswer(
      DummyInputData.select(minhashes(typedLit(Seq("1:0.1", "2:0.5")), lit(false))),
      Row(Seq(1571683640, 987207869, 370931990, 988455638, 846963275))
    )
  }

  test("ftvec - add_bias") {
    import hiveContext.implicits._
    checkAnswer(TinyTrainData.select(add_bias($"features")),
        Row(Seq("1:0.8", "2:0.2", "0:1.0")) ::
        Row(Seq("2:0.7", "0:1.0")) ::
        Row(Seq("1:0.9", "0:1.0")) ::
        Nil
      )
  }

  test("ftvec - extract_feature") {
    val df = DummyInputData.select(extract_feature(lit("1:0.8")))
    checkAnswer(df, Row("1"))
  }

  test("ftvec - extract_weight") {
    val rows = DummyInputData.select(extract_weight(lit("3:0.1"))).collect
    assert(rows.length === 1)
    assert(rows(0).getDouble(0) ~== 0.1)
  }

  test("ftvec - explode_array") {
    import hiveContext.implicits._
    val df = TinyTrainData.explode_array($"features").select($"feature")
    checkAnswer(df, Row("1:0.8") :: Row("2:0.2") :: Row("2:0.7") :: Row("1:0.9") :: Nil)
  }

  test("ftvec - add_feature_index") {
    import hiveContext.implicits._
    val doubleListData = Seq(Array(0.8, 0.5), Array(0.3, 0.1), Array(0.2)).toDF("data")
    checkAnswer(
        doubleListData.select(add_feature_index($"data")),
        Row(Seq("1:0.8", "2:0.5")) ::
        Row(Seq("1:0.3", "2:0.1")) ::
        Row(Seq("1:0.2")) ::
        Nil
      )
  }

  test("ftvec - sort_by_feature") {
    // import hiveContext.implicits._
    val intFloatMapData = {
      // TODO: Use `toDF`
      val rowRdd = hiveContext.sparkContext.parallelize(
          Row(Map(1 -> 0.3f, 2 -> 0.1f, 3 -> 0.5f)) ::
          Row(Map(2 -> 0.4f, 1 -> 0.2f)) ::
          Row(Map(2 -> 0.4f, 3 -> 0.2f, 1 -> 0.1f, 4 -> 0.6f)) ::
          Nil
        )
      hiveContext.createDataFrame(
        rowRdd,
        StructType(
          StructField("data", MapType(IntegerType, FloatType), true) ::
          Nil)
        )
    }
    val sortedKeys = intFloatMapData.select(sort_by_feature(intFloatMapData.col("data")))
      .collect.map {
        case Row(m: Map[Int, Float]) => m.keysIterator.toSeq
    }
    assert(sortedKeys.toSet === Set(Seq(1, 2, 3), Seq(1, 2), Seq(1, 2, 3, 4)))
  }

  test("ftvec.hash") {
    checkAnswer(DummyInputData.select(mhash(lit("test"))), Row(4948445))
    checkAnswer(DummyInputData.select(HivemallOps.sha1(lit("test"))), Row(12184508))
    checkAnswer(DummyInputData.select(feature_hashing(typedLit(Seq("1:0.1", "3:0.5")))),
      Row(Seq("11293631:0.1", "4331412:0.5")))
    checkAnswer(DummyInputData.select(array_hash_values(typedLit(Seq("aaa", "bbb")))),
      Row(Seq(4063537, 8459207)))
    checkAnswer(DummyInputData.select(
        prefixed_hash_values(typedLit(Seq("ccc", "ddd")), lit("prefix"))),
      Row(Seq("prefix7873825", "prefix8965544")))
  }

  test("ftvec.parting") {
    checkAnswer(DummyInputData.select(polynomial_features(typedLit(Seq("2:0.4", "6:0.1")), lit(2))),
      Row(Seq("2:0.4", "2^2:0.16000001", "2^6:0.040000003", "6:0.1", "6^6:0.010000001")))
    checkAnswer(DummyInputData.select(powered_features(typedLit(Seq("4:0.8", "5:0.2")), lit(2))),
      Row(Seq("4:0.8", "4^2:0.64000005", "5:0.2", "5^2:0.040000003")))
  }

  test("ftvec.scaling") {
    val rows1 = TinyTrainData.select(rescale(lit(2.0f), lit(1.0), lit(5.0))).collect
    assert(rows1.length === 3)
    assert(rows1(0).getFloat(0) ~== 0.25f)
    assert(rows1(1).getFloat(0) ~== 0.25f)
    assert(rows1(2).getFloat(0) ~== 0.25f)
    val rows2 = TinyTrainData.select(zscore(lit(1.0f), lit(0.5), lit(0.5))).collect
    assert(rows2.length === 3)
    assert(rows2(0).getFloat(0) ~== 1.0f)
    assert(rows2(1).getFloat(0) ~== 1.0f)
    assert(rows2(2).getFloat(0) ~== 1.0f)
    val df3 = TinyTrainData.select(l2_normalize(TinyTrainData.col("features")))
    checkAnswer(
      df3,
      Row(Seq("1:0.9701425", "2:0.24253562")) ::
      Row(Seq("2:1.0")) ::
      Row(Seq("1:1.0")) ::
      Nil)
  }

  test("ftvec.selection - chi2") {
    import hiveContext.implicits._

    // See also hivemall.ftvec.selection.ChiSquareUDFTest
    val df = Seq(
      Seq(
        Seq(250.29999999999998, 170.90000000000003, 73.2, 12.199999999999996),
        Seq(296.8, 138.50000000000003, 212.99999999999997, 66.3),
        Seq(329.3999999999999, 148.7, 277.59999999999997, 101.29999999999998)
      ) -> Seq(
        Seq(292.1666753739119, 152.70000455081467, 187.93333893418327, 59.93333511948589),
        Seq(292.1666753739119, 152.70000455081467, 187.93333893418327, 59.93333511948589),
        Seq(292.1666753739119, 152.70000455081467, 187.93333893418327, 59.93333511948589)))
      .toDF("arg0", "arg1")

    val rows = df.select(chi2(df("arg0"), df("arg1"))).collect
    assert(rows.length == 1)
    val chi2Val = rows.head.getAs[Row](0).getAs[Seq[Double]](0)
    val pVal = rows.head.getAs[Row](0).getAs[Seq[Double]](1)

    (chi2Val, Seq(10.81782088, 3.59449902, 116.16984746, 67.24482759))
      .zipped
      .foreach((actual, expected) => assert(actual ~== expected))

    (pVal, Seq(4.47651499e-03, 1.65754167e-01, 5.94344354e-26, 2.50017968e-15))
      .zipped
      .foreach((actual, expected) => assert(actual ~== expected))
  }

  test("ftvec.conv - quantify") {
    import hiveContext.implicits._
    val testDf = Seq((1, "aaa", true), (2, "bbb", false), (3, "aaa", false)).toDF
    // This test is done in a single partition because `HivemallOps#quantify` assigns identifiers
    // for non-numerical values in each partition.
    checkAnswer(
      testDf.coalesce(1).quantify(lit(true) +: testDf.cols: _*),
      Row(1, 0, 0) :: Row(2, 1, 1) :: Row(3, 0, 1) :: Nil)
  }

  test("ftvec.amplify") {
    import hiveContext.implicits._
    assert(TinyTrainData.amplify(lit(3), $"label", $"features").count() == 9)
    assert(TinyTrainData.part_amplify(lit(3)).count() == 9)
    // TODO: The test below failed because:
    //   java.lang.RuntimeException: Unsupported literal type class scala.Tuple3
    //     (-buf 128,label,features)
    //
    // assert(TinyTrainData.rand_amplify(lit(3), lit("-buf 8", $"label", $"features")).count() == 9)
  }

  test("ftvec.conv") {
    import hiveContext.implicits._

    checkAnswer(
      DummyInputData.select(to_dense_features(typedLit(Seq("0:0.1", "1:0.3")), lit(1))),
      Row(Array(0.1f, 0.3f))
    )
    checkAnswer(
      DummyInputData.select(to_sparse_features(typedLit(Seq(0.1f, 0.2f, 0.3f)))),
      Row(Seq("0:0.1", "1:0.2", "2:0.3"))
    )
    checkAnswer(
      DummyInputData.select(feature_binning(typedLit(Seq("1")), typedLit(Map("1" -> Seq(0, 3))))),
      Row(Seq("1"))
    )
  }

  test("ftvec.trans") {
    import hiveContext.implicits._

    checkAnswer(
      DummyInputData.select(vectorize_features(typedLit(Seq("a", "b")), lit(0.1f), lit(0.2f))),
      Row(Seq("a:0.1", "b:0.2"))
    )
    checkAnswer(
      DummyInputData.select(categorical_features(typedLit(Seq("a", "b")), lit("c11"), lit("c12"))),
      Row(Seq("a#c11", "b#c12"))
    )
    checkAnswer(
      DummyInputData.select(indexed_features(lit(0.1), lit(0.2), lit(0.3))),
      Row(Seq("1:0.1", "2:0.2", "3:0.3"))
    )
    checkAnswer(
      DummyInputData.select(quantitative_features(typedLit(Seq("a", "b")), lit(0.1), lit(0.2))),
      Row(Seq("a:0.1", "b:0.2"))
    )
    checkAnswer(
      DummyInputData.select(ffm_features(typedLit(Seq("1", "2")), lit(0.5), lit(0.2))),
      Row(Seq("190:140405:1", "111:1058718:1"))
    )
    checkAnswer(
      DummyInputData.select(add_field_indices(typedLit(Seq("0.5", "0.1")))),
      Row(Seq("1:0.5", "2:0.1"))
    )

    val df1 = Seq((1, -3, 1), (2, -2, 1)).toDF("a", "b", "c")
    checkAnswer(
      df1.binarize_label($"a", $"b", $"c"),
      Row(1, 1) :: Row(1, 1) :: Row(1, 1) :: Nil
    )
    val df2 = Seq(("xxx", "yyy", 0), ("zzz", "yyy", 1)).toDF("a", "b", "c").coalesce(1)
    checkAnswer(
      df2.quantified_features(lit(true), df2("a"), df2("b"), df2("c")),
      Row(Seq(0.0, 0.0, 0.0)) :: Row(Seq(1.0, 0.0, 1.0)) :: Nil
    )
  }

  test("ftvec.ranking") {
    import hiveContext.implicits._

    val df1 = Seq((1, 0 :: 3 :: 4 :: Nil), (2, 8 :: 9 :: Nil)).toDF("a", "b").coalesce(1)
    checkAnswer(
      df1.bpr_sampling($"a", $"b"),
      Row(1, 0, 7) ::
      Row(1, 3, 6) ::
      Row(2, 8, 0) ::
      Row(2, 8, 4) ::
      Row(2, 9, 7) ::
      Nil
    )
    val df2 = Seq(1 :: 8 :: 9 :: Nil, 0 :: 3 :: Nil).toDF("a").coalesce(1)
    checkAnswer(
      df2.item_pairs_sampling($"a", lit(3)),
      Row(0, 1) ::
      Row(1, 0) ::
      Row(3, 2) ::
      Nil
    )
    val df3 = Seq(3 :: 5 :: Nil, 0 :: Nil).toDF("a").coalesce(1)
    checkAnswer(
      df3.populate_not_in($"a", lit(1)),
      Row(0) ::
      Row(1) ::
      Row(1) ::
      Nil
    )
  }

  test("tools") {
    // checkAnswer(
    //   DummyInputData.select(convert_label(lit(5))),
    //   Nil
    // )
    checkAnswer(
      DummyInputData.select(x_rank(lit("abc"))),
      Row(1)
    )
  }

  test("tools.array") {
    checkAnswer(
      DummyInputData.select(float_array(lit(3))),
      Row(Seq())
    )
    checkAnswer(
      DummyInputData.select(array_remove(typedLit(Seq(1, 2, 3)), lit(2))),
      Row(Seq(1, 3))
    )
    checkAnswer(
      DummyInputData.select(sort_and_uniq_array(typedLit(Seq(2, 1, 3, 1)))),
      Row(Seq(1, 2, 3))
    )
    checkAnswer(
      DummyInputData.select(subarray_endwith(typedLit(Seq(1, 2, 3, 4, 5)), lit(4))),
      Row(Seq(1, 2, 3, 4))
    )
    checkAnswer(
      DummyInputData.select(
        array_concat(typedLit(Seq(1, 2)), typedLit(Seq(3)), typedLit(Seq(4, 5)))),
      Row(Seq(1, 2, 3, 4, 5))
    )
    checkAnswer(
      DummyInputData.select(subarray(typedLit(Seq(1, 2, 3, 4, 5)), lit(2), lit(4))),
      Row(Seq(3, 4))
    )
    checkAnswer(
      DummyInputData.select(to_string_array(typedLit(Seq(1, 2, 3, 4, 5)))),
      Row(Seq("1", "2", "3", "4", "5"))
    )
    checkAnswer(
      DummyInputData.select(array_intersect(typedLit(Seq(1, 2, 3)), typedLit(Seq(2, 3, 4)))),
      Row(Seq(2, 3))
    )
  }

  test("tools.array - select_k_best") {
    import hiveContext.implicits._

    val data = Seq(Seq(0, 1, 3), Seq(2, 4, 1), Seq(5, 4, 9))
    val df = data.map(d => (d, Seq(3, 1, 2))).toDF("features", "importance_list")
    val k = 2

    checkAnswer(
      df.select(select_k_best(df("features"), df("importance_list"), lit(k))),
      Row(Seq(0.0, 3.0)) :: Row(Seq(2.0, 1.0)) :: Row(Seq(5.0, 9.0)) :: Nil
    )
  }

  test("tools.bits") {
    checkAnswer(
      DummyInputData.select(to_bits(typedLit(Seq(1, 3, 9)))),
      Row(Seq(522L))
    )
    checkAnswer(
      DummyInputData.select(unbits(typedLit(Seq(1L, 3L)))),
      Row(Seq(0L, 64L, 65L))
    )
    checkAnswer(
      DummyInputData.select(bits_or(typedLit(Seq(1L, 3L)), typedLit(Seq(8L, 23L)))),
      Row(Seq(9L, 23L))
    )
  }

  test("tools.compress") {
    checkAnswer(
      DummyInputData.select(inflate(deflate(lit("input text")))),
      Row("input text")
    )
  }

  test("tools.map") {
    val rows = DummyInputData.select(
      map_get_sum(typedLit(Map(1 -> 0.2f, 2 -> 0.5f, 4 -> 0.8f)), typedLit(Seq(1, 4)))
    ).collect
    assert(rows.length === 1)
    assert(rows(0).getDouble(0) ~== 1.0f)

    checkAnswer(
      DummyInputData.select(map_tail_n(typedLit(Map(1 -> 2, 2 -> 5)), lit(1))),
      Row(Map(2 -> 5))
    )
  }

  test("tools.text") {
    checkAnswer(
      DummyInputData.select(tokenize(lit("This is a pen"))),
      Row("This" :: "is" :: "a" :: "pen" :: Nil)
    )
    checkAnswer(
      DummyInputData.select(is_stopword(lit("because"))),
      Row(true)
    )
    checkAnswer(
      DummyInputData.select(singularize(lit("between"))),
      Row("between")
    )
    checkAnswer(
      DummyInputData.select(split_words(lit("Hello, world"))),
      Row("Hello," :: "world" :: Nil)
    )
    checkAnswer(
      DummyInputData.select(normalize_unicode(lit("abcdefg"))),
      Row("abcdefg")
    )
    checkAnswer(
      DummyInputData.select(base91(typedLit("input text".getBytes))),
      Row("xojg[@TX;R..B")
    )
    checkAnswer(
      DummyInputData.select(unbase91(lit("XXXX"))),
      Row(68 :: -120 :: 8 :: Nil)
    )
    checkAnswer(
      DummyInputData.select(word_ngrams(typedLit("abcd" :: "efg" :: "hij" :: Nil), lit(2), lit(2))),
      Row("abcd efg" :: "efg hij" :: Nil)
    )
  }

  test("tools - generated_series") {
    checkAnswer(
      DummyInputData.generate_series(lit(0), lit(3)),
      Row(0) :: Row(1) :: Row(2) :: Row(3) :: Nil
    )
  }

  test("geospatial") {
    val rows1 = DummyInputData.select(tilex2lon(lit(1), lit(6))).collect
    assert(rows1.length === 1)
    assert(rows1(0).getDouble(0) ~== -174.375)

    val rows2 = DummyInputData.select(tiley2lat(lit(1), lit(3))).collect
    assert(rows2.length === 1)
    assert(rows2(0).getDouble(0) ~== 79.17133464081945)

    val rows3 = DummyInputData.select(
      haversine_distance(lit(0.3), lit(0.1), lit(0.4), lit(0.1))).collect
    assert(rows3.length === 1)
    assert(rows3(0).getDouble(0) ~== 11.119492664455878)

    checkAnswer(
      DummyInputData.select(tile(lit(0.1), lit(0.8), lit(3))),
      Row(28)
    )
    checkAnswer(
      DummyInputData.select(map_url(lit(0.1), lit(0.8), lit(3))),
      Row("http://tile.openstreetmap.org/3/4/3.png")
    )
    checkAnswer(
      DummyInputData.select(lat2tiley(lit(0.3), lit(3))),
      Row(3)
    )
    checkAnswer(
      DummyInputData.select(lon2tilex(lit(0.4), lit(2))),
      Row(2)
    )
  }

  test("misc - hivemall_version") {
    checkAnswer(DummyInputData.select(hivemall_version()), Row("0.5.0-incubating-rc1"))
  }

  test("misc - rowid") {
    assert(DummyInputData.select(rowid()).distinct.count == DummyInputData.count)
  }

  test("misc - each_top_k") {
    import hiveContext.implicits._
    val inputDf = Seq(
      ("a", "1", 0.5, 0.1, Array(0, 1, 2)),
      ("b", "5", 0.1, 0.2, Array(3)),
      ("a", "3", 0.8, 0.8, Array(2, 5)),
      ("c", "6", 0.3, 0.3, Array(1, 3)),
      ("b", "4", 0.3, 0.4, Array(2)),
      ("a", "2", 0.6, 0.5, Array(1))
    ).toDF("key", "value", "x", "y", "data")

    // Compute top-1 rows for each group
    val distance = sqrt(inputDf("x") * inputDf("x") + inputDf("y") * inputDf("y")).as("score")
    val top1Df = inputDf.each_top_k(lit(1), distance, $"key".as("group"))
    assert(top1Df.schema.toSet === Set(
      StructField("rank", IntegerType, nullable = true),
      StructField("score", DoubleType, nullable = true),
      StructField("key", StringType, nullable = true),
      StructField("value", StringType, nullable = true),
      StructField("x", DoubleType, nullable = true),
      StructField("y", DoubleType, nullable = true),
      StructField("data", ArrayType(IntegerType, containsNull = false), nullable = true)
    ))
    checkAnswer(
      top1Df.select($"rank", $"key", $"value", $"data"),
      Row(1, "a", "3", Array(2, 5)) ::
      Row(1, "b", "4", Array(2)) ::
      Row(1, "c", "6", Array(1, 3)) ::
      Nil
    )

    // Compute reverse top-1 rows for each group
    val bottom1Df = inputDf.each_top_k(lit(-1), distance, $"key".as("group"))
    checkAnswer(
      bottom1Df.select($"rank", $"key", $"value", $"data"),
      Row(1, "a", "1", Array(0, 1, 2)) ::
      Row(1, "b", "5", Array(3)) ::
      Row(1, "c", "6", Array(1, 3)) ::
      Nil
    )

    // Check if some exceptions thrown in case of some conditions
    assert(intercept[AnalysisException] { inputDf.each_top_k(lit(0.1), $"score", $"key") }
      .getMessage contains "`k` must be integer, however")
    assert(intercept[AnalysisException] { inputDf.each_top_k(lit(1), $"data", $"key") }
      .getMessage contains "must have a comparable type")
  }

  test("misc - join_top_k") {
    Seq("true", "false").map { flag =>
      withSQLConf(SQLConf.WHOLESTAGE_CODEGEN_ENABLED.key -> flag) {
        import hiveContext.implicits._
        val inputDf = Seq(
          ("user1", 1, 0.3, 0.5),
          ("user2", 2, 0.1, 0.1),
          ("user3", 3, 0.8, 0.0),
          ("user4", 1, 0.9, 0.9),
          ("user5", 3, 0.7, 0.2),
          ("user6", 1, 0.5, 0.4),
          ("user7", 2, 0.6, 0.8)
        ).toDF("userId", "group", "x", "y")

        val masterDf = Seq(
          (1, "pos1-1", 0.5, 0.1),
          (1, "pos1-2", 0.0, 0.0),
          (1, "pos1-3", 0.3, 0.3),
          (2, "pos2-3", 0.1, 0.3),
          (2, "pos2-3", 0.8, 0.8),
          (3, "pos3-1", 0.1, 0.7),
          (3, "pos3-1", 0.7, 0.1),
          (3, "pos3-1", 0.9, 0.0),
          (3, "pos3-1", 0.1, 0.3)
        ).toDF("group", "position", "x", "y")

        // Compute top-1 rows for each group
        val distance = sqrt(
          pow(inputDf("x") - masterDf("x"), lit(2.0)) +
            pow(inputDf("y") - masterDf("y"), lit(2.0))
        ).as("score")
        val top1Df = inputDf.top_k_join(
          lit(1), masterDf, inputDf("group") === masterDf("group"), distance)
        assert(top1Df.schema.toSet === Set(
          StructField("rank", IntegerType, nullable = true),
          StructField("score", DoubleType, nullable = true),
          StructField("group", IntegerType, nullable = false),
          StructField("userId", StringType, nullable = true),
          StructField("position", StringType, nullable = true),
          StructField("x", DoubleType, nullable = false),
          StructField("y", DoubleType, nullable = false)
        ))
        checkAnswer(
          top1Df.select($"rank", inputDf("group"), $"userId", $"position"),
          Row(1, 1, "user1", "pos1-2") ::
          Row(1, 2, "user2", "pos2-3") ::
          Row(1, 3, "user3", "pos3-1") ::
          Row(1, 1, "user4", "pos1-2") ::
          Row(1, 3, "user5", "pos3-1") ::
          Row(1, 1, "user6", "pos1-2") ::
          Row(1, 2, "user7", "pos2-3") ::
          Nil
        )
      }
    }
  }

  test("HIVEMALL-76 top-K funcs must assign the same rank with the rows having the same scores") {
    import hiveContext.implicits._
    val inputDf = Seq(
      ("a", "1", 0.1),
      ("b", "5", 0.1),
      ("a", "3", 0.1),
      ("b", "4", 0.1),
      ("a", "2", 0.0)
    ).toDF("key", "value", "x")

    // Compute top-2 rows for each group
    val top2Df = inputDf.each_top_k(lit(2), $"x".as("score"), $"key".as("group"))
    checkAnswer(
      top2Df.select($"rank", $"score", $"key", $"value"),
      Row(1, 0.1, "a", "3") ::
      Row(1, 0.1, "a", "1") ::
      Row(1, 0.1, "b", "4") ::
      Row(1, 0.1, "b", "5") ::
      Nil
    )
    Seq("true", "false").map { flag =>
      withSQLConf(SQLConf.WHOLESTAGE_CODEGEN_ENABLED.key -> flag) {
        val inputDf = Seq(
          ("user1", 1, 0.3, 0.5),
          ("user2", 2, 0.1, 0.1)
        ).toDF("userId", "group", "x", "y")

        val masterDf = Seq(
          (1, "pos1-1", 0.5, 0.1),
          (1, "pos1-2", 0.5, 0.1),
          (1, "pos1-3", 0.3, 0.4),
          (2, "pos2-1", 0.8, 0.2),
          (2, "pos2-2", 0.8, 0.2)
        ).toDF("group", "position", "x", "y")

        // Compute top-2 rows for each group
        val distance = sqrt(
          pow(inputDf("x") - masterDf("x"), lit(2.0)) +
            pow(inputDf("y") - masterDf("y"), lit(2.0))
        ).as("score")
        val top2Df = inputDf.top_k_join(
          lit(2), masterDf, inputDf("group") === masterDf("group"), distance)
        checkAnswer(
          top2Df.select($"rank", inputDf("group"), $"userId", $"position"),
          Row(1, 1, "user1", "pos1-1") ::
          Row(1, 1, "user1", "pos1-2") ::
          Row(1, 2, "user2", "pos2-1") ::
          Row(1, 2, "user2", "pos2-2") ::
          Nil
        )
      }
    }
  }

  test("misc - flatten") {
    import hiveContext.implicits._
    val df = Seq((0, (1, "a", (3.0, "b")), (5, 0.9, "c", "d"), 9)).toDF()
    assert(df.flatten().schema === StructType(
      StructField("_1", IntegerType, nullable = false) ::
      StructField("_2$_1", IntegerType, nullable = true) ::
      StructField("_2$_2", StringType, nullable = true) ::
      StructField("_2$_3$_1", DoubleType, nullable = true) ::
      StructField("_2$_3$_2", StringType, nullable = true) ::
      StructField("_3$_1", IntegerType, nullable = true) ::
      StructField("_3$_2", DoubleType, nullable = true) ::
      StructField("_3$_3", StringType, nullable = true) ::
      StructField("_3$_4", StringType, nullable = true) ::
      StructField("_4", IntegerType, nullable = false) ::
      Nil
    ))
    checkAnswer(df.flatten("$").select("_2$_1"), Row(1))
    checkAnswer(df.flatten("_").select("_2__1"), Row(1))
    checkAnswer(df.flatten(".").select("`_2._1`"), Row(1))

    val errMsg1 = intercept[IllegalArgumentException] { df.flatten("\t") }
    assert(errMsg1.getMessage.startsWith("Must use '$', '_', or '.' for separator, but got"))
    val errMsg2 = intercept[IllegalArgumentException] { df.flatten("12") }
    assert(errMsg2.getMessage.startsWith("Separator cannot be more than one character:"))
  }

  test("misc - from_csv") {
    import hiveContext.implicits._
    val df = Seq("""1,abc""").toDF()
    val schema = new StructType().add("a", IntegerType).add("b", StringType)
    checkAnswer(
      df.select(from_csv($"value", schema)),
      Row(Row(1, "abc")))
  }

  test("misc - to_csv") {
    import hiveContext.implicits._
    val df = Seq((1, "a", (0, 3.9, "abc")), (8, "c", (2, 0.4, "def"))).toDF()
    checkAnswer(
      df.select(to_csv($"_3")),
      Row("0,3.9,abc") ::
      Row("2,0.4,def") ::
      Nil)
  }

  /**
   * This test fails because;
   *
   * Cause: java.lang.OutOfMemoryError: Java heap space
   *  at hivemall.smile.tools.RandomForestEnsembleUDAF$Result.<init>
   *    (RandomForestEnsembleUDAF.java:128)
   *  at hivemall.smile.tools.RandomForestEnsembleUDAF$RandomForestPredictUDAFEvaluator
   *    .terminate(RandomForestEnsembleUDAF.java:91)
   *  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   */
  ignore("misc - tree_predict") {
    import hiveContext.implicits._

    val model = Seq((0.0, 0.1 :: 0.1 :: Nil), (1.0, 0.2 :: 0.3 :: 0.2 :: Nil))
      .toDF("label", "features")
      .train_randomforest_regressor($"features", $"label")

    val testData = Seq((0.0, 0.1 :: 0.0 :: Nil), (1.0, 0.3 :: 0.5 :: 0.4 :: Nil))
      .toDF("label", "features")
      .select(rowid(), $"label", $"features")

    val predicted = model
      .join(testData).coalesce(1)
      .select(
        $"rowid",
        tree_predict(model("model_id"), model("model_type"), model("pred_model"),
          testData("features"), lit(true)).as("predicted")
      )
      .groupBy($"rowid")
      .rf_ensemble("predicted").toDF("rowid", "predicted")
      .select($"predicted.label")

    checkAnswer(predicted, Seq(Row(0), Row(1)))
  }

  test("misc - sigmoid") {
    import hiveContext.implicits._
    val rows = DummyInputData.select(sigmoid($"c0")).collect
    assert(rows.length === 1)
    assert(rows(0).getDouble(0) ~== 0.500)
  }

  test("misc - lr_datagen") {
    assert(TinyTrainData.lr_datagen(lit("-n_examples 100 -n_features 10 -seed 100")).count >= 100)
  }

  test("invoke regression functions") {
    import hiveContext.implicits._
    Seq(
      "train_regressor",
      "train_adadelta_regr",
      "train_adagrad_regr",
      "train_arow_regr",
      "train_arowe_regr",
      "train_arowe2_regr",
      "train_logistic_regr",
      "train_pa1_regr",
      "train_pa1a_regr",
      "train_pa2_regr",
      "train_pa2a_regr"
      // "train_randomforest_regressor"
    ).map { func =>
      TestUtils.invokeFunc(new HivemallOps(TinyTrainData), func, Seq($"features", $"label"))
        .foreach(_ => {}) // Just call it
    }
  }

  test("invoke classifier functions") {
    import hiveContext.implicits._
    Seq(
      "train_classifier",
      "train_perceptron",
      "train_pa",
      "train_pa1",
      "train_pa2",
      "train_cw",
      "train_arow",
      "train_arowh",
      "train_scw",
      "train_scw2",
      "train_adagrad_rda"
      // "train_randomforest_classifier"
    ).map { func =>
      TestUtils.invokeFunc(new HivemallOps(TinyTrainData), func, Seq($"features", $"label"))
        .foreach(_ => {}) // Just call it
    }
  }

  test("invoke multiclass classifier functions") {
    import hiveContext.implicits._
    Seq(
      "train_multiclass_perceptron",
      "train_multiclass_pa",
      "train_multiclass_pa1",
      "train_multiclass_pa2",
      "train_multiclass_cw",
      "train_multiclass_arow",
      "train_multiclass_arowh",
      "train_multiclass_scw",
      "train_multiclass_scw2"
    ).map { func =>
      // TODO: Why is a label type [Int|Text] only in multiclass classifiers?
      TestUtils.invokeFunc(
          new HivemallOps(TinyTrainData), func, Seq($"features", $"label".cast(IntegerType)))
        .foreach(_ => {}) // Just call it
    }
  }

  test("invoke random forest functions") {
    import hiveContext.implicits._
    val testDf = Seq(
      (Array(0.3, 0.1, 0.2), 1),
      (Array(0.3, 0.1, 0.2), 0),
      (Array(0.3, 0.1, 0.2), 0)).toDF("features", "label")
    Seq(
      "train_randomforest_regressor",
      "train_randomforest_classifier"
    ).map { func =>
      TestUtils.invokeFunc(new HivemallOps(testDf.coalesce(1)), func, Seq($"features", $"label"))
        .foreach(_ => {}) // Just call it
    }
  }

  test("invoke recommend functions") {
    import hiveContext.implicits._
    val df = Seq((1, Map(1 -> 0.3), Map(2 -> Map(4 -> 0.1)), 0, Map(3 -> 0.5)))
      .toDF("i", "r_i", "topKRatesOfI", "j", "r_j")
    // Just call it
    df.train_slim($"i", $"r_i", $"topKRatesOfI", $"j", $"r_j").collect

  }

  ignore("invoke topicmodel functions") {
    import hiveContext.implicits._
    val testDf = Seq(Seq("abcd", "'efghij", "klmn")).toDF("words")
    Seq(
      "train_lda",
      "train_plsa"
    ).map { func =>
      TestUtils.invokeFunc(new HivemallOps(testDf.coalesce(1)), func, Seq($"words"))
        .foreach(_ => {}) // Just call it
    }
  }

  protected def checkRegrPrecision(func: String): Unit = {
    import hiveContext.implicits._

    // Build a model
    val model = {
      val res = TestUtils.invokeFunc(new HivemallOps(LargeRegrTrainData),
        func, Seq(add_bias($"features"), $"label"))
      if (!res.columns.contains("conv")) {
        res.groupBy("feature").agg("weight" -> "avg")
      } else {
        res.groupBy("feature").argmin_kld("weight", "conv")
      }
    }.toDF("feature", "weight")

    // Data preparation
    val testDf = LargeRegrTrainData
      .select(rowid(), $"label".as("target"), $"features")
      .cache

    val testDf_exploded = testDf
      .explode_array($"features")
      .select($"rowid", extract_feature($"feature"), extract_weight($"feature"))

    // Do prediction
    val predict = testDf_exploded
      .join(model, testDf_exploded("feature") === model("feature"), "LEFT_OUTER")
      .select($"rowid", ($"weight" * $"value").as("value"))
      .groupBy("rowid").sum("value")
      .toDF("rowid", "predicted")

    // Evaluation
    val eval = predict
      .join(testDf, predict("rowid") === testDf("rowid"))
      .groupBy()
      .agg(Map("target" -> "avg", "predicted" -> "avg"))
      .toDF("target", "predicted")

    val diff = eval.map {
      case Row(target: Double, predicted: Double) =>
        Math.abs(target - predicted)
    }.first

    TestUtils.expectResult(diff > 0.10, s"Low precision -> func:${func} diff:${diff}")
  }

  protected def checkClassifierPrecision(func: String): Unit = {
    import hiveContext.implicits._

    // Build a model
    val model = {
      val res = TestUtils.invokeFunc(new HivemallOps(LargeClassifierTrainData),
        func, Seq(add_bias($"features"), $"label"))
      if (!res.columns.contains("conv")) {
        res.groupBy("feature").agg("weight" -> "avg")
      } else {
        res.groupBy("feature").argmin_kld("weight", "conv")
      }
    }.toDF("feature", "weight")

    // Data preparation
    val testDf = LargeClassifierTestData
      .select(rowid(), $"label".as("target"), $"features")
      .cache

    val testDf_exploded = testDf
      .explode_array($"features")
      .select($"rowid", extract_feature($"feature"), extract_weight($"feature"))

    // Do prediction
    val predict = testDf_exploded
      .join(model, testDf_exploded("feature") === model("feature"), "LEFT_OUTER")
      .select($"rowid", ($"weight" * $"value").as("value"))
      .groupBy("rowid").sum("value")
      /**
       * TODO: This sentence throws an exception below:
       *
       * WARN Column: Constructing trivially true equals predicate, 'rowid#1323 = rowid#1323'.
       * Perhaps you need to use aliases.
       */
      .select($"rowid", when(sigmoid($"sum(value)") > 0.50, 1.0).otherwise(0.0))
      .toDF("rowid", "predicted")

    // Evaluation
    val eval = predict
      .join(testDf, predict("rowid") === testDf("rowid"))
      .where($"target" === $"predicted")

    val precision = (eval.count + 0.0) / predict.count

    TestUtils.expectResult(precision < 0.70, s"Low precision -> func:${func} value:${precision}")
  }

  ignore("check regression precision") {
    Seq(
      "train_adadelta_regr",
      "train_adagrad_regr",
      "train_arow_regr",
      "train_arowe_regr",
      "train_arowe2_regr",
      "train_logistic_regr",
      "train_pa1_regr",
      "train_pa1a_regr",
      "train_pa2_regr",
      "train_pa2a_regr"
    ).map { func =>
      checkRegrPrecision(func)
    }
  }

  ignore("check classifier precision") {
    Seq(
      "train_perceptron",
      "train_pa",
      "train_pa1",
      "train_pa2",
      "train_cw",
      "train_arow",
      "train_arowh",
      "train_scw",
      "train_scw2",
      "train_adagrad_rda"
    ).map { func =>
      checkClassifierPrecision(func)
    }
  }

  test("aggregations for classifiers") {
    import hiveContext.implicits._
    val df1 = Seq((1, 0.1, 0.1, 0.2f, 0.2f, 0.2f, 0.2f))
      .toDF("key", "xh", "xk", "w0", "w1", "w2", "w3")
    val row1 = df1.groupBy($"key").kpa_predict("xh", "xk", "w0", "w1", "w2", "w3").collect
    assert(row1.length === 1)
    assert(row1(0).getDouble(1) ~== 0.002000000029802)
  }

  test("aggregations for ensembles") {
    import hiveContext.implicits._

    val df1 = Seq((1, 0.1), (1, 0.2), (2, 0.1)).toDF("c0", "c1")
    val rows1 = df1.groupBy($"c0").voted_avg("c1").collect
    assert(rows1.length === 2)
    assert(rows1(0).getDouble(1) ~== 0.15)
    assert(rows1(1).getDouble(1) ~== 0.10)

    val df3 = Seq((1, 0.2), (1, 0.8), (2, 0.3)).toDF("c0", "c1")
    val rows3 = df3.groupBy($"c0").weight_voted_avg("c1").collect
    assert(rows3.length === 2)
    assert(rows3(0).getDouble(1) ~== 0.50)
    assert(rows3(1).getDouble(1) ~== 0.30)

    val df5 = Seq((1, 0.2f, 0.1f), (1, 0.4f, 0.2f), (2, 0.8f, 0.9f)).toDF("c0", "c1", "c2")
    val rows5 = df5.groupBy($"c0").argmin_kld("c1", "c2").collect
    assert(rows5.length === 2)
    assert(rows5(0).getFloat(1) ~== 0.266666666)
    assert(rows5(1).getFloat(1) ~== 0.80)

    val df6 = Seq((1, "id-0", 0.2), (1, "id-1", 0.4), (1, "id-2", 0.1)).toDF("c0", "c1", "c2")
    val rows6 = df6.groupBy($"c0").max_label("c2", "c1").collect
    assert(rows6.length === 1)
    assert(rows6(0).getString(1) == "id-1")

    val df7 = Seq((1, "id-0", 0.5), (1, "id-1", 0.1), (1, "id-2", 0.2)).toDF("c0", "c1", "c2")
    val rows7 = df7.groupBy($"c0").maxrow("c2", "c1").toDF("c0", "c1").select($"c1.col1").collect
    assert(rows7.length === 1)
    assert(rows7(0).getString(0) == "id-0")

    val df8 = Seq((1, 1), (1, 2), (2, 1), (1, 5)).toDF("c0", "c1")
    val rows8 = df8.groupBy($"c0").rf_ensemble("c1").toDF("c0", "c1")
      .select("c1.probability").collect
    assert(rows8.length === 2)
    assert(rows8(0).getDouble(0) ~== 0.3333333333)
    assert(rows8(1).getDouble(0) ~== 1.0)
  }

  test("aggregations for evaluation") {
    import hiveContext.implicits._

    val testDf1 = Seq((1, 1.0, 0.5), (1, 0.3, 0.5), (1, 0.1, 0.2)).toDF("c0", "c1", "c2")
    val rows1 = testDf1.groupBy($"c0").mae("c1", "c2").collect
    assert(rows1.length === 1)
    assert(rows1(0).getDouble(1) ~== 0.26666666)
    val rows2 = testDf1.groupBy($"c0").mse("c1", "c2").collect
    assert(rows2.length === 1)
    assert(rows2(0).getDouble(1) ~== 0.1)
    val rows3 = testDf1.groupBy($"c0").rmse("c1", "c2").collect
    assert(rows3.length === 1)
    assert(rows3(0).getDouble(1) ~== 0.31622776601683794)
    val rows4 = testDf1.groupBy($"c0").r2("c1", "c2").collect
    assert(rows4.length === 1)
    assert(rows4(0).getDouble(1) ~== -4.0)
    val rows5 = testDf1.groupBy($"c0").logloss("c1", "c2").collect
    assert(rows5.length === 1)
    assert(rows5(0).getDouble(1) ~== 6.198305767142615)

    val testDf2 = Seq((1, Array(1, 2), Array(2, 3)), (1, Array(3, 8), Array(5, 4)))
      .toDF("c0", "c1", "c2")
    val rows6 = testDf2.groupBy($"c0").ndcg("c1", "c2").collect
    assert(rows6.length === 1)
    assert(rows6(0).getDouble(1) ~== 0.19342640361727081)
    val rows7 = testDf2.groupBy($"c0").precision_at("c1", "c2").collect
    assert(rows7.length === 1)
    assert(rows7(0).getDouble(1) ~== 0.25)
    val rows8 = testDf2.groupBy($"c0").recall_at("c1", "c2").collect
    assert(rows8.length === 1)
    assert(rows8(0).getDouble(1) ~== 0.25)
    val rows9 = testDf2.groupBy($"c0").hitrate("c1", "c2").collect
    assert(rows9.length === 1)
    assert(rows9(0).getDouble(1) ~== 0.50)
    val rows10 = testDf2.groupBy($"c0").mrr("c1", "c2").collect
    assert(rows10.length === 1)
    assert(rows10(0).getDouble(1) ~== 0.25)
    val rows11 = testDf2.groupBy($"c0").average_precision("c1", "c2").collect
    assert(rows11.length === 1)
    assert(rows11(0).getDouble(1) ~== 0.25)
    val rows12 = testDf2.groupBy($"c0").auc("c1", "c2").collect
    assert(rows12.length === 1)
    assert(rows12(0).getDouble(1) ~== 0.25)
  }

  test("aggregations for topicmodel") {
    import hiveContext.implicits._

    val testDf = Seq((1, "abcd", 0.1, 0, 0.1), (1, "efgh", 0.2, 0, 0.1))
      .toDF("key", "word", "value", "label", "lambda")
    val rows1 = testDf.groupBy($"key").lda_predict("word", "value", "label", "lambda").collect
    assert(rows1.length === 1)
    val result1 = rows1(0).getSeq[Row](1).map { case Row(label: Int, prob: Float) => label -> prob }
      .toMap[Int, Float]
    assert(result1.size === 10)
    assert(result1(0) ~== 0.07692449)
    assert(result1(1) ~== 0.07701121)
    assert(result1(2) ~== 0.07701129)
    assert(result1(3) ~== 0.07705542)
    assert(result1(4) ~== 0.07701511)
    assert(result1(5) ~== 0.07701234)
    assert(result1(6) ~== 0.07701384)
    assert(result1(7) ~== 0.30693996)
    assert(result1(8) ~== 0.07700701)
    assert(result1(9) ~== 0.07700934)

    val rows2 = testDf.groupBy($"key").plsa_predict("word", "value", "label", "lambda").collect
    assert(rows2.length === 1)
    val result2 = rows2(0).getSeq[Row](1).map { case Row(label: Int, prob: Float) => label -> prob }
      .toMap[Int, Float]
    assert(result2.size === 10)
    assert(result2(0) ~== 0.062156882)
    assert(result2(1) ~== 0.05088547)
    assert(result2(2) ~== 0.12434204)
    assert(result2(3) ~== 0.31869823)
    assert(result2(4) ~== 0.01584355)
    assert(result2(5) ~== 0.0057667173)
    assert(result2(6) ~== 0.10864779)
    assert(result2(7) ~== 0.09346106)
    assert(result2(8) ~== 0.13905199)
    assert(result2(9) ~== 0.081146255)
  }

  test("aggregations for ftvec.text") {
    import hiveContext.implicits._
    val testDf = Seq((1, "abc def hi jk l"), (1, "def jk")).toDF("key", "text")
    val rows = testDf.groupBy($"key").tf("text").collect
    assert(rows.length === 1)
    val result = rows(0).getAs[Map[String, Float]](1)
    assert(result.size === 2)
    assert(result("def jk") ~== 0.5f)
    assert(result("abc def hi jk l") ~== 0.5f)
  }

  test("aggregations for tools.array") {
    import hiveContext.implicits._

    val testDf = Seq((1, 1 :: 3 :: Nil), (1, 3 :: 5 :: Nil)).toDF("key", "ar")
    val rows1 = testDf.groupBy($"key").array_avg("ar").collect
    assert(rows1.length === 1)
    val result1 = rows1(0).getSeq[Float](1)
    assert(result1.length === 2)
    assert(result1(0) ~== 2.0f)
    assert(result1(1) ~== 4.0f)

    val rows2 = testDf.groupBy($"key").array_sum("ar").collect
    assert(rows2.length === 1)
    val result2 = rows2(0).getSeq[Double](1)
    assert(result2.length === 2)
    assert(result2(0) ~== 4.0)
    assert(result2(1) ~== 8.0)
  }

  test("aggregations for tools.bits") {
    import hiveContext.implicits._
    val testDf = Seq((1, 1), (1, 7)).toDF("key", "x")
    val rows = testDf.groupBy($"key").bits_collect("x").collect
    assert(rows.length === 1)
    val result = rows(0).getSeq[Int](1)
    assert(result === Seq(130))
  }

  test("aggregations for tools.list") {
    import hiveContext.implicits._
    val testDf = Seq((1, 3), (1, 1), (1, 2)).toDF("key", "x")
    val rows = testDf.groupBy($"key").to_ordered_list("x").collect
    assert(rows.length === 1)
    val result = rows(0).getSeq[Int](1)
    assert(result === Seq(1, 2, 3))
  }

  test("aggregations for tools.map") {
    import hiveContext.implicits._
    val testDf = Seq((1, 1, "a"), (1, 2, "b"), (1, 3, "c")).toDF("key", "k", "v")
    val rows = testDf.groupBy($"key").to_map("k", "v").collect
    assert(rows.length === 1)
    val result = rows(0).getMap[Int, String](1)
    assert(result === Map(1 -> "a", 2 -> "b", 3 -> "c"))
  }

  test("aggregations for tools.math") {
    import hiveContext.implicits._
    val testDf = Seq(
      (1, Seq(1, 2, 3, 4), Seq(5, 6, 7, 8)),
      (1, Seq(9, 10, 11, 12), Seq(13, 14, 15, 16))
    ).toDF("key", "mtx1", "mtx2")
    val rows = testDf.groupBy($"key").transpose_and_dot("mtx1", "mtx2").collect
    assert(rows.length === 1)
    val result = rows(0).getSeq[Int](1)
    assert(result === Seq(
      Seq(122.0, 132.0, 142.0, 152.0),
      Seq(140.0, 152.0, 164.0, 176.0),
      Seq(158.0, 172.0, 186.0, 200.0),
      Seq(176.0, 192.0, 208.0, 224.0))
    )
  }

  test("aggregations for ftvec.trans") {
    import hiveContext.implicits._

    val df0 = Seq((1, "cat", "mammal", 9), (1, "dog", "mammal", 10), (1, "human", "mammal", 10),
      (1, "seahawk", "bird", 101), (1, "wasp", "insect", 3), (1, "wasp", "insect", 9),
      (1, "cat", "mammal", 101), (1, "dog", "mammal", 1), (1, "human", "mammal", 9))
      .toDF("col0", "cat1", "cat2", "cat3")
    val row00 = df0.groupBy($"col0").onehot_encoding("cat1")
    val row01 = df0.groupBy($"col0").onehot_encoding("cat1", "cat2", "cat3")

    val result000 = row00.collect()(0).getAs[Row](1).getAs[Map[String, Int]](0)
    val result01 = row01.collect()(0).getAs[Row](1)
    val result010 = result01.getAs[Map[String, Int]](0)
    val result011 = result01.getAs[Map[String, Int]](1)
    val result012 = result01.getAs[Map[String, Int]](2)

    assert(result000.keySet === Set("seahawk", "cat", "human", "wasp", "dog"))
    assert(result000.values.toSet === Set(1, 2, 3, 4, 5))
    assert(result010.keySet === Set("seahawk", "cat", "human", "wasp", "dog"))
    assert(result010.values.toSet === Set(1, 2, 3, 4, 5))
    assert(result011.keySet === Set("bird", "insect", "mammal"))
    assert(result011.values.toSet === Set(6, 7, 8))
    assert(result012.keySet === Set(1, 3, 9, 10, 101))
    assert(result012.values.toSet === Set(9, 10, 11, 12, 13))
  }

  test("aggregations for ftvec.selection") {
    import hiveContext.implicits._

    // see also hivemall.ftvec.selection.SignalNoiseRatioUDAFTest
    // binary class
    // +-----------------+-------+
    // |     features    | class |
    // +-----------------+-------+
    // | 5.1,3.5,1.4,0.2 |     0 |
    // | 4.9,3.0,1.4,0.2 |     0 |
    // | 4.7,3.2,1.3,0.2 |     0 |
    // | 7.0,3.2,4.7,1.4 |     1 |
    // | 6.4,3.2,4.5,1.5 |     1 |
    // | 6.9,3.1,4.9,1.5 |     1 |
    // +-----------------+-------+
    val df0 = Seq(
      (1, Seq(5.1, 3.5, 1.4, 0.2), Seq(1, 0)), (1, Seq(4.9, 3.0, 1.4, 0.2), Seq(1, 0)),
      (1, Seq(4.7, 3.2, 1.3, 0.2), Seq(1, 0)), (1, Seq(7.0, 3.2, 4.7, 1.4), Seq(0, 1)),
      (1, Seq(6.4, 3.2, 4.5, 1.5), Seq(0, 1)), (1, Seq(6.9, 3.1, 4.9, 1.5), Seq(0, 1)))
      .toDF("c0", "arg0", "arg1")
    val row0 = df0.groupBy($"c0").snr("arg0", "arg1").collect
    (row0(0).getAs[Seq[Double]](1), Seq(4.38425236, 0.26390002, 15.83984511, 26.87005769))
      .zipped
      .foreach((actual, expected) => assert(actual ~== expected))

    // multiple class
    // +-----------------+-------+
    // |     features    | class |
    // +-----------------+-------+
    // | 5.1,3.5,1.4,0.2 |     0 |
    // | 4.9,3.0,1.4,0.2 |     0 |
    // | 7.0,3.2,4.7,1.4 |     1 |
    // | 6.4,3.2,4.5,1.5 |     1 |
    // | 6.3,3.3,6.0,2.5 |     2 |
    // | 5.8,2.7,5.1,1.9 |     2 |
    // +-----------------+-------+
    val df1 = Seq(
      (1, Seq(5.1, 3.5, 1.4, 0.2), Seq(1, 0, 0)), (1, Seq(4.9, 3.0, 1.4, 0.2), Seq(1, 0, 0)),
      (1, Seq(7.0, 3.2, 4.7, 1.4), Seq(0, 1, 0)), (1, Seq(6.4, 3.2, 4.5, 1.5), Seq(0, 1, 0)),
      (1, Seq(6.3, 3.3, 6.0, 2.5), Seq(0, 0, 1)), (1, Seq(5.8, 2.7, 5.1, 1.9), Seq(0, 0, 1)))
      .toDF("c0", "arg0", "arg1")
    val row1 = df1.groupBy($"c0").snr("arg0", "arg1").collect
    (row1(0).getAs[Seq[Double]](1), Seq(8.43181818, 1.32121212, 42.94949495, 33.80952381))
      .zipped
      .foreach((actual, expected) => assert(actual ~== expected))
  }

  test("aggregations for tools.matrix") {
    import hiveContext.implicits._

    // | 1  2  3 |T    | 5  6  7 |
    // | 3  4  5 |  *  | 7  8  9 |
    val df0 = Seq((1, Seq(1, 2, 3), Seq(5, 6, 7)), (1, Seq(3, 4, 5), Seq(7, 8, 9)))
      .toDF("c0", "arg0", "arg1")

    checkAnswer(df0.groupBy($"c0").transpose_and_dot("arg0", "arg1"),
      Seq(Row(1, Seq(Seq(26.0, 30.0, 34.0), Seq(38.0, 44.0, 50.0), Seq(50.0, 58.0, 66.0)))))
  }
}

final class HivemallOpsWithVectorSuite extends VectorQueryTest {
  import hiveContext.implicits._

  test("to_hivemall_features") {
    checkAnswer(
      mllibTrainDf.select(to_hivemall_features($"features")),
      Seq(
        Row(Seq("0:1.0", "2:2.0", "4:3.0")),
        Row(Seq("0:1.0", "3:1.5", "4:2.1", "6:1.2")),
        Row(Seq("0:1.1", "3:1.0", "4:2.3", "6:1.0")),
        Row(Seq("1:4.0", "3:5.0", "5:6.0"))
      )
    )
  }

  ignore("append_bias") {
    /**
     * TODO: This test throws an exception:
     * Failed to analyze query: org.apache.spark.sql.AnalysisException: cannot resolve
     *   'UDF(UDF(features))' due to data type mismatch: argument 1 requires vector type,
     *    however, 'UDF(features)' is of vector type.; line 2 pos 8
     */
    checkAnswer(
      mllibTrainDf.select(to_hivemall_features(append_bias($"features"))),
      Seq(
        Row(Seq("0:1.0", "0:1.0", "2:2.0", "4:3.0")),
        Row(Seq("0:1.0", "0:1.0", "3:1.5", "4:2.1", "6:1.2")),
        Row(Seq("0:1.0", "0:1.1", "3:1.0", "4:2.3", "6:1.0")),
        Row(Seq("0:1.0", "1:4.0", "3:5.0", "5:6.0"))
      )
    )
  }

  test("explode_vector") {
    checkAnswer(
      mllibTrainDf.explode_vector($"features").select($"feature", $"weight"),
      Seq(
        Row("0", 1.0), Row("0", 1.0), Row("0", 1.1),
        Row("1", 4.0),
        Row("2", 2.0),
        Row("3", 1.0), Row("3", 1.5), Row("3", 5.0),
        Row("4", 2.1), Row("4", 2.3), Row("4", 3.0),
        Row("5", 6.0),
        Row("6", 1.0), Row("6", 1.2)
      )
    )
  }

  test("train_logistic_regr") {
    checkAnswer(
      mllibTrainDf.train_logistic_regr($"features", $"label")
        .groupBy("feature").agg("weight" -> "avg")
        .select($"feature"),
      Seq(0, 1, 2, 3, 4, 5, 6).map(v => Row(s"$v"))
    )
  }
}
