/*
 * 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.drill.common.logical;

import org.apache.drill.common.logical.PlanProperties.Generator.ResultMode;
import org.apache.drill.common.logical.PlanProperties.PlanType;
import org.apache.drill.common.logical.data.LogicalOperator;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;

/**
 * A programmatic builder for logical plans.
 */
public class LogicalPlanBuilder {
  private PlanProperties planProperties;
  private ImmutableMap.Builder<String, StoragePluginConfig> storageEngines = ImmutableMap.builder();
  private ImmutableList.Builder<LogicalOperator> operators = ImmutableList.builder();

  public LogicalPlanBuilder planProperties(PlanProperties planProperties) {
    this.planProperties = planProperties;
    return this;
  }

  public LogicalPlanBuilder planProperties(PlanType type, int version, String generatorType, String generatorInfo, ResultMode mode){
    this.planProperties = PlanProperties.builder().generator(generatorType, generatorInfo).type(type).version(version).resultMode(mode).build();
    return this;
  }

  public LogicalPlanBuilder addStorageEngine(String name, StoragePluginConfig config) {
    this.storageEngines.put(name, config);
    return this;
  }
  public LogicalPlanBuilder addLogicalOperator(LogicalOperator operator) {
    this.operators.add(operator);
    return this;
  }
  public LogicalPlan build() {
    return new LogicalPlan(this.planProperties, this.storageEngines.build(), this.operators.build());
  }
}
