DefaultCollectionFactory.java

/*******************************************************************************
 * Copyright (c) 2022 Eclipse RDF4J contributors.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Distribution License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *******************************************************************************/
package org.eclipse.rdf4j.collection.factory.impl;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.function.ToIntFunction;

import org.eclipse.rdf4j.collection.factory.api.BindingSetKey;
import org.eclipse.rdf4j.collection.factory.api.CollectionFactory;
import org.eclipse.rdf4j.common.exception.RDF4JException;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.query.BindingSet;
import org.eclipse.rdf4j.query.MutableBindingSet;

/**
 * A DefaultCollectionFactory that provides lists/sets/maps using standard common java in memory types
 */
public class DefaultCollectionFactory implements CollectionFactory {

	@Override
	public <T> List<T> createList() {
		return new ArrayList<T>();
	}

	@Override
	public List<Value> createValueList() {
		return new ArrayList<>();
	}

	@Override
	public <T> Set<T> createSet() {
		return new HashSet<T>();
	}

	@Override
	public Set<Value> createValueSet() {
		return new HashSet<>();
	}

	@Override
	public Set<BindingSet> createSetOfBindingSets(Supplier<MutableBindingSet> create,
			Function<String, Predicate<BindingSet>> getHas, Function<String, Function<BindingSet, Value>> getget,
			Function<String, BiConsumer<Value, MutableBindingSet>> getSet) {
		return new HashSet<>();
	}

	@Override
	public <K, V> Map<K, V> createMap() {
		return new HashMap<K, V>();
	}

	@Override
	public <V> Map<Value, V> createValueKeyedMap() {
		return new HashMap<Value, V>();
	}

	@Override
	public <T> Queue<T> createQueue() {
		return new ArrayDeque<T>();
	}

	@Override
	public Queue<Value> createValueQueue() {
		return new ArrayDeque<Value>();
	}

	@Override
	public void close() throws RDF4JException {
		// Nothing to do here.
	}

	@Override
	public <E> Map<BindingSetKey, E> createGroupByMap() {
		return new LinkedHashMap<>();
	}

	@Override
	public BindingSetKey createBindingSetKey(BindingSet bindingSet, List<Function<BindingSet, Value>> getValues,
			ToIntFunction<BindingSet> hashOfBindingSetCalculator) {
		List<Value> values = new ArrayList<>(getValues.size());
		for (int i = 0; i < getValues.size(); i++) {
			values.add(getValues.get(i).apply(bindingSet));
		}
		return new DefaultBindingSetKey(values, hashOfBindingSetCalculator.applyAsInt(bindingSet));
	}
}