SparqlQueryEvaluatorDefaultTest.java

/*******************************************************************************
 * Copyright (c) 2023 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.http.server.readonly.sparql;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Literal;
import org.eclipse.rdf4j.model.Model;
import org.eclipse.rdf4j.model.util.ModelBuilder;
import org.eclipse.rdf4j.model.util.Values;
import org.eclipse.rdf4j.query.MalformedQueryException;
import org.eclipse.rdf4j.repository.Repository;
import org.eclipse.rdf4j.repository.RepositoryConnection;
import org.eclipse.rdf4j.repository.sail.SailRepository;
import org.eclipse.rdf4j.sail.memory.MemoryStore;
import org.junit.jupiter.api.Test;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;

public class SparqlQueryEvaluatorDefaultTest {

	private static final IRI CTX1 = Values.iri("http://example.com/ctx1");

	private static final IRI CTX2 = Values.iri("http://example.com/ctx2");

	private static final IRI TYP1 = Values.iri("http://example.com/typ1");

	private static final IRI TYP2 = Values.iri("http://example.com/typ2");

	@Test
	public void queryWithoutContext() throws MalformedQueryException, IllegalStateException, IOException {
		Repository repo = new SailRepository(new MemoryStore());
		try (RepositoryConnection con = repo.getConnection()) {
			con.add(getTestModel1(), CTX1);
			con.add(getTestModel2(), CTX2);
			con.getStatements(null, null, null).forEach(System.out::println);
		}

		EvaluateResult evaluateResult = new EvaluateResultDefault(new ByteArrayOutputStream());
		SparqlQueryEvaluator sparqlQueryEvaluator = new SparqlQueryEvaluatorDefault();

		String queryString = "SELECT ?subject ?predicate ?object WHERE { ?subject ?predicate ?object} ";
		String[] namedGraphUris = null;// new String[] {};

		String[] defaultGraphUri = null;// new String[] {};

		sparqlQueryEvaluator.evaluate(evaluateResult, repo, queryString, null,
				defaultGraphUri, namedGraphUris);

		ArrayNode bindingArray = asArrayNode(evaluateResult);
		assertEquals(4, bindingArray.size());
	}

	@Test
	public void queryWithDefaultGraphUri() throws MalformedQueryException, IllegalStateException, IOException {
		Repository repo = new SailRepository(new MemoryStore());
		try (RepositoryConnection con = repo.getConnection()) {
			con.add(getTestModel1(), CTX1);
			con.add(getTestModel2(), CTX1);
			con.getStatements(null, null, null).forEach(System.out::println);
		}

		EvaluateResult evaluateResult = new EvaluateResultDefault(new ByteArrayOutputStream());
		SparqlQueryEvaluator sparqlQueryEvaluator = new SparqlQueryEvaluatorDefault();

		String queryString = "SELECT ?subject ?predicate ?object WHERE { ?subject ?predicate ?object} ";
		String[] namedGraphUris = new String[] {};
		String[] defaultGraphUri = new String[] { CTX1.stringValue() };

		sparqlQueryEvaluator.evaluate(evaluateResult, repo, queryString, null,
				defaultGraphUri, namedGraphUris);

		ArrayNode bindingArray = asArrayNode(evaluateResult);
		assertEquals(4, bindingArray.size());
	}

	@Test
	public void queryWithDefaultGraphUriAndNamedGraphUris()
			throws MalformedQueryException, IllegalStateException, IOException {
		Repository repo = new SailRepository(new MemoryStore());
		try (RepositoryConnection con = repo.getConnection()) {
			con.add(getTestModel1(), CTX1);
			con.add(getTestModel2(), CTX2);
			con.getStatements(null, null, null).forEach(System.out::println);
		}

		EvaluateResult evaluateResult = new EvaluateResultDefault(new ByteArrayOutputStream());
		SparqlQueryEvaluator sparqlQueryEvaluator = new SparqlQueryEvaluatorDefault();

		String queryString = "SELECT ?subject ?predicate ?object WHERE { ?subject ?predicate ?object} ";
		String[] namedGraphUris = new String[] { CTX2.stringValue() };
		String[] defaultGraphUri = new String[] { CTX1.stringValue() };

		sparqlQueryEvaluator.evaluate(evaluateResult, repo, queryString, null,
				defaultGraphUri, namedGraphUris);

		ArrayNode bindingArray = asArrayNode(evaluateResult);
		assertEquals(2, bindingArray.size());
	}

	@Test
	public void queryWithNamedGraphUris() throws MalformedQueryException, IllegalStateException, IOException {
		Repository repo = new SailRepository(new MemoryStore());
		try (RepositoryConnection con = repo.getConnection()) {
			con.add(getTestModel1(), CTX1);
			con.add(getTestModel2(), CTX2);
			con.getStatements(null, null, null).forEach(System.out::println);
		}

		EvaluateResult evaluateResult = new EvaluateResultDefault(new ByteArrayOutputStream());
		SparqlQueryEvaluator sparqlQueryEvaluator = new SparqlQueryEvaluatorDefault();

		String queryString = "SELECT ?subject ?predicate ?object WHERE { ?subject ?predicate ?object} ";
		String[] namedGraphUris = new String[] {};
		String[] defaultGraphUri = new String[] { CTX1.stringValue(), CTX2.stringValue() };

		sparqlQueryEvaluator.evaluate(evaluateResult, repo, queryString, null,
				defaultGraphUri, namedGraphUris);

		ArrayNode bindingArray = asArrayNode(evaluateResult);
		assertEquals(4, bindingArray.size());
	}

	private Model getTestModel1() {
		Literal obj1_1 = Values.literal("testValue_user1_obj1_1");
		Literal obj1_2 = Values.literal("testValue_user1_obj1_2");
		IRI obj1 = Values.iri("http://example.com/user1/object1");
		Model model = new ModelBuilder()
				.subject(obj1)
				.add(TYP1, obj1_1)
				.add(TYP2, obj1_2)
				.build();
		return model;
	}

	private Model getTestModel2() {
		Literal obj2_1 = Values.literal("testValue_user1_obj2_1");
		Literal obj2_2 = Values.literal("testValue_user1_obj2_2");
		IRI obj2 = Values.iri("http://example.com/user1/object2");

		Model model = new ModelBuilder()
				.subject(obj2)
				.add(TYP1, obj2_1)
				.add(TYP2, obj2_2)
				.build();
		return model;
	}

	private ArrayNode asArrayNode(EvaluateResult evaluateResult)
			throws IOException, JsonProcessingException, JsonMappingException {
		ByteArrayOutputStream stream = (ByteArrayOutputStream) evaluateResult.getOutputstream();
		String evaluateResultString = new String(stream.toByteArray());
		System.out.println(evaluateResultString);
		ObjectMapper mapper = new ObjectMapper();
		JsonNode root = mapper.readTree(evaluateResultString);
		ArrayNode bindingArray = (ArrayNode) root.get("results").get("bindings");
		return bindingArray;
	}
}