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

//  This file tells Drill to consider this module when class path scanning.
//  This file can also include any supplementary configuration information.
//  This file is in HOCON format, see https://github.com/typesafehub/config/blob/master/HOCON.md for more information.
drill {
  classpath.scanning {
    base.classes : ${?drill.classpath.scanning.base.classes} [
      org.apache.drill.common.logical.data.LogicalOperator,
      org.apache.drill.common.logical.FormatPluginConfig,
      org.apache.drill.common.logical.StoragePluginConfig
    ],

    packages : ${?drill.classpath.scanning.packages} [
      org.apache.drill.exec.store.mock,
      org.apache.drill.common.logical
    ]
  }
}
