result_helpers.go 2.1 KB
Newer Older
J
Jeet Parekh 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
/*
 * Copyright (c) 2002-2019 "Neo4j,"
 * Neo4j Sweden AB [http://neo4j.com]
 *
 * This file is part of Neo4j.
 *
 * 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 neo4j

// Single returns one and only one record from the result stream. Any error passed in
// or reported while navigating the result stream is returned without any conversion.
// If the result stream contains zero or more than one records error is returned.
func Single(from interface{}, err error) (Record, error) {
	var result Result
	var record Record
	var ok bool

	if err != nil {
		return nil, err
	}

	if result, ok = from.(Result); !ok {
		return nil, newDriverError("expected from to be a result but it was '%v'", from)
	}

	if result.Next() {
		record = result.Record()
	}

	if err := result.Err(); err != nil {
		return nil, err
	}

	if record == nil {
		return nil, newDriverError("result contains no records")
	}

	if result.Next() {
		return nil, newDriverError("result contains more than one record")
	}

	return record, nil
}

// Collect loops through the result stream, collects records into a slice and returns the
// resulting slice. Any error passed in or reported while navigating the result stream is
// returned without any conversion.
func Collect(from interface{}, err error) ([]Record, error) {
	var result Result
	var list []Record
	var ok bool

	if err != nil {
		return nil, err
	}

	if result, ok = from.(Result); !ok {
		return nil, newDriverError("expected from to be a result but it was '%v'", from)
	}

	for result.Next() {
		list = append(list, result.Record())
	}
	if err := result.Err(); err != nil {
		return nil, err
	}

	return list, nil
}