/**
 * 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.atlas.repository.graphdb.titan0.query;

import java.util.Collection;

import org.apache.atlas.repository.graphdb.AtlasEdge;
import org.apache.atlas.repository.graphdb.AtlasGraphQuery.ComparisionOperator;
import org.apache.atlas.repository.graphdb.AtlasVertex;
import org.apache.atlas.repository.graphdb.titan.query.NativeTitanGraphQuery;
import org.apache.atlas.repository.graphdb.titan0.Titan0GraphDatabase;
import org.apache.atlas.repository.graphdb.titan0.Titan0Edge;
import org.apache.atlas.repository.graphdb.titan0.Titan0Graph;
import org.apache.atlas.repository.graphdb.titan0.Titan0Vertex;

import com.thinkaurelius.titan.core.TitanGraphQuery;
import com.thinkaurelius.titan.core.attribute.Contain;
import com.thinkaurelius.titan.graphdb.query.TitanPredicate;
import com.tinkerpop.blueprints.Compare;

/**
 * Titan 0.5.4 implementation of NativeTitanGraphQuery.
 *
 * @author jeff
 *
 */
public class NativeTitan0GraphQuery implements NativeTitanGraphQuery<Titan0Vertex, Titan0Edge> {

    private Titan0Graph graph;
    private TitanGraphQuery<?> query;

    public NativeTitan0GraphQuery(Titan0Graph graph) {
        query = Titan0GraphDatabase.getGraphInstance().query();
        this.graph = graph;
    }

    @Override
    public Iterable<AtlasVertex<Titan0Vertex, Titan0Edge>> vertices() {
        Iterable it = query.vertices();
        return graph.wrapVertices(it);
    }

    @Override
    public Iterable<AtlasEdge<Titan0Vertex, Titan0Edge>> edges() {
        Iterable it = query.edges();
        return graph.wrapEdges(it);
    }

    @Override
    public void in(String propertyName, Collection<?> values) {
        query.has(propertyName, Contain.IN, values);

    }

    @Override
    public void has(String propertyName, ComparisionOperator op, Object value) {

        Compare c = getGremlinPredicate(op);
        TitanPredicate pred = TitanPredicate.Converter.convert(c);
        query.has(propertyName, pred, value);
    }

    private Compare getGremlinPredicate(ComparisionOperator op) {
        switch (op) {
        case EQUAL:
            return Compare.EQUAL;
        case GREATER_THAN_EQUAL:
            return Compare.GREATER_THAN_EQUAL;
        case LESS_THAN_EQUAL:
            return Compare.LESS_THAN_EQUAL;
        case NOT_EQUAL:
            return Compare.NOT_EQUAL;

        default:
            throw new RuntimeException("Unsupported comparison operator:" + op);
        }
    }

}
