You are viewing a plain text version of this content. The canonical link for it is here.
Posted to reviews@spark.apache.org by dongjoon-hyun <gi...@git.apache.org> on 2017/12/04 21:35:16 UTC

[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

GitHub user dongjoon-hyun opened a pull request:

    https://github.com/apache/spark/pull/19882

    [SPARK-22672][SQL][TEST] Refactor ORC Tests

    ## What changes were proposed in this pull request?
    
    Since SPARK-20682, we have two `OrcFileFormat`s. This PR refactors ORC tests with the following two principles.
    - Move test suite into `sql/core`.
    - Create `HiveXXX` test suite in `sql/hive` by reusing `sql/core` test suite.
    
    OrcFileFormat in `sql/core` | OrcFileFormat in `sql/hive`
    -- | --
    OrcFilterSuite | HiveOrcFilterSuite
    OrcHadoopFsRelationSuite | HiveOrcHadoopFsRelationSuite
    OrcPartitionDiscoverySuite | HiveOrcPartitionDiscoverySuite
    OrcQuerySuite | HiveOrcQuerySuite
    OrcSourceSuite | HiveOrcSourceSuite
    
    Note that `OrcHadoopFsRelationSuite` is inside `sql/hive` like `ParquetHadoopFsRelationSuite`.
    
    ## How was this patch tested?
    
    Pass the Jenkins tests with reorganized test suites.


You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/dongjoon-hyun/spark SPARK-22672

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/spark/pull/19882.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #19882
    
----
commit 5f2025ada40d146411b5e14ddf37f3fccc4cae97
Author: Dongjoon Hyun <do...@apache.org>
Date:   2017-08-18T19:13:15Z

    [SPARK-22672][SQL][TEST] Refactor ORC Tests

----


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Hi, @cloud-fan , @gatorsmile , @HyukjinKwon , @viirya .
    This is a test case restructure after https://github.com/apache/spark/pull/19651 .


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by HyukjinKwon <gi...@git.apache.org>.
Github user HyukjinKwon commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    I actually suggested similarly before:
    
    ```
    org.apache.spark.sql.execution.datasources.csv.InferSchema
    org.apache.spark.sql.execution.datasources.json.InferSchema
    ```
    
    but I actually received an advise at that time and it became as below: 
    
    ```
    org.apache.spark.sql.execution.datasources.csv.CSVInferSchema
    org.apache.spark.sql.execution.datasources.json.JsonInferSchema
    ```
    
    I actually liked `Hive` prefix it was easier to distinguish.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    **[Test build #84581 has finished](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/84581/testReport)** for PR 19882 at commit [`fcb2ccb`](https://github.com/apache/spark/commit/fcb2ccb64813f0fc37e3321c006937fb9cb870e4).
     * This patch passes all tests.
     * This patch merges cleanly.
     * This patch adds no public classes.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    **[Test build #84589 has started](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/84589/testReport)** for PR 19882 at commit [`1828571`](https://github.com/apache/spark/commit/18285717edcbefe9a79d51a6fdcb112c3d0bc5c4).


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155390445
  
    --- Diff: sql/hive/src/test/scala/org/apache/spark/sql/hive/orc/HiveOrcQuerySuite.scala ---
    @@ -0,0 +1,165 @@
    +/*
    + * 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.orc
    +
    +import org.apache.spark.sql.AnalysisException
    +import org.apache.spark.sql.catalyst.catalog.HiveTableRelation
    +import org.apache.spark.sql.execution.datasources.{HadoopFsRelation, LogicalRelation}
    +import org.apache.spark.sql.execution.datasources.orc.OrcQueryTest
    +import org.apache.spark.sql.hive.HiveUtils
    +import org.apache.spark.sql.hive.test.TestHiveSingleton
    +import org.apache.spark.sql.internal.SQLConf
    +
    +class HiveOrcQuerySuite extends OrcQueryTest with TestHiveSingleton {
    +  import testImplicits._
    +
    +  override def orcImp: String = "hive"
    +
    +  test("SPARK-8501: Avoids discovery schema from empty ORC files") {
    --- End diff --
    
    This only works in new OrcFileFormat.
    - The new test case is in `OrcQuerySuite` for new OrcFileFormat.
    - And, the old test case is `HiveOrcQuerySuite` for old OrcFileFormat.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by cloud-fan <gi...@git.apache.org>.
Github user cloud-fan commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155166536
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcPartitionDiscoverySuite.scala ---
    @@ -186,8 +159,8 @@ class OrcPartitionDiscoverySuite extends QueryTest with TestHiveSingleton with B
               makePartitionDir(base, defaultPartitionName, "pi" -> pi, "ps" -> ps))
           }
     
    -      read
    -        .option(ConfVars.DEFAULTPARTITIONNAME.varname, defaultPartitionName)
    +      spark.read
    +        .option("hive.exec.default.partition.name", defaultPartitionName)
    --- End diff --
    
    the new ORC didn't change these config names?


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Test FAILed.
    Refer to this link for build results (access rights to CI server needed): 
    https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder/84591/
    Test FAILed.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Merged build finished. Test PASSed.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    **[Test build #84591 has finished](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/84591/testReport)** for PR 19882 at commit [`f56423d`](https://github.com/apache/spark/commit/f56423dd9168e781fad6e02e2aa319d8593d98cc).
     * This patch **fails due to an unknown error code, -9**.
     * This patch merges cleanly.
     * This patch adds no public classes.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by cloud-fan <gi...@git.apache.org>.
Github user cloud-fan commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155167305
  
    --- Diff: sql/hive/src/test/scala/org/apache/spark/sql/hive/orc/HiveOrcQuerySuite.scala ---
    @@ -0,0 +1,165 @@
    +/*
    + * 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.orc
    +
    +import org.apache.spark.sql.AnalysisException
    +import org.apache.spark.sql.catalyst.catalog.HiveTableRelation
    +import org.apache.spark.sql.execution.datasources.{HadoopFsRelation, LogicalRelation}
    +import org.apache.spark.sql.execution.datasources.orc.OrcQueryTest
    +import org.apache.spark.sql.hive.HiveUtils
    +import org.apache.spark.sql.hive.test.TestHiveSingleton
    +import org.apache.spark.sql.internal.SQLConf
    +
    +class HiveOrcQuerySuite extends OrcQueryTest with TestHiveSingleton {
    +  import testImplicits._
    +
    +  override def orcImp: String = "hive"
    +
    +  test("SPARK-8501: Avoids discovery schema from empty ORC files") {
    --- End diff --
    
    why does this test not in native orc test?


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Merged build finished. Test PASSed.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Oh. I'll bring back.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by HyukjinKwon <gi...@git.apache.org>.
Github user HyukjinKwon commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Whoa big class list. Will take a look soon within tomorrow as well.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155060037
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcFilterSuite.scala ---
    @@ -0,0 +1,370 @@
    +/*
    + * 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.execution.datasources.orc
    +
    +import java.nio.charset.StandardCharsets
    +import java.sql.{Date, Timestamp}
    +
    +import scala.collection.JavaConverters._
    +
    +import org.apache.orc.storage.ql.io.sarg.{PredicateLeaf, SearchArgument}
    +
    +import org.apache.spark.sql.{Column, DataFrame}
    +import org.apache.spark.sql.catalyst.dsl.expressions._
    +import org.apache.spark.sql.catalyst.expressions._
    +import org.apache.spark.sql.catalyst.planning.PhysicalOperation
    +import org.apache.spark.sql.execution.datasources.{DataSourceStrategy, HadoopFsRelation, LogicalRelation}
    +import org.apache.spark.sql.test.SharedSQLContext
    +import org.apache.spark.sql.types._
    +
    +/**
    + * A test suite that tests Apache ORC filter API based filter pushdown optimization.
    + */
    +class OrcFilterSuite extends OrcTest with SharedSQLContext {
    --- End diff --
    
    Ur, it's impossible because of the reason I mentioned in PR description.
    > OrcFilterSuite and HiveOrcFilterSuite cannot reuse test cases due to the different function signatures using Hive 1.2.1 ORC classes and Apache ORC 1.4.1 classes.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155392637
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcTest.scala ---
    @@ -15,20 +15,51 @@
      * limitations under the License.
      */
     
    -package org.apache.spark.sql.hive.orc
    +package org.apache.spark.sql.execution.datasources.orc
     
     import java.io.File
     
     import scala.reflect.ClassTag
     import scala.reflect.runtime.universe.TypeTag
     
    +import org.scalatest.BeforeAndAfterAll
    +
     import org.apache.spark.sql._
    -import org.apache.spark.sql.hive.test.TestHiveSingleton
    +import org.apache.spark.sql.internal.SQLConf.ORC_IMPLEMENTATION
     import org.apache.spark.sql.test.SQLTestUtils
     
    -private[sql] trait OrcTest extends SQLTestUtils with TestHiveSingleton {
    +/**
    + * OrcTest
    + *   -> OrcSuite
    + *       -> OrcSourceSuite
    + *       -> HiveOrcSourceSuite
    + *   -> OrcQueryTests
    + *       -> OrcQuerySuite
    + *       -> HiveOrcQuerySuite
    + *   -> OrcPartitionDiscoveryTest
    + *       -> OrcPartitionDiscoverySuite
    + *       -> HiveOrcPartitionDiscoverySuite
    + *   -> OrcFilterSuite
    + *   -> HiveOrcFilterSuite
    + */
    +abstract class OrcTest extends QueryTest with SQLTestUtils with BeforeAndAfterAll {
       import testImplicits._
     
    +  def orcImp: String = "native"
    --- End diff --
    
    Yep. Done.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    **[Test build #84524 has started](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/84524/testReport)** for PR 19882 at commit [`baec5fe`](https://github.com/apache/spark/commit/baec5fece95896a28127cd2ac014582874ed5e28).


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by HyukjinKwon <gi...@git.apache.org>.
Github user HyukjinKwon commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    I meant in https://github.com/apache/spark/pull/19882#pullrequestreview-81708676, I liked this `Hive` prefix here so wondered if we could do the same thing for the main codes too. Since this PR only refactors the tests, it's loosely related though.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155391390
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcSourceSuite.scala ---
    @@ -225,57 +162,39 @@ abstract class OrcSuite extends QueryTest with TestHiveSingleton with BeforeAndA
       }
     }
     
    -class OrcSourceSuite extends OrcSuite {
    -  override def beforeAll(): Unit = {
    +class OrcSourceSuite extends OrcSuite with SharedSQLContext {
    +
    +  protected override def beforeAll(): Unit = {
    --- End diff --
    
    The test cases of OrcSuite assume these tables.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by gatorsmile <gi...@git.apache.org>.
Github user gatorsmile commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155058455
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcFilterSuite.scala ---
    @@ -0,0 +1,370 @@
    +/*
    + * 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.execution.datasources.orc
    +
    +import java.nio.charset.StandardCharsets
    +import java.sql.{Date, Timestamp}
    +
    +import scala.collection.JavaConverters._
    +
    +import org.apache.orc.storage.ql.io.sarg.{PredicateLeaf, SearchArgument}
    +
    +import org.apache.spark.sql.{Column, DataFrame}
    +import org.apache.spark.sql.catalyst.dsl.expressions._
    +import org.apache.spark.sql.catalyst.expressions._
    +import org.apache.spark.sql.catalyst.planning.PhysicalOperation
    +import org.apache.spark.sql.execution.datasources.{DataSourceStrategy, HadoopFsRelation, LogicalRelation}
    +import org.apache.spark.sql.test.SharedSQLContext
    +import org.apache.spark.sql.types._
    +
    +/**
    + * A test suite that tests Apache ORC filter API based filter pushdown optimization.
    + */
    +class OrcFilterSuite extends OrcTest with SharedSQLContext {
    --- End diff --
    
    Let `HiveOrcFilterSuite` extend `OrcFilterSuite`?


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by HyukjinKwon <gi...@git.apache.org>.
Github user HyukjinKwon commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155429024
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcFilterSuite.scala ---
    @@ -0,0 +1,368 @@
    +/*
    + * 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.execution.datasources.orc
    +
    +import java.nio.charset.StandardCharsets
    +import java.sql.{Date, Timestamp}
    +
    +import scala.collection.JavaConverters._
    +
    +import org.apache.orc.storage.ql.io.sarg.{PredicateLeaf, SearchArgument}
    +
    +import org.apache.spark.sql.{Column, DataFrame}
    +import org.apache.spark.sql.catalyst.dsl.expressions._
    +import org.apache.spark.sql.catalyst.expressions._
    +import org.apache.spark.sql.catalyst.planning.PhysicalOperation
    +import org.apache.spark.sql.execution.datasources.{DataSourceStrategy, HadoopFsRelation, LogicalRelation}
    +import org.apache.spark.sql.test.SharedSQLContext
    +import org.apache.spark.sql.types._
    +
    +/**
    + * A test suite that tests Apache ORC filter API based filter pushdown optimization.
    + */
    +class OrcFilterSuite extends OrcTest with SharedSQLContext {
    +
    +  private def checkFilterPredicate(
    +      df: DataFrame,
    +      predicate: Predicate,
    +      checker: (SearchArgument) => Unit): Unit = {
    +    val output = predicate.collect { case a: Attribute => a }.distinct
    +    val query = df
    +      .select(output.map(e => Column(e)): _*)
    +      .where(Column(predicate))
    +
    +    var maybeRelation: Option[HadoopFsRelation] = None
    +    val maybeAnalyzedPredicate = query.queryExecution.optimizedPlan.collect {
    +      case PhysicalOperation(_, filters, LogicalRelation(orcRelation: HadoopFsRelation, _, _, _)) =>
    +        maybeRelation = Some(orcRelation)
    +        filters
    +    }.flatten.reduceLeftOption(_ && _)
    +    assert(maybeAnalyzedPredicate.isDefined, "No filter is analyzed from the given query")
    +
    +    val (_, selectedFilters, _) =
    +      DataSourceStrategy.selectFilters(maybeRelation.get, maybeAnalyzedPredicate.toSeq)
    +    assert(selectedFilters.nonEmpty, "No filter is pushed down")
    +
    +    val maybeFilter = OrcFilters.createFilter(query.schema, selectedFilters)
    +    assert(maybeFilter.isDefined, s"Couldn't generate filter predicate for $selectedFilters")
    +    checker(maybeFilter.get)
    +  }
    +
    +  private def checkFilterPredicate
    +      (predicate: Predicate, filterOperator: PredicateLeaf.Operator)
    +      (implicit df: DataFrame): Unit = {
    +    def checkComparisonOperator(filter: SearchArgument) = {
    +      val operator = filter.getLeaves.asScala
    +      assert(operator.map(_.getOperator).contains(filterOperator))
    +    }
    +    checkFilterPredicate(df, predicate, checkComparisonOperator)
    +  }
    +
    +  private def checkFilterPredicate
    +      (predicate: Predicate, stringExpr: String)
    +      (implicit df: DataFrame): Unit = {
    +    def checkLogicalOperator(filter: SearchArgument) = {
    +      assert(filter.toString == stringExpr)
    +    }
    +    checkFilterPredicate(df, predicate, checkLogicalOperator)
    +  }
    +
    +  private def checkNoFilterPredicate
    +      (predicate: Predicate)
    +      (implicit df: DataFrame): Unit = {
    +    val output = predicate.collect { case a: Attribute => a }.distinct
    +    val query = df
    +      .select(output.map(e => Column(e)): _*)
    +      .where(Column(predicate))
    +
    +    var maybeRelation: Option[HadoopFsRelation] = None
    +    val maybeAnalyzedPredicate = query.queryExecution.optimizedPlan.collect {
    +      case PhysicalOperation(_, filters, LogicalRelation(orcRelation: HadoopFsRelation, _, _, _)) =>
    +        maybeRelation = Some(orcRelation)
    +        filters
    +    }.flatten.reduceLeftOption(_ && _)
    +    assert(maybeAnalyzedPredicate.isDefined, "No filter is analyzed from the given query")
    +
    +    val (_, selectedFilters, _) =
    +      DataSourceStrategy.selectFilters(maybeRelation.get, maybeAnalyzedPredicate.toSeq)
    +    assert(selectedFilters.nonEmpty, "No filter is pushed down")
    +
    +    val maybeFilter = OrcFilters.createFilter(query.schema, selectedFilters)
    +    assert(maybeFilter.isEmpty, s"Could generate filter predicate for $selectedFilters")
    +  }
    +
    +  test("filter pushdown - integer") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === 1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> 1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < 2, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > 3, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= 1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= 4, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(1) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(1) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(2) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(3) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(1) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(4) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - long") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i.toLong)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === 1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> 1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < 2, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > 3, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= 1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= 4, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(1) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(1) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(2) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(3) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(1) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(4) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - float") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i.toFloat)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === 1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> 1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < 2, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > 3, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= 1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= 4, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(1) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(1) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(2) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(3) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(1) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(4) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - double") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i.toDouble)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === 1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> 1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < 2, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > 3, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= 1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= 4, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(1) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(1) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(2) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(3) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(1) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(4) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - string") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(i.toString))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === "1", PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> "1", PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < "2", PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > "3", PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= "1", PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= "4", PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal("1") === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal("1") <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal("2") > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal("3") < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal("1") >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal("4") <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - boolean") {
    +    withOrcDataFrame((true :: false :: Nil).map(b => Tuple1.apply(Option(b)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === true, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> true, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < true, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > false, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= false, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= false, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(false) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(false) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(false) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(true) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(true) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(true) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - decimal") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1.apply(BigDecimal.valueOf(i)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === BigDecimal.valueOf(1), PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> BigDecimal.valueOf(1), PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < BigDecimal.valueOf(2), PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > BigDecimal.valueOf(3), PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= BigDecimal.valueOf(1), PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= BigDecimal.valueOf(4), PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(1)) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(1)) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(2)) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(3)) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(1)) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(4)) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - timestamp") {
    +    val timeString = "2015-08-20 14:57:00"
    +    val timestamps = (1 to 4).map { i =>
    +      val milliseconds = Timestamp.valueOf(timeString).getTime + i * 3600
    +      new Timestamp(milliseconds)
    +    }
    +    withOrcDataFrame(timestamps.map(Tuple1(_))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === timestamps(0), PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> timestamps(0), PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < timestamps(1), PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > timestamps(2), PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= timestamps(0), PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= timestamps(3), PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(timestamps(0)) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(timestamps(0)) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(timestamps(1)) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(timestamps(2)) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(timestamps(0)) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(timestamps(3)) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - combinations with logical operators") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i)))) { implicit df =>
    +      // Because `ExpressionTree` is not accessible at Hive 1.2.x, this should be checked
    --- End diff --
    
    Yup.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Test PASSed.
    Refer to this link for build results (access rights to CI server needed): 
    https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder/84524/
    Test PASSed.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Thank you so much, @HyukjinKwon !


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155168072
  
    --- Diff: sql/hive/src/test/scala/org/apache/spark/sql/hive/orc/HiveOrcSourceSuite.scala ---
    @@ -0,0 +1,107 @@
    +/*
    + * 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.orc
    +
    +import java.io.File
    +
    +import org.apache.spark.sql.Row
    +import org.apache.spark.sql.execution.datasources.orc.OrcSuite
    +import org.apache.spark.sql.hive.test.TestHiveSingleton
    +import org.apache.spark.util.Utils
    +
    +class HiveOrcSourceSuite extends OrcSuite with TestHiveSingleton {
    +
    +  override def orcImp: String = "hive"
    +
    +  override def beforeAll(): Unit = {
    +    super.beforeAll()
    +
    +    sql(
    +      s"""CREATE EXTERNAL TABLE normal_orc(
    +         |  intField INT,
    +         |  stringField STRING
    +         |)
    +         |STORED AS ORC
    +         |LOCATION '${orcTableAsDir.toURI}'
    +       """.stripMargin)
    +
    +    sql(
    +      s"""INSERT INTO TABLE normal_orc
    +         |SELECT intField, stringField FROM orc_temp_table
    +       """.stripMargin)
    +
    +    spark.sql(
    +      s"""CREATE TEMPORARY VIEW normal_orc_source
    +         |USING org.apache.spark.sql.hive.orc
    --- End diff --
    
    Sure. It just comes from the original test case.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by HyukjinKwon <gi...@git.apache.org>.
Github user HyukjinKwon commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Yup but I actually received an advise before. I suggested:
    
    ```
    ```
    
    ```
    org.apache.spark.sql.execution.datasources.csv.CSVInferSchema
    org.apache.spark.sql.execution.datasources.json.JsonInferSchema
    ```


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by HyukjinKwon <gi...@git.apache.org>.
Github user HyukjinKwon commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155229015
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcTest.scala ---
    @@ -15,20 +15,51 @@
      * limitations under the License.
      */
     
    -package org.apache.spark.sql.hive.orc
    +package org.apache.spark.sql.execution.datasources.orc
     
     import java.io.File
     
     import scala.reflect.ClassTag
     import scala.reflect.runtime.universe.TypeTag
     
    +import org.scalatest.BeforeAndAfterAll
    +
     import org.apache.spark.sql._
    -import org.apache.spark.sql.hive.test.TestHiveSingleton
    +import org.apache.spark.sql.internal.SQLConf.ORC_IMPLEMENTATION
     import org.apache.spark.sql.test.SQLTestUtils
     
    -private[sql] trait OrcTest extends SQLTestUtils with TestHiveSingleton {
    +/**
    + * OrcTest
    + *   -> OrcSuite
    + *       -> OrcSourceSuite
    + *       -> HiveOrcSourceSuite
    + *   -> OrcQueryTests
    + *       -> OrcQuerySuite
    + *       -> HiveOrcQuerySuite
    + *   -> OrcPartitionDiscoveryTest
    + *       -> OrcPartitionDiscoverySuite
    + *       -> HiveOrcPartitionDiscoverySuite
    + *   -> OrcFilterSuite
    + *   -> HiveOrcFilterSuite
    + */
    +abstract class OrcTest extends QueryTest with SQLTestUtils with BeforeAndAfterAll {
       import testImplicits._
     
    +  def orcImp: String = "native"
    --- End diff --
    
    Maybe `val` could be used.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Merged build finished. Test PASSed.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Merged build finished. Test FAILed.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by HyukjinKwon <gi...@git.apache.org>.
Github user HyukjinKwon commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155410507
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcFilterSuite.scala ---
    @@ -0,0 +1,368 @@
    +/*
    + * 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.execution.datasources.orc
    +
    +import java.nio.charset.StandardCharsets
    +import java.sql.{Date, Timestamp}
    +
    +import scala.collection.JavaConverters._
    +
    +import org.apache.orc.storage.ql.io.sarg.{PredicateLeaf, SearchArgument}
    +
    +import org.apache.spark.sql.{Column, DataFrame}
    +import org.apache.spark.sql.catalyst.dsl.expressions._
    +import org.apache.spark.sql.catalyst.expressions._
    +import org.apache.spark.sql.catalyst.planning.PhysicalOperation
    +import org.apache.spark.sql.execution.datasources.{DataSourceStrategy, HadoopFsRelation, LogicalRelation}
    +import org.apache.spark.sql.test.SharedSQLContext
    +import org.apache.spark.sql.types._
    +
    +/**
    + * A test suite that tests Apache ORC filter API based filter pushdown optimization.
    + */
    +class OrcFilterSuite extends OrcTest with SharedSQLContext {
    +
    +  private def checkFilterPredicate(
    +      df: DataFrame,
    +      predicate: Predicate,
    +      checker: (SearchArgument) => Unit): Unit = {
    +    val output = predicate.collect { case a: Attribute => a }.distinct
    +    val query = df
    +      .select(output.map(e => Column(e)): _*)
    +      .where(Column(predicate))
    +
    +    var maybeRelation: Option[HadoopFsRelation] = None
    +    val maybeAnalyzedPredicate = query.queryExecution.optimizedPlan.collect {
    +      case PhysicalOperation(_, filters, LogicalRelation(orcRelation: HadoopFsRelation, _, _, _)) =>
    +        maybeRelation = Some(orcRelation)
    +        filters
    +    }.flatten.reduceLeftOption(_ && _)
    +    assert(maybeAnalyzedPredicate.isDefined, "No filter is analyzed from the given query")
    +
    +    val (_, selectedFilters, _) =
    +      DataSourceStrategy.selectFilters(maybeRelation.get, maybeAnalyzedPredicate.toSeq)
    +    assert(selectedFilters.nonEmpty, "No filter is pushed down")
    +
    +    val maybeFilter = OrcFilters.createFilter(query.schema, selectedFilters)
    +    assert(maybeFilter.isDefined, s"Couldn't generate filter predicate for $selectedFilters")
    +    checker(maybeFilter.get)
    +  }
    +
    +  private def checkFilterPredicate
    +      (predicate: Predicate, filterOperator: PredicateLeaf.Operator)
    +      (implicit df: DataFrame): Unit = {
    +    def checkComparisonOperator(filter: SearchArgument) = {
    +      val operator = filter.getLeaves.asScala
    +      assert(operator.map(_.getOperator).contains(filterOperator))
    +    }
    +    checkFilterPredicate(df, predicate, checkComparisonOperator)
    +  }
    +
    +  private def checkFilterPredicate
    +      (predicate: Predicate, stringExpr: String)
    +      (implicit df: DataFrame): Unit = {
    +    def checkLogicalOperator(filter: SearchArgument) = {
    +      assert(filter.toString == stringExpr)
    +    }
    +    checkFilterPredicate(df, predicate, checkLogicalOperator)
    +  }
    +
    +  private def checkNoFilterPredicate
    +      (predicate: Predicate)
    +      (implicit df: DataFrame): Unit = {
    +    val output = predicate.collect { case a: Attribute => a }.distinct
    +    val query = df
    +      .select(output.map(e => Column(e)): _*)
    +      .where(Column(predicate))
    +
    +    var maybeRelation: Option[HadoopFsRelation] = None
    +    val maybeAnalyzedPredicate = query.queryExecution.optimizedPlan.collect {
    +      case PhysicalOperation(_, filters, LogicalRelation(orcRelation: HadoopFsRelation, _, _, _)) =>
    +        maybeRelation = Some(orcRelation)
    +        filters
    +    }.flatten.reduceLeftOption(_ && _)
    +    assert(maybeAnalyzedPredicate.isDefined, "No filter is analyzed from the given query")
    +
    +    val (_, selectedFilters, _) =
    +      DataSourceStrategy.selectFilters(maybeRelation.get, maybeAnalyzedPredicate.toSeq)
    +    assert(selectedFilters.nonEmpty, "No filter is pushed down")
    +
    +    val maybeFilter = OrcFilters.createFilter(query.schema, selectedFilters)
    +    assert(maybeFilter.isEmpty, s"Could generate filter predicate for $selectedFilters")
    +  }
    +
    +  test("filter pushdown - integer") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === 1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> 1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < 2, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > 3, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= 1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= 4, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(1) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(1) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(2) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(3) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(1) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(4) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - long") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i.toLong)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === 1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> 1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < 2, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > 3, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= 1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= 4, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(1) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(1) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(2) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(3) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(1) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(4) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - float") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i.toFloat)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === 1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> 1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < 2, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > 3, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= 1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= 4, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(1) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(1) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(2) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(3) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(1) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(4) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - double") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i.toDouble)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === 1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> 1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < 2, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > 3, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= 1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= 4, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(1) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(1) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(2) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(3) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(1) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(4) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - string") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(i.toString))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === "1", PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> "1", PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < "2", PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > "3", PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= "1", PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= "4", PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal("1") === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal("1") <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal("2") > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal("3") < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal("1") >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal("4") <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - boolean") {
    +    withOrcDataFrame((true :: false :: Nil).map(b => Tuple1.apply(Option(b)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === true, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> true, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < true, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > false, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= false, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= false, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(false) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(false) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(false) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(true) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(true) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(true) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - decimal") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1.apply(BigDecimal.valueOf(i)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === BigDecimal.valueOf(1), PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> BigDecimal.valueOf(1), PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < BigDecimal.valueOf(2), PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > BigDecimal.valueOf(3), PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= BigDecimal.valueOf(1), PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= BigDecimal.valueOf(4), PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(1)) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(1)) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(2)) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(3)) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(1)) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(4)) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - timestamp") {
    +    val timeString = "2015-08-20 14:57:00"
    +    val timestamps = (1 to 4).map { i =>
    +      val milliseconds = Timestamp.valueOf(timeString).getTime + i * 3600
    +      new Timestamp(milliseconds)
    +    }
    +    withOrcDataFrame(timestamps.map(Tuple1(_))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === timestamps(0), PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> timestamps(0), PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < timestamps(1), PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > timestamps(2), PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= timestamps(0), PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= timestamps(3), PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(timestamps(0)) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(timestamps(0)) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(timestamps(1)) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(timestamps(2)) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(timestamps(0)) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(timestamps(3)) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - combinations with logical operators") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i)))) { implicit df =>
    +      // Because `ExpressionTree` is not accessible at Hive 1.2.x, this should be checked
    --- End diff --
    
    I wrote the original tests here like this using `toString` partly because `ExpressionTree` (`SearchArgument.getExpression`) it's inaccessible and the string format is easy to read. 
    
    Although I think that tree seems available in the ORC, I think it's okay to keep the tests like this. It's easy to read but let's fix up the comments here. It doesn't look about Hive anyway here.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Merged build finished. Test PASSed.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by asfgit <gi...@git.apache.org>.
Github user asfgit closed the pull request at:

    https://github.com/apache/spark/pull/19882


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Test PASSed.
    Refer to this link for build results (access rights to CI server needed): 
    https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder/84581/
    Test PASSed.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by cloud-fan <gi...@git.apache.org>.
Github user cloud-fan commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155167566
  
    --- Diff: sql/hive/src/test/scala/org/apache/spark/sql/hive/orc/HiveOrcSourceSuite.scala ---
    @@ -0,0 +1,107 @@
    +/*
    + * 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.orc
    +
    +import java.io.File
    +
    +import org.apache.spark.sql.Row
    +import org.apache.spark.sql.execution.datasources.orc.OrcSuite
    +import org.apache.spark.sql.hive.test.TestHiveSingleton
    +import org.apache.spark.util.Utils
    +
    +class HiveOrcSourceSuite extends OrcSuite with TestHiveSingleton {
    +
    +  override def orcImp: String = "hive"
    +
    +  override def beforeAll(): Unit = {
    +    super.beforeAll()
    +
    +    sql(
    +      s"""CREATE EXTERNAL TABLE normal_orc(
    +         |  intField INT,
    +         |  stringField STRING
    +         |)
    +         |STORED AS ORC
    +         |LOCATION '${orcTableAsDir.toURI}'
    +       """.stripMargin)
    +
    +    sql(
    +      s"""INSERT INTO TABLE normal_orc
    +         |SELECT intField, stringField FROM orc_temp_table
    +       """.stripMargin)
    +
    +    spark.sql(
    +      s"""CREATE TEMPORARY VIEW normal_orc_source
    +         |USING org.apache.spark.sql.hive.orc
    --- End diff --
    
    this can be `using orc`?


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155167645
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcPartitionDiscoverySuite.scala ---
    @@ -186,8 +159,8 @@ class OrcPartitionDiscoverySuite extends QueryTest with TestHiveSingleton with B
               makePartitionDir(base, defaultPartitionName, "pi" -> pi, "ps" -> ps))
           }
     
    -      read
    -        .option(ConfVars.DEFAULTPARTITIONNAME.varname, defaultPartitionName)
    +      spark.read
    +        .option("hive.exec.default.partition.name", defaultPartitionName)
    --- End diff --
    
    Yes. In fact, Apache ORC doesn't have this params.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by cloud-fan <gi...@git.apache.org>.
Github user cloud-fan commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    > OrcTest will provide common helper functions and def format: String.
    
    Instead of having `def format: String`, can we just add `beforeAll` and `afterAll` in the test suites to set the `ORC_IMPLEMENTATION`?


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155168400
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcTest.scala ---
    @@ -15,20 +15,51 @@
      * limitations under the License.
      */
     
    -package org.apache.spark.sql.hive.orc
    +package org.apache.spark.sql.execution.datasources.orc
     
     import java.io.File
     
     import scala.reflect.ClassTag
     import scala.reflect.runtime.universe.TypeTag
     
    +import org.scalatest.BeforeAndAfterAll
    +
     import org.apache.spark.sql._
    -import org.apache.spark.sql.hive.test.TestHiveSingleton
    +import org.apache.spark.sql.internal.SQLConf.ORC_IMPLEMENTATION
     import org.apache.spark.sql.test.SQLTestUtils
     
    -private[sql] trait OrcTest extends SQLTestUtils with TestHiveSingleton {
    +/**
    + * OrcTest
    + *   -> OrcSuite
    + *       -> OrcSourceSuite
    + *       -> HiveOrcSourceSuite
    + *   -> OrcQueryTests
    + *       -> OrcQuerySuite
    + *       -> HiveOrcQuerySuite
    + *   -> OrcPartitionDiscoveryTest
    + *       -> OrcPartitionDiscoverySuite
    + *       -> HiveOrcPartitionDiscoverySuite
    + *   -> OrcFilterSuite
    + *   -> HiveOrcFilterSuite
    + */
    +abstract class OrcTest extends QueryTest with SQLTestUtils with BeforeAndAfterAll {
       import testImplicits._
     
    +  def orcImp: String = "native"
    +
    +  var originalConfORCImplementation = "native"
    --- End diff --
    
    Yep.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by cloud-fan <gi...@git.apache.org>.
Github user cloud-fan commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155230769
  
    --- Diff: sql/hive/src/test/scala/org/apache/spark/sql/hive/orc/HiveOrcQuerySuite.scala ---
    @@ -0,0 +1,165 @@
    +/*
    + * 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.orc
    +
    +import org.apache.spark.sql.AnalysisException
    +import org.apache.spark.sql.catalyst.catalog.HiveTableRelation
    +import org.apache.spark.sql.execution.datasources.{HadoopFsRelation, LogicalRelation}
    +import org.apache.spark.sql.execution.datasources.orc.OrcQueryTest
    +import org.apache.spark.sql.hive.HiveUtils
    +import org.apache.spark.sql.hive.test.TestHiveSingleton
    +import org.apache.spark.sql.internal.SQLConf
    +
    +class HiveOrcQuerySuite extends OrcQueryTest with TestHiveSingleton {
    +  import testImplicits._
    +
    +  override def orcImp: String = "hive"
    +
    +  test("SPARK-8501: Avoids discovery schema from empty ORC files") {
    --- End diff --
    
    then why don't we put this test in the base class?


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    It has more lines, doesn't it? In any way, we need helper functions.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Test PASSed.
    Refer to this link for build results (access rights to CI server needed): 
    https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder/84443/
    Test PASSed.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by cloud-fan <gi...@git.apache.org>.
Github user cloud-fan commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    ok maybe have a `def orcImp: String`, which can be `native` or `hive`. Then we can put the `beforeAll` and `afterAll` in `OrcTest`.
    
    It can avoid changing the test code from `spark.read.orc` to `spark.read.format(format)`


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by HyukjinKwon <gi...@git.apache.org>.
Github user HyukjinKwon commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    LGTM BTW.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155428391
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcFilterSuite.scala ---
    @@ -0,0 +1,368 @@
    +/*
    + * 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.execution.datasources.orc
    +
    +import java.nio.charset.StandardCharsets
    +import java.sql.{Date, Timestamp}
    +
    +import scala.collection.JavaConverters._
    +
    +import org.apache.orc.storage.ql.io.sarg.{PredicateLeaf, SearchArgument}
    +
    +import org.apache.spark.sql.{Column, DataFrame}
    +import org.apache.spark.sql.catalyst.dsl.expressions._
    +import org.apache.spark.sql.catalyst.expressions._
    +import org.apache.spark.sql.catalyst.planning.PhysicalOperation
    +import org.apache.spark.sql.execution.datasources.{DataSourceStrategy, HadoopFsRelation, LogicalRelation}
    +import org.apache.spark.sql.test.SharedSQLContext
    +import org.apache.spark.sql.types._
    +
    +/**
    + * A test suite that tests Apache ORC filter API based filter pushdown optimization.
    + */
    +class OrcFilterSuite extends OrcTest with SharedSQLContext {
    +
    +  private def checkFilterPredicate(
    +      df: DataFrame,
    +      predicate: Predicate,
    +      checker: (SearchArgument) => Unit): Unit = {
    +    val output = predicate.collect { case a: Attribute => a }.distinct
    +    val query = df
    +      .select(output.map(e => Column(e)): _*)
    +      .where(Column(predicate))
    +
    +    var maybeRelation: Option[HadoopFsRelation] = None
    +    val maybeAnalyzedPredicate = query.queryExecution.optimizedPlan.collect {
    +      case PhysicalOperation(_, filters, LogicalRelation(orcRelation: HadoopFsRelation, _, _, _)) =>
    +        maybeRelation = Some(orcRelation)
    +        filters
    +    }.flatten.reduceLeftOption(_ && _)
    +    assert(maybeAnalyzedPredicate.isDefined, "No filter is analyzed from the given query")
    +
    +    val (_, selectedFilters, _) =
    +      DataSourceStrategy.selectFilters(maybeRelation.get, maybeAnalyzedPredicate.toSeq)
    +    assert(selectedFilters.nonEmpty, "No filter is pushed down")
    +
    +    val maybeFilter = OrcFilters.createFilter(query.schema, selectedFilters)
    +    assert(maybeFilter.isDefined, s"Couldn't generate filter predicate for $selectedFilters")
    +    checker(maybeFilter.get)
    +  }
    +
    +  private def checkFilterPredicate
    +      (predicate: Predicate, filterOperator: PredicateLeaf.Operator)
    +      (implicit df: DataFrame): Unit = {
    +    def checkComparisonOperator(filter: SearchArgument) = {
    +      val operator = filter.getLeaves.asScala
    +      assert(operator.map(_.getOperator).contains(filterOperator))
    +    }
    +    checkFilterPredicate(df, predicate, checkComparisonOperator)
    +  }
    +
    +  private def checkFilterPredicate
    +      (predicate: Predicate, stringExpr: String)
    +      (implicit df: DataFrame): Unit = {
    +    def checkLogicalOperator(filter: SearchArgument) = {
    +      assert(filter.toString == stringExpr)
    +    }
    +    checkFilterPredicate(df, predicate, checkLogicalOperator)
    +  }
    +
    +  private def checkNoFilterPredicate
    +      (predicate: Predicate)
    +      (implicit df: DataFrame): Unit = {
    +    val output = predicate.collect { case a: Attribute => a }.distinct
    +    val query = df
    +      .select(output.map(e => Column(e)): _*)
    +      .where(Column(predicate))
    +
    +    var maybeRelation: Option[HadoopFsRelation] = None
    +    val maybeAnalyzedPredicate = query.queryExecution.optimizedPlan.collect {
    +      case PhysicalOperation(_, filters, LogicalRelation(orcRelation: HadoopFsRelation, _, _, _)) =>
    +        maybeRelation = Some(orcRelation)
    +        filters
    +    }.flatten.reduceLeftOption(_ && _)
    +    assert(maybeAnalyzedPredicate.isDefined, "No filter is analyzed from the given query")
    +
    +    val (_, selectedFilters, _) =
    +      DataSourceStrategy.selectFilters(maybeRelation.get, maybeAnalyzedPredicate.toSeq)
    +    assert(selectedFilters.nonEmpty, "No filter is pushed down")
    +
    +    val maybeFilter = OrcFilters.createFilter(query.schema, selectedFilters)
    +    assert(maybeFilter.isEmpty, s"Could generate filter predicate for $selectedFilters")
    +  }
    +
    +  test("filter pushdown - integer") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === 1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> 1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < 2, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > 3, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= 1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= 4, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(1) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(1) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(2) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(3) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(1) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(4) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - long") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i.toLong)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === 1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> 1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < 2, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > 3, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= 1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= 4, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(1) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(1) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(2) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(3) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(1) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(4) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - float") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i.toFloat)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === 1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> 1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < 2, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > 3, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= 1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= 4, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(1) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(1) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(2) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(3) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(1) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(4) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - double") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i.toDouble)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === 1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> 1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < 2, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > 3, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= 1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= 4, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(1) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(1) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(2) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(3) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(1) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(4) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - string") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(i.toString))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === "1", PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> "1", PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < "2", PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > "3", PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= "1", PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= "4", PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal("1") === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal("1") <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal("2") > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal("3") < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal("1") >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal("4") <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - boolean") {
    +    withOrcDataFrame((true :: false :: Nil).map(b => Tuple1.apply(Option(b)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === true, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> true, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < true, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > false, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= false, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= false, PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(false) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(false) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(false) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(true) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(true) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(true) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - decimal") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1.apply(BigDecimal.valueOf(i)))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === BigDecimal.valueOf(1), PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> BigDecimal.valueOf(1), PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < BigDecimal.valueOf(2), PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > BigDecimal.valueOf(3), PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= BigDecimal.valueOf(1), PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= BigDecimal.valueOf(4), PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(1)) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(1)) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(2)) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(3)) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(1)) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(
    +        Literal(BigDecimal.valueOf(4)) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - timestamp") {
    +    val timeString = "2015-08-20 14:57:00"
    +    val timestamps = (1 to 4).map { i =>
    +      val milliseconds = Timestamp.valueOf(timeString).getTime + i * 3600
    +      new Timestamp(milliseconds)
    +    }
    +    withOrcDataFrame(timestamps.map(Tuple1(_))) { implicit df =>
    +      checkFilterPredicate('_1.isNull, PredicateLeaf.Operator.IS_NULL)
    +
    +      checkFilterPredicate('_1 === timestamps(0), PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate('_1 <=> timestamps(0), PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +
    +      checkFilterPredicate('_1 < timestamps(1), PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate('_1 > timestamps(2), PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 <= timestamps(0), PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate('_1 >= timestamps(3), PredicateLeaf.Operator.LESS_THAN)
    +
    +      checkFilterPredicate(Literal(timestamps(0)) === '_1, PredicateLeaf.Operator.EQUALS)
    +      checkFilterPredicate(Literal(timestamps(0)) <=> '_1, PredicateLeaf.Operator.NULL_SAFE_EQUALS)
    +      checkFilterPredicate(Literal(timestamps(1)) > '_1, PredicateLeaf.Operator.LESS_THAN)
    +      checkFilterPredicate(Literal(timestamps(2)) < '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(timestamps(0)) >= '_1, PredicateLeaf.Operator.LESS_THAN_EQUALS)
    +      checkFilterPredicate(Literal(timestamps(3)) <= '_1, PredicateLeaf.Operator.LESS_THAN)
    +    }
    +  }
    +
    +  test("filter pushdown - combinations with logical operators") {
    +    withOrcDataFrame((1 to 4).map(i => Tuple1(Option(i)))) { implicit df =>
    +      // Because `ExpressionTree` is not accessible at Hive 1.2.x, this should be checked
    --- End diff --
    
    Yep.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    @HyukjinKwon . The PR code and description is updated.
    - Update comments
    - Rename back to the originals
    
    The main reason I used prefix `Hive` is for naming consistency, but now it's restored.
    
    As you see in the PR description, we need to use `HiveOrcHadoopFsRelationSuite` inconsistently
    because `OrcHadoopFsRelationSuite` already exists in the same package.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by HyukjinKwon <gi...@git.apache.org>.
Github user HyukjinKwon commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155394617
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcQuerySuite.scala ---
    @@ -614,27 +523,88 @@ class OrcQuerySuite extends QueryTest with BeforeAndAfterAll with OrcTest {
         }
       }
     
    -   test("read from multiple orc input paths") {
    -     val path1 = Utils.createTempDir()
    -     val path2 = Utils.createTempDir()
    -     makeOrcFile((1 to 10).map(Tuple1.apply), path1)
    -     makeOrcFile((1 to 10).map(Tuple1.apply), path2)
    -     assertResult(20)(read.orc(path1.getCanonicalPath, path2.getCanonicalPath).count())
    -   }
    +  test("read from multiple orc input paths") {
    +    val path1 = Utils.createTempDir()
    +    val path2 = Utils.createTempDir()
    +    makeOrcFile((1 to 10).map(Tuple1.apply), path1)
    +    makeOrcFile((1 to 10).map(Tuple1.apply), path2)
    +    val df = spark.read.orc(path1.getCanonicalPath, path2.getCanonicalPath)
    +    assert(df.count() == 20)
    +  }
    +}
    +
    +class OrcQuerySuite extends OrcQueryTest with SharedSQLContext {
    +  import testImplicits._
    +
    +  test("LZO compression options for writing to an ORC file") {
    +    withTempPath { file =>
    +      spark.range(0, 10).write
    +        .option("compression", "LZO")
    +        .orc(file.getCanonicalPath)
    +
    +      val maybeOrcFile = file.listFiles().find(_.getName.endsWith(".lzo.orc"))
    +      assert(maybeOrcFile.isDefined)
    +
    +      val orcFilePath = new Path(maybeOrcFile.get.getAbsolutePath)
    +      val conf = OrcFile.readerOptions(new Configuration())
    +      assert("LZO" === OrcFile.createReader(orcFilePath, conf).getCompressionKind.name)
    +    }
    +  }
    +
    +  test("Schema discovery on empty ORC files") {
    +    // SPARK-8501 is fixed.
    +    withTempPath { dir =>
    +      val path = dir.getCanonicalPath
    +
    +      withTable("empty_orc") {
    +        withTempView("empty", "single") {
    +          spark.sql(
    +            s"""CREATE TABLE empty_orc(key INT, value STRING)
    +               |USING ORC
    +               |LOCATION '${dir.toURI}'
    +             """.stripMargin)
    +
    +          val emptyDF = Seq.empty[(Int, String)].toDF("key", "value").coalesce(1)
    +          emptyDF.createOrReplaceTempView("empty")
    +
    +          // This creates 1 empty ORC file with ORC SerDe.  We are using this trick because
    +          // Spark SQL ORC data source always avoids write empty ORC files.
    +          spark.sql(
    +            s"""INSERT INTO TABLE empty_orc
    +               |SELECT key, value FROM empty
    +             """.stripMargin)
    +
    +          val df = spark.read.orc(path)
    +          assert(df.schema === emptyDF.schema.asNullable)
    +          checkAnswer(df, emptyDF)
    +        }
    +      }
    +    }
    +  }
    +
    +  test("SPARK-21791 ORC should support column names with dot") {
    --- End diff --
    
    Oh, I overlooked. Sure, that's fine.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r154843730
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcQuerySuite.scala ---
    @@ -614,11 +531,63 @@ class OrcQuerySuite extends QueryTest with BeforeAndAfterAll with OrcTest {
         }
       }
     
    -   test("read from multiple orc input paths") {
    -     val path1 = Utils.createTempDir()
    -     val path2 = Utils.createTempDir()
    -     makeOrcFile((1 to 10).map(Tuple1.apply), path1)
    -     makeOrcFile((1 to 10).map(Tuple1.apply), path2)
    -     assertResult(20)(read.orc(path1.getCanonicalPath, path2.getCanonicalPath).count())
    -   }
    +  test("read from multiple orc input paths") {
    +    val path1 = Utils.createTempDir()
    +    val path2 = Utils.createTempDir()
    +    makeOrcFile((1 to 10).map(Tuple1.apply), path1)
    +    makeOrcFile((1 to 10).map(Tuple1.apply), path2)
    +    val df = spark.read.format(format).load(path1.getCanonicalPath, path2.getCanonicalPath)
    +    assert(df.count() == 20)
    +  }
    +}
    +
    +class OrcQuerySuite extends OrcQueryTest with SharedSQLContext {
    +  import testImplicits._
    +
    +  test("LZO compression options for writing to an ORC file") {
    +    withTempPath { file =>
    +      spark.range(0, 10).write
    +        .option("compression", "LZO")
    +        .format(format)
    +        .save(file.getCanonicalPath)
    +
    +      val maybeOrcFile = file.listFiles().find(_.getName.endsWith(".lzo.orc"))
    +      assert(maybeOrcFile.isDefined)
    +
    +      val orcFilePath = new Path(maybeOrcFile.get.getAbsolutePath)
    +      val conf = OrcFile.readerOptions(new Configuration())
    +      assert("LZO" === OrcFile.createReader(orcFilePath, conf).getCompressionKind.name)
    +    }
    +  }
    +
    +  test("Schema discovery on empty ORC files") {
    +    // SPARK-8501 is fixed.
    +    withTempPath { dir =>
    +      val path = dir.getCanonicalPath
    +
    +      withTable("empty_orc") {
    +        withTempView("empty", "single") {
    +          spark.sql(
    +            s"""CREATE TABLE empty_orc(key INT, value STRING)
    +               |USING $format
    +               |LOCATION '${dir.toURI}'
    +             """.stripMargin)
    +
    +          val emptyDF = Seq.empty[(Int, String)].toDF("key", "value").coalesce(1)
    +          emptyDF.createOrReplaceTempView("empty")
    +
    +          // This creates 1 empty ORC file with Hive ORC SerDe.  We are using this trick because
    +          // Spark SQL ORC data source always avoids write empty ORC files.
    --- End diff --
    
    Thank you for review, @viirya . I'll update tomorrow.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    **[Test build #84581 has started](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/84581/testReport)** for PR 19882 at commit [`fcb2ccb`](https://github.com/apache/spark/commit/fcb2ccb64813f0fc37e3321c006937fb9cb870e4).


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155167981
  
    --- Diff: sql/hive/src/test/scala/org/apache/spark/sql/hive/orc/HiveOrcQuerySuite.scala ---
    @@ -0,0 +1,165 @@
    +/*
    + * 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.orc
    +
    +import org.apache.spark.sql.AnalysisException
    +import org.apache.spark.sql.catalyst.catalog.HiveTableRelation
    +import org.apache.spark.sql.execution.datasources.{HadoopFsRelation, LogicalRelation}
    +import org.apache.spark.sql.execution.datasources.orc.OrcQueryTest
    +import org.apache.spark.sql.hive.HiveUtils
    +import org.apache.spark.sql.hive.test.TestHiveSingleton
    +import org.apache.spark.sql.internal.SQLConf
    +
    +class HiveOrcQuerySuite extends OrcQueryTest with TestHiveSingleton {
    +  import testImplicits._
    +
    +  override def orcImp: String = "hive"
    +
    +  test("SPARK-8501: Avoids discovery schema from empty ORC files") {
    --- End diff --
    
    Native ORC solve this bug. Native ORC have a corresponding test case [here](https://github.com/apache/spark/pull/19882/files#diff-9ab56940ee5a53f2bb81e3c008653362R554).
    ```
    +  test("Schema discovery on empty ORC files") {
    +    // SPARK-8501 is fixed.
    ```


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Thank you so much, @cloud-fan , @HyukjinKwon , and @gatorsmile !


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Definitely, my bad.
    
    For the main code, we can do later in a separate PR if needed. I hope this PR contains tests only.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    **[Test build #84443 has finished](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/84443/testReport)** for PR 19882 at commit [`5f2025a`](https://github.com/apache/spark/commit/5f2025ada40d146411b5e14ddf37f3fccc4cae97).
     * This patch passes all tests.
     * This patch merges cleanly.
     * This patch adds the following public classes _(experimental)_:
      * `class OrcFilterSuite extends OrcTest with SharedSQLContext `
      * `    implicit class IntToBinary(int: Int) `
      * `case class OrcParData(intField: Int, stringField: String)`
      * `case class OrcParDataWithKey(intField: Int, pi: Int, stringField: String, ps: String)`
      * `abstract class OrcPartitionDiscoveryTest extends OrcTest `
      * `class OrcPartitionDiscoverySuite extends OrcPartitionDiscoveryTest with SharedSQLContext `
      * `case class AllDataTypesWithNonPrimitiveType(`
      * `case class BinaryData(binaryData: Array[Byte])`
      * `case class Contact(name: String, phone: String)`
      * `case class Person(name: String, age: Int, contacts: Seq[Contact])`
      * `abstract class OrcQueryTest extends OrcTest `
      * `  test(\"Creating case class RDD table\") `
      * `  test(\"save and load case class RDD with `None`s as orc\") `
      * `class OrcQuerySuite extends OrcQueryTest with SharedSQLContext `
      * `case class OrcData(intField: Int, stringField: String)`
      * `abstract class OrcSuite extends OrcTest with BeforeAndAfterAll `
      * `class OrcSourceSuite extends OrcSuite with SharedSQLContext `
      * `abstract class OrcTest extends QueryTest with SQLTestUtils `
      * `class HiveOrcFilterSuite extends OrcTest with TestHiveSingleton `
      * `    implicit class IntToBinary(int: Int) `
      * `class HiveOrcPartitionDiscoverySuite extends OrcPartitionDiscoveryTest with TestHiveSingleton  `
      * `class HiveOrcQuerySuite extends OrcQueryTest with TestHiveSingleton `
      * `class HiveOrcSourceSuite extends OrcSuite with TestHiveSingleton `
      * `class HiveOrcHadoopFsRelationSuite extends OrcHadoopFsRelationSuite `


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Thank you so much, @HyukjinKwon !


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by HyukjinKwon <gi...@git.apache.org>.
Github user HyukjinKwon commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155228866
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcSourceSuite.scala ---
    @@ -225,57 +162,39 @@ abstract class OrcSuite extends QueryTest with TestHiveSingleton with BeforeAndA
       }
     }
     
    -class OrcSourceSuite extends OrcSuite {
    -  override def beforeAll(): Unit = {
    +class OrcSourceSuite extends OrcSuite with SharedSQLContext {
    +
    +  protected override def beforeAll(): Unit = {
    --- End diff --
    
    Mind if I ask where this is needed?


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155390570
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcQuerySuite.scala ---
    @@ -614,27 +523,88 @@ class OrcQuerySuite extends QueryTest with BeforeAndAfterAll with OrcTest {
         }
       }
     
    -   test("read from multiple orc input paths") {
    -     val path1 = Utils.createTempDir()
    -     val path2 = Utils.createTempDir()
    -     makeOrcFile((1 to 10).map(Tuple1.apply), path1)
    -     makeOrcFile((1 to 10).map(Tuple1.apply), path2)
    -     assertResult(20)(read.orc(path1.getCanonicalPath, path2.getCanonicalPath).count())
    -   }
    +  test("read from multiple orc input paths") {
    +    val path1 = Utils.createTempDir()
    +    val path2 = Utils.createTempDir()
    +    makeOrcFile((1 to 10).map(Tuple1.apply), path1)
    +    makeOrcFile((1 to 10).map(Tuple1.apply), path2)
    +    val df = spark.read.orc(path1.getCanonicalPath, path2.getCanonicalPath)
    +    assert(df.count() == 20)
    +  }
    +}
    +
    +class OrcQuerySuite extends OrcQueryTest with SharedSQLContext {
    +  import testImplicits._
    +
    +  test("LZO compression options for writing to an ORC file") {
    +    withTempPath { file =>
    +      spark.range(0, 10).write
    +        .option("compression", "LZO")
    +        .orc(file.getCanonicalPath)
    +
    +      val maybeOrcFile = file.listFiles().find(_.getName.endsWith(".lzo.orc"))
    +      assert(maybeOrcFile.isDefined)
    +
    +      val orcFilePath = new Path(maybeOrcFile.get.getAbsolutePath)
    +      val conf = OrcFile.readerOptions(new Configuration())
    +      assert("LZO" === OrcFile.createReader(orcFilePath, conf).getCompressionKind.name)
    +    }
    +  }
    +
    +  test("Schema discovery on empty ORC files") {
    +    // SPARK-8501 is fixed.
    +    withTempPath { dir =>
    +      val path = dir.getCanonicalPath
    +
    +      withTable("empty_orc") {
    +        withTempView("empty", "single") {
    +          spark.sql(
    +            s"""CREATE TABLE empty_orc(key INT, value STRING)
    +               |USING ORC
    +               |LOCATION '${dir.toURI}'
    +             """.stripMargin)
    +
    +          val emptyDF = Seq.empty[(Int, String)].toDF("key", "value").coalesce(1)
    +          emptyDF.createOrReplaceTempView("empty")
    +
    +          // This creates 1 empty ORC file with ORC SerDe.  We are using this trick because
    +          // Spark SQL ORC data source always avoids write empty ORC files.
    +          spark.sql(
    +            s"""INSERT INTO TABLE empty_orc
    +               |SELECT key, value FROM empty
    +             """.stripMargin)
    +
    +          val df = spark.read.orc(path)
    +          assert(df.schema === emptyDF.schema.asNullable)
    +          checkAnswer(df, emptyDF)
    +        }
    +      }
    +    }
    +  }
    +
    +  test("SPARK-21791 ORC should support column names with dot") {
    --- End diff --
    
    Old OrcFileFormat fails on this test case.
    Do you mean adding an exception-catching test case?


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by cloud-fan <gi...@git.apache.org>.
Github user cloud-fan commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    thanks, merging to master!


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by cloud-fan <gi...@git.apache.org>.
Github user cloud-fan commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155167070
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcTest.scala ---
    @@ -15,20 +15,51 @@
      * limitations under the License.
      */
     
    -package org.apache.spark.sql.hive.orc
    +package org.apache.spark.sql.execution.datasources.orc
     
     import java.io.File
     
     import scala.reflect.ClassTag
     import scala.reflect.runtime.universe.TypeTag
     
    +import org.scalatest.BeforeAndAfterAll
    +
     import org.apache.spark.sql._
    -import org.apache.spark.sql.hive.test.TestHiveSingleton
    +import org.apache.spark.sql.internal.SQLConf.ORC_IMPLEMENTATION
     import org.apache.spark.sql.test.SQLTestUtils
     
    -private[sql] trait OrcTest extends SQLTestUtils with TestHiveSingleton {
    +/**
    + * OrcTest
    + *   -> OrcSuite
    + *       -> OrcSourceSuite
    + *       -> HiveOrcSourceSuite
    + *   -> OrcQueryTests
    + *       -> OrcQuerySuite
    + *       -> HiveOrcQuerySuite
    + *   -> OrcPartitionDiscoveryTest
    + *       -> OrcPartitionDiscoverySuite
    + *       -> HiveOrcPartitionDiscoverySuite
    + *   -> OrcFilterSuite
    + *   -> HiveOrcFilterSuite
    + */
    +abstract class OrcTest extends QueryTest with SQLTestUtils with BeforeAndAfterAll {
       import testImplicits._
     
    +  def orcImp: String = "native"
    +
    +  var originalConfORCImplementation = "native"
    --- End diff --
    
    `private var`?


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Test PASSed.
    Refer to this link for build results (access rights to CI server needed): 
    https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder/84589/
    Test PASSed.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Test PASSed.
    Refer to this link for build results (access rights to CI server needed): 
    https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder/84599/
    Test PASSed.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by HyukjinKwon <gi...@git.apache.org>.
Github user HyukjinKwon commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    retest this please


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Okay. No problem. Thanks, @cloud-fan .


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    **[Test build #84599 has started](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/84599/testReport)** for PR 19882 at commit [`f56423d`](https://github.com/apache/spark/commit/f56423dd9168e781fad6e02e2aa319d8593d98cc).


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155395310
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcQuerySuite.scala ---
    @@ -614,27 +523,88 @@ class OrcQuerySuite extends QueryTest with BeforeAndAfterAll with OrcTest {
         }
       }
     
    -   test("read from multiple orc input paths") {
    -     val path1 = Utils.createTempDir()
    -     val path2 = Utils.createTempDir()
    -     makeOrcFile((1 to 10).map(Tuple1.apply), path1)
    -     makeOrcFile((1 to 10).map(Tuple1.apply), path2)
    -     assertResult(20)(read.orc(path1.getCanonicalPath, path2.getCanonicalPath).count())
    -   }
    +  test("read from multiple orc input paths") {
    +    val path1 = Utils.createTempDir()
    +    val path2 = Utils.createTempDir()
    +    makeOrcFile((1 to 10).map(Tuple1.apply), path1)
    +    makeOrcFile((1 to 10).map(Tuple1.apply), path2)
    +    val df = spark.read.orc(path1.getCanonicalPath, path2.getCanonicalPath)
    +    assert(df.count() == 20)
    +  }
    +}
    +
    +class OrcQuerySuite extends OrcQueryTest with SharedSQLContext {
    +  import testImplicits._
    +
    +  test("LZO compression options for writing to an ORC file") {
    +    withTempPath { file =>
    +      spark.range(0, 10).write
    +        .option("compression", "LZO")
    +        .orc(file.getCanonicalPath)
    +
    +      val maybeOrcFile = file.listFiles().find(_.getName.endsWith(".lzo.orc"))
    +      assert(maybeOrcFile.isDefined)
    +
    +      val orcFilePath = new Path(maybeOrcFile.get.getAbsolutePath)
    +      val conf = OrcFile.readerOptions(new Configuration())
    +      assert("LZO" === OrcFile.createReader(orcFilePath, conf).getCompressionKind.name)
    +    }
    +  }
    +
    +  test("Schema discovery on empty ORC files") {
    +    // SPARK-8501 is fixed.
    +    withTempPath { dir =>
    +      val path = dir.getCanonicalPath
    +
    +      withTable("empty_orc") {
    +        withTempView("empty", "single") {
    +          spark.sql(
    +            s"""CREATE TABLE empty_orc(key INT, value STRING)
    +               |USING ORC
    +               |LOCATION '${dir.toURI}'
    +             """.stripMargin)
    +
    +          val emptyDF = Seq.empty[(Int, String)].toDF("key", "value").coalesce(1)
    +          emptyDF.createOrReplaceTempView("empty")
    +
    +          // This creates 1 empty ORC file with ORC SerDe.  We are using this trick because
    +          // Spark SQL ORC data source always avoids write empty ORC files.
    +          spark.sql(
    +            s"""INSERT INTO TABLE empty_orc
    +               |SELECT key, value FROM empty
    +             """.stripMargin)
    +
    +          val df = spark.read.orc(path)
    +          assert(df.schema === emptyDF.schema.asNullable)
    +          checkAnswer(df, emptyDF)
    +        }
    +      }
    +    }
    +  }
    +
    +  test("SPARK-21791 ORC should support column names with dot") {
    --- End diff --
    
    Thanks!


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by HyukjinKwon <gi...@git.apache.org>.
Github user HyukjinKwon commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155398123
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcFilterSuite.scala ---
    @@ -0,0 +1,370 @@
    +/*
    + * 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.execution.datasources.orc
    +
    +import java.nio.charset.StandardCharsets
    +import java.sql.{Date, Timestamp}
    +
    +import scala.collection.JavaConverters._
    +
    +import org.apache.orc.storage.ql.io.sarg.{PredicateLeaf, SearchArgument}
    +
    +import org.apache.spark.sql.{Column, DataFrame}
    +import org.apache.spark.sql.catalyst.dsl.expressions._
    +import org.apache.spark.sql.catalyst.expressions._
    +import org.apache.spark.sql.catalyst.planning.PhysicalOperation
    +import org.apache.spark.sql.execution.datasources.{DataSourceStrategy, HadoopFsRelation, LogicalRelation}
    +import org.apache.spark.sql.test.SharedSQLContext
    +import org.apache.spark.sql.types._
    +
    +/**
    + * A test suite that tests Apache ORC filter API based filter pushdown optimization.
    + */
    +class OrcFilterSuite extends OrcTest with SharedSQLContext {
    --- End diff --
    
    Could we leave some comments to explain that reason? 
    Seems there are many duplications and I would wonder why.



---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by AmplabJenkins <gi...@git.apache.org>.
Github user AmplabJenkins commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    Merged build finished. Test PASSed.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    **[Test build #84599 has finished](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/84599/testReport)** for PR 19882 at commit [`f56423d`](https://github.com/apache/spark/commit/f56423dd9168e781fad6e02e2aa319d8593d98cc).
     * This patch passes all tests.
     * This patch merges cleanly.
     * This patch adds no public classes.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by HyukjinKwon <gi...@git.apache.org>.
Github user HyukjinKwon commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    I am sorry, I had to clarify this ahead ..


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by HyukjinKwon <gi...@git.apache.org>.
Github user HyukjinKwon commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r155227254
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcQuerySuite.scala ---
    @@ -614,27 +523,88 @@ class OrcQuerySuite extends QueryTest with BeforeAndAfterAll with OrcTest {
         }
       }
     
    -   test("read from multiple orc input paths") {
    -     val path1 = Utils.createTempDir()
    -     val path2 = Utils.createTempDir()
    -     makeOrcFile((1 to 10).map(Tuple1.apply), path1)
    -     makeOrcFile((1 to 10).map(Tuple1.apply), path2)
    -     assertResult(20)(read.orc(path1.getCanonicalPath, path2.getCanonicalPath).count())
    -   }
    +  test("read from multiple orc input paths") {
    +    val path1 = Utils.createTempDir()
    +    val path2 = Utils.createTempDir()
    +    makeOrcFile((1 to 10).map(Tuple1.apply), path1)
    +    makeOrcFile((1 to 10).map(Tuple1.apply), path2)
    +    val df = spark.read.orc(path1.getCanonicalPath, path2.getCanonicalPath)
    +    assert(df.count() == 20)
    +  }
    +}
    +
    +class OrcQuerySuite extends OrcQueryTest with SharedSQLContext {
    +  import testImplicits._
    +
    +  test("LZO compression options for writing to an ORC file") {
    +    withTempPath { file =>
    +      spark.range(0, 10).write
    +        .option("compression", "LZO")
    +        .orc(file.getCanonicalPath)
    +
    +      val maybeOrcFile = file.listFiles().find(_.getName.endsWith(".lzo.orc"))
    +      assert(maybeOrcFile.isDefined)
    +
    +      val orcFilePath = new Path(maybeOrcFile.get.getAbsolutePath)
    +      val conf = OrcFile.readerOptions(new Configuration())
    +      assert("LZO" === OrcFile.createReader(orcFilePath, conf).getCompressionKind.name)
    +    }
    +  }
    +
    +  test("Schema discovery on empty ORC files") {
    +    // SPARK-8501 is fixed.
    +    withTempPath { dir =>
    +      val path = dir.getCanonicalPath
    +
    +      withTable("empty_orc") {
    +        withTempView("empty", "single") {
    +          spark.sql(
    +            s"""CREATE TABLE empty_orc(key INT, value STRING)
    +               |USING ORC
    +               |LOCATION '${dir.toURI}'
    +             """.stripMargin)
    +
    +          val emptyDF = Seq.empty[(Int, String)].toDF("key", "value").coalesce(1)
    +          emptyDF.createOrReplaceTempView("empty")
    +
    +          // This creates 1 empty ORC file with ORC SerDe.  We are using this trick because
    +          // Spark SQL ORC data source always avoids write empty ORC files.
    +          spark.sql(
    +            s"""INSERT INTO TABLE empty_orc
    +               |SELECT key, value FROM empty
    +             """.stripMargin)
    +
    +          val df = spark.read.orc(path)
    +          assert(df.schema === emptyDF.schema.asNullable)
    +          checkAnswer(df, emptyDF)
    +        }
    +      }
    +    }
    +  }
    +
    +  test("SPARK-21791 ORC should support column names with dot") {
    --- End diff --
    
    Would we need this test case for Hive's one too?


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark pull request #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by viirya <gi...@git.apache.org>.
Github user viirya commented on a diff in the pull request:

    https://github.com/apache/spark/pull/19882#discussion_r154824305
  
    --- Diff: sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcQuerySuite.scala ---
    @@ -614,11 +531,63 @@ class OrcQuerySuite extends QueryTest with BeforeAndAfterAll with OrcTest {
         }
       }
     
    -   test("read from multiple orc input paths") {
    -     val path1 = Utils.createTempDir()
    -     val path2 = Utils.createTempDir()
    -     makeOrcFile((1 to 10).map(Tuple1.apply), path1)
    -     makeOrcFile((1 to 10).map(Tuple1.apply), path2)
    -     assertResult(20)(read.orc(path1.getCanonicalPath, path2.getCanonicalPath).count())
    -   }
    +  test("read from multiple orc input paths") {
    +    val path1 = Utils.createTempDir()
    +    val path2 = Utils.createTempDir()
    +    makeOrcFile((1 to 10).map(Tuple1.apply), path1)
    +    makeOrcFile((1 to 10).map(Tuple1.apply), path2)
    +    val df = spark.read.format(format).load(path1.getCanonicalPath, path2.getCanonicalPath)
    +    assert(df.count() == 20)
    +  }
    +}
    +
    +class OrcQuerySuite extends OrcQueryTest with SharedSQLContext {
    +  import testImplicits._
    +
    +  test("LZO compression options for writing to an ORC file") {
    +    withTempPath { file =>
    +      spark.range(0, 10).write
    +        .option("compression", "LZO")
    +        .format(format)
    +        .save(file.getCanonicalPath)
    +
    +      val maybeOrcFile = file.listFiles().find(_.getName.endsWith(".lzo.orc"))
    +      assert(maybeOrcFile.isDefined)
    +
    +      val orcFilePath = new Path(maybeOrcFile.get.getAbsolutePath)
    +      val conf = OrcFile.readerOptions(new Configuration())
    +      assert("LZO" === OrcFile.createReader(orcFilePath, conf).getCompressionKind.name)
    +    }
    +  }
    +
    +  test("Schema discovery on empty ORC files") {
    +    // SPARK-8501 is fixed.
    +    withTempPath { dir =>
    +      val path = dir.getCanonicalPath
    +
    +      withTable("empty_orc") {
    +        withTempView("empty", "single") {
    +          spark.sql(
    +            s"""CREATE TABLE empty_orc(key INT, value STRING)
    +               |USING $format
    +               |LOCATION '${dir.toURI}'
    +             """.stripMargin)
    +
    +          val emptyDF = Seq.empty[(Int, String)].toDF("key", "value").coalesce(1)
    +          emptyDF.createOrReplaceTempView("empty")
    +
    +          // This creates 1 empty ORC file with Hive ORC SerDe.  We are using this trick because
    +          // Spark SQL ORC data source always avoids write empty ORC files.
    --- End diff --
    
    Is this still using Hive ORC SerDe?


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    **[Test build #84524 has finished](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/84524/testReport)** for PR 19882 at commit [`baec5fe`](https://github.com/apache/spark/commit/baec5fece95896a28127cd2ac014582874ed5e28).
     * This patch passes all tests.
     * This patch merges cleanly.
     * This patch adds the following public classes _(experimental)_:
      * `class OrcFilterSuite extends OrcTest with SharedSQLContext `
      * `    implicit class IntToBinary(int: Int) `
      * `case class OrcParData(intField: Int, stringField: String)`
      * `case class OrcParDataWithKey(intField: Int, pi: Int, stringField: String, ps: String)`
      * `abstract class OrcPartitionDiscoveryTest extends OrcTest `
      * `case class AllDataTypesWithNonPrimitiveType(`
      * `case class BinaryData(binaryData: Array[Byte])`
      * `case class Contact(name: String, phone: String)`
      * `case class Person(name: String, age: Int, contacts: Seq[Contact])`
      * `abstract class OrcQueryTest extends OrcTest `
      * `  test(\"Creating case class RDD table\") `
      * `  test(\"save and load case class RDD with `None`s as orc\") `
      * `class OrcQuerySuite extends OrcQueryTest with SharedSQLContext `
      * `case class OrcData(intField: Int, stringField: String)`
      * `abstract class OrcSuite extends OrcTest with BeforeAndAfterAll `
      * `class OrcSourceSuite extends OrcSuite with SharedSQLContext `
      * `abstract class OrcTest extends QueryTest with SQLTestUtils with BeforeAndAfterAll `
      * `class HiveOrcFilterSuite extends OrcTest with TestHiveSingleton `
      * `    implicit class IntToBinary(int: Int) `
      * `class HiveOrcPartitionDiscoverySuite extends OrcPartitionDiscoveryTest with TestHiveSingleton  `
      * `class HiveOrcQuerySuite extends OrcQueryTest with TestHiveSingleton `
      * `class HiveOrcSourceSuite extends OrcSuite with TestHiveSingleton `
      * `class HiveOrcHadoopFsRelationSuite extends OrcHadoopFsRelationSuite `


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    **[Test build #84589 has finished](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/84589/testReport)** for PR 19882 at commit [`1828571`](https://github.com/apache/spark/commit/18285717edcbefe9a79d51a6fdcb112c3d0bc5c4).
     * This patch passes all tests.
     * This patch merges cleanly.
     * This patch adds the following public classes _(experimental)_:
      * `class OrcFilterSuite extends OrcTest with TestHiveSingleton `
      * `    implicit class IntToBinary(int: Int) `
      * `class OrcPartitionDiscoverySuite extends OrcPartitionDiscoveryTest with TestHiveSingleton  `
      * `class OrcQuerySuite extends OrcQueryTest with TestHiveSingleton `
      * `class OrcSourceSuite extends OrcSuite with TestHiveSingleton `


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    **[Test build #84591 has started](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/84591/testReport)** for PR 19882 at commit [`f56423d`](https://github.com/apache/spark/commit/f56423dd9168e781fad6e02e2aa319d8593d98cc).


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by SparkQA <gi...@git.apache.org>.
Github user SparkQA commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    **[Test build #84443 has started](https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/84443/testReport)** for PR 19882 at commit [`5f2025a`](https://github.com/apache/spark/commit/5f2025ada40d146411b5e14ddf37f3fccc4cae97).


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] spark issue #19882: [SPARK-22672][SQL][TEST] Refactor ORC Tests

Posted by dongjoon-hyun <gi...@git.apache.org>.
Github user dongjoon-hyun commented on the issue:

    https://github.com/apache/spark/pull/19882
  
    It's rebased to the master to resolve conflicts. Also, I addressed the comments. Thanks!


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org