/**
 * 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
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * 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.hadoop.ozone.recon.codegen;

import org.hadoop.ozone.recon.schema.ReconInternalSchemaDefinition;
import org.hadoop.ozone.recon.schema.ReconSchemaDefinition;
import org.hadoop.ozone.recon.schema.StatsSchemaDefinition;
import org.hadoop.ozone.recon.schema.UtilizationSchemaDefinition;

import com.google.inject.AbstractModule;
import com.google.inject.multibindings.Multibinder;

/**
 * Bindings for DDL generation and used by
 * {@link org.hadoop.ozone.recon.codegen.JooqCodeGenerator}.
 */
public class ReconSchemaGenerationModule extends AbstractModule {
  @Override
  protected void configure() {
    // SQL schema creation and related bindings
    Multibinder<ReconSchemaDefinition> schemaBinder =
        Multibinder.newSetBinder(binder(), ReconSchemaDefinition.class);
    schemaBinder.addBinding().to(UtilizationSchemaDefinition.class);
    schemaBinder.addBinding().to(ReconInternalSchemaDefinition.class);
    schemaBinder.addBinding().to(StatsSchemaDefinition.class);
  }
}
