/* * Copyright (c) 2002-2017 "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.*; 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 List<String> columns = new ArrayList<>(); public BoltGraphRowModelAdapter(BoltGraphModelAdapter graphModelAdapter) { super(graphModelAdapter); } @Override public GraphRowModel adapt(Map<String, Object> data) { if (columns == null) { throw new ResultProcessingException("Column data cannot be null!"); } Set<Long> nodeIdentities = new HashSet<>(); Set<Long> edgeIdentities = new HashSet<>(); GraphModel graphModel = new DefaultGraphModel(); List<String> variables = new ArrayList<>(); List<Object> 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<String> 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<String> iterator, Map<String, Object> data, GraphModel graphModel, List<String> variables, List<Object> values, Set<Long> nodeIdentities, Set<Long> edgeIdentities) { while (iterator.hasNext()) { String key = iterator.next(); variables.add(key); Object value = data.get(key); if (value.getClass().isArray()) { Iterable<Object> collection = AdapterUtils.convertToIterable(value); for (Object element : collection) { adapt(element, graphModel, values, nodeIdentities, edgeIdentities); } } else { adapt(value, graphModel, values, nodeIdentities, edgeIdentities); } } } public void setColumns(List<String> columns) { this.columns = columns; } }