org.janusgraph.graphdb.util.ElementHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.janusgraph.graphdb.util.ElementHelper.java

Source

// Copyright 2017 JanusGraph Authors
//
// Licensed 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.janusgraph.graphdb.util;

import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import org.janusgraph.core.*;
import org.janusgraph.graphdb.relations.RelationIdentifier;
import org.apache.tinkerpop.gremlin.structure.*;

import javax.annotation.Nullable;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
 * @author Matthias Broecheler (me@matthiasb.com)
 */
public class ElementHelper {

    public static Iterable<Object> getValues(JanusGraphElement element, PropertyKey key) {
        if (element instanceof JanusGraphRelation) {
            Object value = element.valueOrNull(key);
            if (value == null)
                return Collections.EMPTY_LIST;
            else
                return ImmutableList.of(value);
        } else {
            assert element instanceof JanusGraphVertex;
            return Iterables.transform((((JanusGraphVertex) element).query()).keys(key.name()).properties(),
                    new Function<JanusGraphVertexProperty, Object>() {
                        @Nullable
                        @Override
                        public Object apply(@Nullable JanusGraphVertexProperty janusgraphProperty) {
                            return janusgraphProperty.value();
                        }
                    });
        }
    }

    public static long getCompareId(Element element) {
        Object id = element.id();
        if (id instanceof Long)
            return (Long) id;
        else if (id instanceof RelationIdentifier)
            return ((RelationIdentifier) id).getRelationId();
        else
            throw new IllegalArgumentException("Element identifier has unrecognized type: " + id);
    }

    public static void attachProperties(JanusGraphRelation element, Object... keyValues) {
        if (keyValues == null || keyValues.length == 0)
            return; //Do nothing
        org.apache.tinkerpop.gremlin.structure.util.ElementHelper.legalPropertyKeyValueArray(keyValues);
        if (org.apache.tinkerpop.gremlin.structure.util.ElementHelper.getIdValue(keyValues).isPresent())
            throw Edge.Exceptions.userSuppliedIdsNotSupported();
        if (org.apache.tinkerpop.gremlin.structure.util.ElementHelper.getLabelValue(keyValues).isPresent())
            throw new IllegalArgumentException("Cannot provide label as argument");
        org.apache.tinkerpop.gremlin.structure.util.ElementHelper.attachProperties(element, keyValues);
    }

    /**
     * This is essentially an adjusted copy&paste from TinkerPop's ElementHelper class.
     * The reason for copying it is so that we can determine the cardinality of a property key based on
     * JanusGraph's schema which is tied to this particular transaction and not the graph.
     *
     * @param vertex
     * @param propertyKeyValues
     */
    public static void attachProperties(final JanusGraphVertex vertex, final Object... propertyKeyValues) {
        if (null == vertex)
            throw Graph.Exceptions.argumentCanNotBeNull("vertex");

        for (int i = 0; i < propertyKeyValues.length; i = i + 2) {
            if (!propertyKeyValues[i].equals(T.id) && !propertyKeyValues[i].equals(T.label))
                vertex.property((String) propertyKeyValues[i], propertyKeyValues[i + 1]);
        }
    }

    public static Set<String> getPropertyKeys(JanusGraphVertex v) {
        final Set<String> s = new HashSet<>();
        v.query().properties().forEach(p -> s.add(p.propertyKey().name()));
        return s;
    }

}