GremlinResultEdgeReader.java
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package com.azure.spring.data.gremlin.conversion.result;
import com.azure.spring.data.gremlin.common.Constants;
import com.azure.spring.data.gremlin.common.GremlinUtils;
import com.azure.spring.data.gremlin.conversion.source.GremlinSource;
import com.azure.spring.data.gremlin.conversion.source.GremlinSourceEdge;
import com.azure.spring.data.gremlin.exception.GremlinUnexpectedSourceTypeException;
import org.apache.tinkerpop.gremlin.driver.Result;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
public class GremlinResultEdgeReader extends AbstractGremlinResultReader {
private <T> void readProperties(@NonNull GremlinSource<T> source, @Nullable Map<String, Object> properties) {
Assert.notNull(source, "source should not be null");
if (properties != null) {
properties.forEach(source::setProperty);
}
}
private <T> void validate(List<Result> results, GremlinSource<T> source) {
Assert.notNull(results, "Results should not be null.");
Assert.notNull(source, "GremlinSource should not be null.");
Assert.isTrue(results.size() == 1, "Edge should contain only one result.");
final Result result = results.get(0);
Assert.isInstanceOf(Map.class, result.getObject(), "should be one instance of Map");
@SuppressWarnings("unchecked") final Map<String, Object> map = (Map<String, Object>) result.getObject();
Assert.isTrue(map.containsKey(Constants.PROPERTY_ID), "should contain id property");
Assert.isTrue(map.containsKey(Constants.PROPERTY_LABEL), "should contain label property");
Assert.isTrue(map.containsKey(Constants.PROPERTY_TYPE), "should contain type property");
Assert.isTrue(map.containsKey(Constants.PROPERTY_INV), "should contain inV property");
Assert.isTrue(map.containsKey(Constants.PROPERTY_OUTV), "should contain outV property");
Assert.isTrue(map.get(Constants.PROPERTY_TYPE).equals(Constants.RESULT_TYPE_EDGE), "must be vertex type");
}
@Override
@SuppressWarnings("unchecked")
public <T> void read(@NonNull List<Result> results, @NonNull GremlinSource<T> source) {
if (!(source instanceof GremlinSourceEdge)) {
throw new GremlinUnexpectedSourceTypeException("Should be instance of GremlinSourceEdge");
}
validate(results, source);
final GremlinSourceEdge<T> sourceEdge = (GremlinSourceEdge<T>) source;
final Map<String, Object> map = (Map<String, Object>) results.get(0).getObject();
this.readProperties(source, (Map<String, Object>) map.get(Constants.PROPERTY_PROPERTIES));
final String className = source.getProperties().get(Constants.GREMLIN_PROPERTY_CLASSNAME).toString();
sourceEdge.setIdField(GremlinUtils.getIdField(GremlinUtils.toEntityClass(className)));
sourceEdge.setId(map.get(Constants.PROPERTY_ID));
sourceEdge.setLabel(map.get(Constants.PROPERTY_LABEL).toString());
sourceEdge.setVertexIdFrom(map.get(Constants.PROPERTY_OUTV));
sourceEdge.setVertexIdTo(map.get(Constants.PROPERTY_INV));
}
}