<commit_before>/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.jena.sparql.core.assembler;

import static java.nio.file.Files.createTempFile;
import static org.apache.jena.assembler.JA.*;
import static org.apache.jena.assembler.Mode.DEFAULT;
import static org.apache.jena.query.DatasetFactory.createTxnMem;
import static org.apache.jena.rdf.model.ModelFactory.createDefaultModel;
import static org.apache.jena.riot.Lang.NQUADS;
import static org.apache.jena.riot.RDFDataMgr.write;
import static org.apache.jena.riot.RDFFormat.NTRIPLES;
import static org.apache.jena.sparql.core.assembler.DatasetAssemblerVocab.pGraphName;
import static org.apache.jena.sparql.core.assembler.DatasetAssemblerVocab.pNamedGraph;
import static org.apache.jena.vocabulary.RDF.type;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Path;
import java.util.Iterator;

import org.apache.jena.assembler.exceptions.CannotConstructException;
import org.apache.jena.graph.Node;
import org.apache.jena.query.Dataset;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.sparql.core.Quad;
import org.junit.Assert;
import org.junit.Test;

/**
 * Tests for {@link InMemDatasetAssembler}
 *
 */
public class TestInMemDatasetAssembler extends Assert {

	/**
	 * @param example
	 */
	private Dataset assemble(final Resource example) {
		final InMemDatasetAssembler testAssembler = new InMemDatasetAssembler();
		return testAssembler.open(testAssembler, example, DEFAULT);
	}

	@Test
	public void directDataLinkForDefaultAndNamedGraphs() throws IOException {
		// first make a file of triples to load later
		final Model model = createDefaultModel();
		final Path triples = createTempFile("simpleExample", ".nt");
		final Resource triplesURI = model.createResource(triples.toFile().toURI().toString());
		final Resource simpleExample = model.createResource("test:simpleExample");
		simpleExample.addProperty(type, MemoryDataset);
		// add a default graph
		simpleExample.addProperty(data, triplesURI);
		// add a named graph
		final Resource namedGraphDef = model.createResource("test:namedGraphDef");
		simpleExample.addProperty(pNamedGraph, namedGraphDef);
		final Resource namedGraphName = model.createResource("test:namedGraphExample");
		namedGraphDef.addProperty(type, MemoryModel);
		namedGraphDef.addProperty(pGraphName, namedGraphName);
		namedGraphDef.addProperty(data, triplesURI);

		try (OutputStream out = new FileOutputStream(triples.toFile())) {
			write(out, model, NTRIPLES);
		}

		final Dataset dataset = assemble(simpleExample);
		final Model assembledDefaultModel = dataset.getDefaultModel();
		final Model assembledNamedModel = dataset.getNamedModel(namedGraphName.getURI());

		// we put the same triples in each model, so we check for the same triples in each model
		for (final Model m : new Model[] { assembledDefaultModel, assembledNamedModel }) {
			assertTrue(m.contains(simpleExample, pNamedGraph, namedGraphDef));
			assertTrue(m.contains(namedGraphDef, pGraphName, namedGraphName));
			assertTrue(m.contains(simpleExample, data, triplesURI));

		}
		final Iterator<Node> graphNodes = dataset.asDatasetGraph().listGraphNodes();
		assertTrue(graphNodes.hasNext());
		assertEquals(namedGraphName.asNode(), graphNodes.next());
		assertFalse(graphNodes.hasNext());
	}

	@Test
	public void directDataLinkToQuads() throws IOException {
		// first make a file of quads to load later
		final Model model = createDefaultModel();
		final Path quads = createTempFile("quadExample", ".nq");
		final Resource quadsURI = model.createResource(quads.toFile().toURI().toString());
		final Resource simpleExample = model.createResource("test:simpleExample");
		simpleExample.addProperty(type, MemoryDataset);
		simpleExample.addProperty(data, quadsURI);

		final DatasetGraph dsg = createTxnMem().asDatasetGraph();
		model.listStatements().mapWith(Statement::asTriple).mapWith(t -> new Quad(quadsURI.asNode(), t))
				.forEachRemaining(dsg::add);
		try (OutputStream out = new FileOutputStream(quads.toFile())) {
			write(out, dsg, NQUADS);
		}

		final Dataset dataset = assemble(simpleExample);
		final Model assembledDefaultModel = dataset.getDefaultModel();
		final Model assembledNamedModel = dataset.getNamedModel(quadsURI.getURI());
		assertTrue(assembledDefaultModel.isEmpty());
		assertTrue(assembledNamedModel.contains(assembledNamedModel.createStatement(simpleExample, data, quadsURI)));
	}

	@Test(expected = CannotConstructException.class)
	public void wrongKindOfAssemblerDefinition() {
		final Model model = createDefaultModel();
		final Resource badExample = model.createResource("test:badExample");
		assemble(badExample);
	}

	public void emptyDataset() {
		final Model model = createDefaultModel();
		final Resource empty = model.createResource("test:empty");
		empty.addProperty(type, MemoryDataset);
		assertTrue(assemble(empty).asDatasetGraph().isEmpty());
	}
}<commit_msg>Add test for empty dataset.<commit_after>/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.jena.sparql.core.assembler;

