All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.neo4j.ogm.drivers.bolt.response.BoltGraphRowModelAdapter Maven / Gradle / Ivy

Go to download

Neo4j-OGM transport that uses the official Java-Driver to connect to Neo4j via the Bolt-protocol.

There is a newer version: 4.0.14
Show newest version
/*
 * Copyright (c) 2002-2016 "Neo Technology,"
 * Network Engine for Objects in Lund AB [http://neotechnology.com]
 *
 * This product is licensed to you under the Apache License, Version 2.0 (the "License").
 * You may not use this product except in compliance with the License.
 *
 * This product may include a number of subcomponents with
 * separate copyright notices and license terms. Your use of the source
 * code for these subcomponents is subject to the terms and
 *  conditions of the subcomponent's license, as noted in the LICENSE file.
 */

package org.neo4j.ogm.drivers.bolt.response;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.neo4j.ogm.exception.ResultProcessingException;
import org.neo4j.ogm.model.GraphModel;
import org.neo4j.ogm.model.GraphRowModel;
import org.neo4j.ogm.response.model.DefaultGraphModel;
import org.neo4j.ogm.response.model.DefaultGraphRowModel;
import org.neo4j.ogm.response.model.DefaultRowModel;
import org.neo4j.ogm.result.adapter.AdapterUtils;
import org.neo4j.ogm.result.adapter.GraphRowModelAdapter;

/**
 * @author Luanne Misquitta
 */
public class BoltGraphRowModelAdapter extends GraphRowModelAdapter {

	private BoltGraphModelAdapter graphModelAdapter;

	private List columns = new ArrayList<>();

	public BoltGraphRowModelAdapter(BoltGraphModelAdapter graphModelAdapter) {
		super(graphModelAdapter);
		this.graphModelAdapter = graphModelAdapter;
	}

	@Override
	public GraphRowModel adapt(Map data) {
		if (columns == null) {
			throw new ResultProcessingException("Column data cannot be null!");
		}

		Set nodeIdentities = new HashSet<>();
		Set edgeIdentities = new HashSet<>();

		GraphModel graphModel = new DefaultGraphModel();
		List variables = new ArrayList<>();
		List values = new ArrayList<>();

		// there is no guarantee that the objects in the data are ordered the same way as required by the columns
		// so we use the columns information to extract them in the correct order for post-processing.
		Iterator iterator = columns.iterator();

		adapt(iterator, data, graphModel, variables, values, nodeIdentities, edgeIdentities);

		DefaultRowModel rowModel = new DefaultRowModel(values.toArray(new Object[]{}), variables.toArray(new String[]{}));

		return new DefaultGraphRowModel(graphModel, rowModel.getValues());
	}

	private void adapt(Iterator iterator, Map data, GraphModel graphModel, List variables, List values, Set nodeIdentities, Set edgeIdentities) {

		while (iterator.hasNext()) {

			String key = iterator.next();
			variables.add(key);

			Object value = data.get(key);

			if (value.getClass().isArray()) {
				Iterable collection = AdapterUtils.convertToIterable(value);
				for (Object element : collection) {
					adapt(element, graphModel, values, nodeIdentities, edgeIdentities);
				}
			} else {
				adapt(value, graphModel, values, nodeIdentities, edgeIdentities);
			}
		}
	}

	private void adapt(Object element, GraphModel graphModel, List values, Set nodeIdentities, Set edgeIdentities) {
		if (graphModelAdapter.isPath(element)) {
			graphModelAdapter.buildPath(element, graphModel, nodeIdentities, edgeIdentities);
		} else if (graphModelAdapter.isNode(element)) {
			graphModelAdapter.buildNode(element, graphModel, nodeIdentities);
		} else if (graphModelAdapter.isRelationship(element)) {
			graphModelAdapter.buildRelationship(element, graphModel, nodeIdentities, edgeIdentities);
		} else {
			values.add(element);
		}
	}

	public void setColumns(List columns) {
		this.columns = columns;
	}
}