content: /*
   * 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.carbondata.core.index.dev.expr;
  
  import org.apache.carbondata.core.metadata.schema.table.IndexSchema;
  
  /**
   * schema for index wrapper.
   * Currently a IndexWrapper contains more than one index, this class is used to describe its
   * schema. For example a AndIndexExprWrapper contains BloomFilter in its left and Lucene in
   * its right, then its schema would be AND(BloomFilter, Lucene)
   */
  public class IndexWrapperSimpleInfo {
    enum WrapperType {
      PRIMITIVE,
      AND,
      OR
    }
  
    private WrapperType wrapperType;
    private IndexWrapperSimpleInfo left;
    private IndexWrapperSimpleInfo right;
    private IndexSchema schema;
  
    private IndexWrapperSimpleInfo(WrapperType wrapperType, IndexWrapperSimpleInfo left,
        IndexWrapperSimpleInfo right) {
      this.wrapperType = wrapperType;
      this.left = left;
      this.right = right;
    }
  
    private IndexWrapperSimpleInfo(IndexSchema schema) {
      this.wrapperType = WrapperType.PRIMITIVE;
      this.schema = schema;
    }
  
    public static IndexWrapperSimpleInfo fromIndexWrapper(IndexExprWrapper indexExprWrapper) {
      if (indexExprWrapper instanceof IndexExprWrapperImpl) {
        return new IndexWrapperSimpleInfo(
            ((IndexExprWrapperImpl) indexExprWrapper).getIndexSchema());
      } else if (indexExprWrapper instanceof AndIndexExprWrapper) {
        return new IndexWrapperSimpleInfo(WrapperType.AND,
            fromIndexWrapper(indexExprWrapper.getLeftIndexWrapper()),
            fromIndexWrapper(indexExprWrapper.getRightIndexWrapper()));
      } else {
        return new IndexWrapperSimpleInfo(WrapperType.OR,
            fromIndexWrapper(indexExprWrapper.getLeftIndexWrapper()),
            fromIndexWrapper(indexExprWrapper.getRightIndexWrapper()));
      }
    }
  
    public String getIndexWrapperName() {
      if (WrapperType.PRIMITIVE == wrapperType) {
        return schema.getIndexName();
      } else {
        return String.format("%s(%s, %s)",
            wrapperType, left.getIndexWrapperName(), right.getIndexWrapperName());
      }
    }
  
    public String getIndexWrapperProvider() {
      if (WrapperType.PRIMITIVE == wrapperType) {
        return schema.getProviderName();
      } else {
        return String.format("%s(%s, %s)",
            wrapperType, left.getIndexWrapperProvider(), right.getIndexWrapperProvider());
      }
    }
  
    @Override
    public String toString() {
      return "IndexWrapperSchema: Name->" + getIndexWrapperName()
          + ", Provider->" + getIndexWrapperProvider();
    }
  }
  