import static java.nio.file.Files.createTempFile;
import static org.apache.jena.assembler.JA.MemoryDataset ;
import static org.apache.jena.assembler.JA.MemoryModel ;
import static org.apache.jena.assembler.JA.data ;
import static org.apache.jena.assembler.Mode.DEFAULT;
import static org.apache.jena.query.DatasetFactory.createTxnMem;
import static org.apache.jena.rdf.model.ModelFactory.createDefaultModel;
import static org.apache.jena.riot.Lang.NQUADS;
import static org.apache.jena.riot.RDFDataMgr.write;
import static org.apache.jena.riot.RDFFormat.NTRIPLES;
import static org.apache.jena.sparql.core.assembler.DatasetAssemblerVocab.pGraphName;
import static org.apache.jena.sparql.core.assembler.DatasetAssemblerVocab.pNamedGraph;
import static org.apache.jena.vocabulary.RDF.type;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Path;
import java.util.Iterator;

import org.apache.jena.assembler.JA ;
import org.apache.jena.assembler.exceptions.CannotConstructException;
import org.apache.jena.graph.Node;
import org.apache.jena.query.Dataset;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.sparql.core.Quad;
import org.junit.Assert;
import org.junit.Test;

/**
 * Tests for {@link InMemDatasetAssembler}
 *
 */
public class TestInMemDatasetAssembler extends Assert {

    private Dataset assemble(final Resource example) {
	    Model model = example.getModel() ;
	    model.setNsPrefix("ja", JA.getURI()) ;
//	    System.out.println("-------------");
//	    RDFDataMgr.write(System.out, model, Lang.TTL) ;
	    final InMemDatasetAssembler testAssembler = new InMemDatasetAssembler();
		return testAssembler.open(testAssembler, example, DEFAULT);
	}
	
	@Test
	public void emptyDataset() {
	    final Model model = createDefaultModel();
	    final Resource empty = model.createResource("test:empty");
	    empty.addProperty(type, MemoryDataset);
	    Dataset dataset = assemble(empty) ;
	    assertFalse(dataset.asDatasetGraph().find().hasNext()) ;
	}

	@Test
	public void directDataLinkForDefaultAndNamedGraphs() throws IOException {
		// first make a file of triples to load later
		final Model model = createDefaultModel();
		final Path triples = createTempFile("simpleExample", ".nt");
		final Resource triplesURI = model.createResource(triples.toFile().toURI().toString());
		final Resource simpleExample = model.createResource("test:simpleExample");
		simpleExample.addProperty(type, MemoryDataset);
		// add a default graph
		simpleExample.addProperty(data, triplesURI);
		// add a named graph
		final Resource namedGraphDef = model.createResource("test:namedGraphDef");
		simpleExample.addProperty(pNamedGraph, namedGraphDef);
		final Resource namedGraphName = model.createResource("test:namedGraphExample");
		namedGraphDef.addProperty(type, MemoryModel);
		namedGraphDef.addProperty(pGraphName, namedGraphName);
		namedGraphDef.addProperty(data, triplesURI);

		try (OutputStream out = new FileOutputStream(triples.toFile())) {
			write(out, model, NTRIPLES);
		}

		final Dataset dataset = assemble(simpleExample);
		final Model assembledDefaultModel = dataset.getDefaultModel();
		final Model assembledNamedModel = dataset.getNamedModel(namedGraphName.getURI());

		// we put the same triples in each model, so we check for the same triples in each model
		for (final Model m : new Model[] { assembledDefaultModel, assembledNamedModel }) {
			assertTrue(m.contains(simpleExample, pNamedGraph, namedGraphDef));
			assertTrue(m.contains(namedGraphDef, pGraphName, namedGraphName));
			assertTrue(m.contains(simpleExample, data, triplesURI));

		}
		final Iterator<Node> graphNodes = dataset.asDatasetGraph().listGraphNodes();
		assertTrue(graphNodes.hasNext());
		assertEquals(namedGraphName.asNode(), graphNodes.next());
		assertFalse(graphNodes.hasNext());
	}

	@Test
	public void directDataLinkToQuads() throws IOException {
		// first make a file of quads to load later
		final Model model = createDefaultModel();
		final Path quads = createTempFile("quadExample", ".nq");
		final Resource quadsURI = model.createResource(quads.toFile().toURI().toString());
		final Resource simpleExample = model.createResource("test:simpleExample");
		simpleExample.addProperty(type, MemoryDataset);
		simpleExample.addProperty(data, quadsURI);

		final DatasetGraph dsg = createTxnMem().asDatasetGraph();
		model.listStatements().mapWith(Statement::asTriple).mapWith(t -> new Quad(quadsURI.asNode(), t))
				.forEachRemaining(dsg::add);
		try (OutputStream out = new FileOutputStream(quads.toFile())) {
			write(out, dsg, NQUADS);
		}

		final Dataset dataset = assemble(simpleExample);
		final Model assembledDefaultModel = dataset.getDefaultModel();
		final Model assembledNamedModel = dataset.getNamedModel(quadsURI.getURI());
		assertTrue(assembledDefaultModel.isEmpty());
		assertTrue(assembledNamedModel.contains(assembledNamedModel.createStatement(simpleExample, data, quadsURI)));
	}

	@Test(expected = CannotConstructException.class)
	public void wrongKindOfAssemblerDefinition() {
		final Model model = createDefaultModel();
		final Resource badExample = model.createResource("test:badExample");
		assemble(badExample);
	}
}
{'fraction_non_alphanumeric': 0.10627580511973575, 'fraction_numerical': 0.0006606110652353427, 'mean_word_length': 5.445449707291112, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5111565', 'n_tokens_mistral': 3630, 'n_tokens_neox': 3504, 'n_words': 869}