/*
 * 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.exec.store.mapr.db.util;

import com.google.common.collect.Queues;
import org.apache.drill.common.expression.PathSegment;
import org.apache.drill.common.expression.SchemaPath;
import org.ojai.FieldPath;
import org.ojai.FieldSegment;
import java.util.Deque;

public class FieldPathHelper {

  /**
   * Returns {@link FieldPath} equivalent of the specified {@link SchemaPath}.
   *
   * @param schemaPath {@link SchemaPath} instance that should be converted
   * @return {@link FieldPath} equivalent of the specified {@link SchemaPath}.
   */
  public static FieldPath schemaPathToFieldPath(SchemaPath schemaPath) {
    Deque<PathSegment> pathSegments = Queues.newArrayDeque();
    PathSegment pathSegment = schemaPath.getRootSegment();
    while (pathSegment != null) {
      pathSegments.push(pathSegment);
      pathSegment = pathSegment.getChild();
    }

    FieldSegment child = null;
    while (!pathSegments.isEmpty()) {
      pathSegment = pathSegments.pop();
      if (pathSegment.isNamed()) {
        child = new FieldSegment.NameSegment(((PathSegment.NameSegment) pathSegment).getPath(), child, false);
      } else {
        child = new FieldSegment.IndexSegment(String.valueOf(((PathSegment.ArraySegment) pathSegment).getIndex()), child);
      }
    }
    return new FieldPath((FieldSegment.NameSegment) child);
  }
}
