From 05f702d397e0173676c8133661681547d52afa09 Mon Sep 17 00:00:00 2001 From: Erich Bremer Date: Thu, 11 Jun 2026 12:21:35 -0400 Subject: [PATCH 1/4] fixes --- .../beakgraph/core/BGDatasetGraph.java | 68 ++++++++- .../com/ebremer/beakgraph/core/BeakGraph.java | 20 ++- .../core/fuseki/BGSparqlService.java | 29 +++- .../core/fuseki/LWSStorageServlet.java | 77 +++++++++- .../beakgraph/core/fuseki/SPARQLEndPoint.java | 8 +- .../beakgraph/features/MajorMinor.java | 17 ++- .../beakgraph/hdf5/jena/BGIteratorMaster.java | 6 +- .../beakgraph/hdf5/jena/BGIteratorOS.java | 22 ++- .../beakgraph/hdf5/jena/BGIteratorPOS.java | 93 ++++++++---- .../beakgraph/hdf5/jena/BGIteratorSO.java | 54 +++---- .../hdf5/jena/BGIteratorSPO_All.java | 99 +++++++++---- .../ebremer/beakgraph/hdf5/jena/BGReader.java | 6 + .../beakgraph/hdf5/jena/BindingBG.java | 30 +++- .../beakgraph/hdf5/jena/BindingNodeId.java | 52 +++++++ .../beakgraph/hdf5/jena/OpExecutorBG.java | 134 ++---------------- .../hdf5/jena/QueryIterDictionary.java | 25 ---- .../hdf5/jena/SpatialIndexIterator.java | 12 +- .../beakgraph/hdf5/readers/HDF5Reader.java | 98 ++++++++++--- .../readers/PositionalDictionaryReader.java | 9 ++ .../beakgraph/hdf5/writers/FCDWriter.java | 12 +- .../writers/MultiTypeDictionaryWriter.java | 3 + .../PositionalDictionaryWriterBuilder.java | 51 ++++++- .../beakgraph/pool/BeakGraphPoolFactory.java | 10 ++ .../ebremer/beakgraph/turbo/Intersects.java | 47 +++--- .../com/ebremer/beakgraph/turbo/Spatial.java | 14 +- .../ebremer/beakgraph/utils/ImageTools.java | 19 ++- .../ebremer/halcyon/hilbert/HilbertSpace.java | 29 ++-- .../core/fuseki/LWSStorageServletTest.java | 38 +++++ 28 files changed, 735 insertions(+), 347 deletions(-) delete mode 100644 src/main/java/com/ebremer/beakgraph/hdf5/jena/QueryIterDictionary.java diff --git a/src/main/java/com/ebremer/beakgraph/core/BGDatasetGraph.java b/src/main/java/com/ebremer/beakgraph/core/BGDatasetGraph.java index 46e9bc3a..ad4d6b8d 100644 --- a/src/main/java/com/ebremer/beakgraph/core/BGDatasetGraph.java +++ b/src/main/java/com/ebremer/beakgraph/core/BGDatasetGraph.java @@ -1,8 +1,10 @@ package com.ebremer.beakgraph.core; import com.ebremer.beakgraph.hdf5.jena.BindingNodeId; +import com.ebremer.beakgraph.hdf5.jena.OpExecutorBG; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; import org.apache.commons.collections4.iterators.IteratorChain; @@ -16,7 +18,11 @@ import org.apache.jena.sparql.core.DatasetGraphBase; import org.apache.jena.sparql.core.Quad; import org.apache.jena.sparql.core.Var; +import org.apache.jena.sparql.engine.main.QC; +import org.apache.jena.sparql.pfunction.PropertyFunctionRegistry; +import org.apache.jena.sparql.util.Context; import org.apache.jena.util.iterator.WrappedIterator; +import org.apache.jena.vocabulary.RDFS; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,11 +31,43 @@ * @author erich */ public class BGDatasetGraph extends DatasetGraphBase { - private static final Logger logger = LoggerFactory.getLogger(BGDatasetGraph.class); + private static final Logger logger = LoggerFactory.getLogger(BGDatasetGraph.class); private final BeakGraph bg; - + // Per-dataset execution wiring (the TDB pattern): the engine merges this context + // over the global ARQ context when a query runs against this dataset, so BG's + // OpExecutor and property-function scoping apply here and ONLY here - never to + // other datasets in the JVM. + private final Context context = Context.create(); + + /** + * The standard property-function registry minus rdfs:member. BG stores use + * rdfs:member as a plain stored predicate; Jena's container-membership property + * function would rewrite those patterns into rdf:_1/rdf:_2... lookups and answer + * nothing. Scoped here per dataset - the global registry is left untouched. + */ + private static final class BGPropertyFunctions { + static final PropertyFunctionRegistry INSTANCE = build(); + private static PropertyFunctionRegistry build() { + PropertyFunctionRegistry global = PropertyFunctionRegistry.get(); + PropertyFunctionRegistry reg = new PropertyFunctionRegistry(); + global.keys().forEachRemaining(uri -> { + if (!RDFS.member.getURI().equals(uri)) { + reg.put(uri, global.get(uri)); + } + }); + return reg; + } + } + public BGDatasetGraph(BeakGraph g) { this.bg = g; + QC.setFactory(context, OpExecutorBG.opExecFactoryBG); + PropertyFunctionRegistry.set(context, BGPropertyFunctions.INSTANCE); + } + + @Override + public Context getContext() { + return context; } @Override @@ -75,6 +113,12 @@ public Iterator listGraphNodes() { @Override public boolean containsGraph(Node graphNode) { + // The union and default graphs are synthetic names that never appear in + // the stored graphs list, but ARQ gates GRAPH execution on this + // method - they must answer true here (the TDB convention). + if (Quad.isUnionGraph(graphNode) || Quad.isDefaultGraph(graphNode)) { + return true; + } return bg.getReader().containsGraph(graphNode); } @@ -93,9 +137,23 @@ public Iterator find(Node g, Node s, Node p, Node o) { @Override public Iterator findNG(Node g, Node s, Node p, Node o) { - // Same logic as find, but specifically for Named Graphs. - // Since HDF5Reader includes all graphs in listGraphNodes, logic is identical. - return find(g, s, p, o); + // findNG matches NAMED graphs only - unlike find(ANY,...), the default + // graph's quads are excluded. + if (Quad.isUnionGraph(g)) { + return findInSpecificGraph(g, s, p, o); // read() handles the union semantics + } + if (g == null || Node.ANY.equals(g)) { + List> iterators = new ArrayList<>(); + Iterator graphs = listGraphNodes(); + while (graphs.hasNext()) { + iterators.add(findInSpecificGraph(graphs.next(), s, p, o)); + } + return new IteratorChain<>(iterators); + } + if (Quad.isDefaultGraph(g)) { + return Collections.emptyIterator(); + } + return findInSpecificGraph(g, s, p, o); } private Iterator findInSpecificGraph(Node g, Node s, Node p, Node o) { diff --git a/src/main/java/com/ebremer/beakgraph/core/BeakGraph.java b/src/main/java/com/ebremer/beakgraph/core/BeakGraph.java index ee079526..713e98fa 100644 --- a/src/main/java/com/ebremer/beakgraph/core/BeakGraph.java +++ b/src/main/java/com/ebremer/beakgraph/core/BeakGraph.java @@ -1,8 +1,6 @@ package com.ebremer.beakgraph.core; import com.ebremer.beakgraph.hdf5.jena.BGReader; -import com.ebremer.beakgraph.hdf5.jena.OpExecutorBG; -import com.ebremer.beakgraph.hdf5.jena.QueryEngineBeak; import com.ebremer.beakgraph.hdf5.jena.StageGeneratorDirectorBG; import com.ebremer.beakgraph.turbo.Spatial; import java.io.IOException; @@ -17,7 +15,6 @@ import org.apache.jena.shared.AddDeniedException; import org.apache.jena.shared.DeleteDeniedException; import org.apache.jena.sparql.core.Quad; -import org.apache.jena.sparql.engine.main.QC; import org.apache.jena.sparql.engine.main.StageBuilder; import org.apache.jena.sparql.engine.main.StageGenerator; import org.apache.jena.sparql.engine.optimizer.reorder.ReorderLib; @@ -37,6 +34,10 @@ public class BeakGraph extends GraphBase implements AutoCloseable { private static volatile boolean initialized = false ; private final Node namedgraph; private final BGReader reader; + // Whether this instance owns (and on close() must close) the reader. Named-graph + // views handed out by BGDatasetGraph.getGraph share the dataset's reader; closing + // such a view must not shut the storage under every other graph of the dataset. + private final boolean ownsReader; private static final Logger logger = LoggerFactory.getLogger(BeakGraph.class); private final URI uri; // Lazily-computed triple count for this graph. -1 = not yet computed; the graph @@ -60,6 +61,7 @@ public BeakGraph(BGReader reader, URI uri, URI base) throws IOException { this.uri = uri; this.reader = reader; this.namedgraph = Quad.defaultGraphIRI; + this.ownsReader = true; } public BeakGraph(BGReader reader) throws IOException { @@ -76,6 +78,7 @@ public BeakGraph(Node namedgraph, BGReader reader) throws IOException { this.uri = reader.getURI(); this.reader = reader; this.namedgraph = namedgraph; + this.ownsReader = false; // a view over a reader owned by the dataset } private static void init() { @@ -87,8 +90,12 @@ private static void init() { return ; } initialized = true ; - QC.setFactory(ARQ.getContext(), OpExecutorBG.opExecFactoryBG); - QueryEngineBeak.register(); + // The OpExecutor factory is wired per-dataset (BGDatasetGraph's own + // context), NOT into the global ARQ context: a global factory would + // change query execution for every other dataset in the JVM. Only the + // stage-generator director is global - the standard Jena pattern - + // because it dispatches on the active graph's type and delegates + // everything that is not a BeakGraph. wireIntoExecution() ; } } @@ -99,6 +106,9 @@ public BGReader getReader() { @Override public void close() { + if (!ownsReader) { + return; // closing a named-graph view must not close the shared reader + } try { reader.close(); } catch (Exception ex) { diff --git a/src/main/java/com/ebremer/beakgraph/core/fuseki/BGSparqlService.java b/src/main/java/com/ebremer/beakgraph/core/fuseki/BGSparqlService.java index 47e0cbf3..4dc2af51 100644 --- a/src/main/java/com/ebremer/beakgraph/core/fuseki/BGSparqlService.java +++ b/src/main/java/com/ebremer/beakgraph/core/fuseki/BGSparqlService.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.util.concurrent.TimeUnit; import org.apache.jena.query.Dataset; import org.apache.jena.query.Query; import org.apache.jena.query.QueryExecution; @@ -29,6 +30,20 @@ */ public final class BGSparqlService { + /** Maximum accepted SPARQL request body. Real queries are tiny; an unbounded + * readAllBytes lets a single request allocate arbitrary heap. */ + static final int MAX_QUERY_BODY_BYTES = 1 << 20; // 1 MiB + + /** Hard wall-clock limit per query so one pathological query cannot pin the server. */ + private static final long QUERY_TIMEOUT_SECONDS = 30; + + /** Thrown when a POST body exceeds {@link #MAX_QUERY_BODY_BYTES}; callers map it to HTTP 413. */ + public static final class QueryBodyTooLargeException extends IOException { + QueryBodyTooLargeException(String message) { + super(message); + } + } + private BGSparqlService() { } @@ -43,12 +58,21 @@ public static String extractQuery(HttpServletRequest req) throws IOException { return req.getParameter("query"); } try (InputStream in = req.getInputStream()) { - return new String(in.readAllBytes(), StandardCharsets.UTF_8); + return readBody(in, MAX_QUERY_BODY_BYTES); } } return null; } + /** Read at most {@code max} bytes as UTF-8; reject anything larger. */ + static String readBody(InputStream in, int max) throws IOException { + byte[] body = in.readNBytes(max + 1); + if (body.length > max) { + throw new QueryBodyTooLargeException("SPARQL query body exceeds " + max + " bytes"); + } + return new String(body, StandardCharsets.UTF_8); + } + /** * Execute {@code queryStr} against {@code ds} and serialize the result, * resolving relative IRIs against {@code baseURI} (the URL/URI the data is @@ -65,7 +89,8 @@ public static void execute(Dataset ds, String queryStr, String baseURI, Query execQuery = resolver.isActive() ? QueryTransformOps.transform(query, resolver.absoluteToStorage()) : query; - try (QueryExecution qexec = QueryExecution.dataset(ds).query(execQuery).build()) { + try (QueryExecution qexec = QueryExecution.dataset(ds).query(execQuery) + .timeout(QUERY_TIMEOUT_SECONDS, TimeUnit.SECONDS).build()) { if (execQuery.isSelectType()) { ResultSet rs = resolver.resolve(qexec.execSelect()); if (accept.contains("json")) { diff --git a/src/main/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServlet.java b/src/main/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServlet.java index 756f3adf..03860d7d 100644 --- a/src/main/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServlet.java +++ b/src/main/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServlet.java @@ -66,7 +66,13 @@ private boolean isSparqlRequest(HttpServletRequest req) { return "GET".equals(method) && req.getParameter("query") != null; } private void handleSparqlQuery(HttpServletRequest req, HttpServletResponse resp, Path h5File) throws IOException { - String queryStr = BGSparqlService.extractQuery(req); + String queryStr; + try { + queryStr = BGSparqlService.extractQuery(req); + } catch (BGSparqlService.QueryBodyTooLargeException e) { + resp.sendError(413, e.getMessage()); + return; + } if (queryStr == null || queryStr.isBlank()) { resp.sendError(400, "No SPARQL query provided"); return; @@ -163,6 +169,45 @@ private static String writeJson(JsonObject obj) { return sw.toString(); } + /** + * Minimal HTML escaping for text and attribute contexts. Request paths and + * on-disk filenames are attacker-influenced and end up in the container + * listing - unescaped they are a stored-XSS sink. + */ + static String escapeHtml(String s) { + StringBuilder sb = new StringBuilder(s.length()); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + switch (c) { + case '&' -> sb.append("&"); + case '<' -> sb.append("<"); + case '>' -> sb.append(">"); + case '"' -> sb.append("""); + case '\'' -> sb.append("'"); + default -> sb.append(c); + } + } + return sb.toString(); + } + + /** Percent-encode a path for use in an href (keeps '/', encodes spaces, quotes, etc.). */ + static String encodeHref(String path) { + try { + return new java.net.URI(null, null, path, null).toASCIIString(); + } catch (java.net.URISyntaxException e) { + return java.net.URLEncoder.encode(path, StandardCharsets.UTF_8); + } + } + + /** + * Whether a statement object may be sent to clients. The metadata model links + * every resource to its on-disk location via {@code owl:sameAs }; + * those server-local URIs must never leave the server. + */ + static boolean exposableToClient(RDFNode obj) { + return !(obj.isURIResource() && obj.asResource().getURI().startsWith("file:")); + } + /** * Resolve a request path against the storage root, rejecting anything that escapes it via "..", * an absolute path, etc. Returns null when {@code root} is null or the path would leave the root. @@ -189,6 +234,8 @@ static Path resolveWithin(Path root, String reqPath) { } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + // Stop browsers from MIME-sniffing served content into something executable. + resp.setHeader("X-Content-Type-Options", "nosniff"); String reqPath = req.getRequestURI(); if (reqPath.startsWith("/")) reqPath = reqPath.substring(1); if (reqPath.endsWith("/")) reqPath = reqPath.substring(0, reqPath.length()-1); @@ -205,7 +252,9 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IO if (reqPath.equals("description")) { resp.setContentType("application/ld+json"); resp.setHeader("Link", "<" + BASE + "description>; rel=\"storageDescription\""); - resp.setHeader("Link", "<" + getLinksetURI(BASE + "description") + ">; rel=\"linkset\"; type=\"application/linkset+json\""); + // addHeader, not setHeader: a second setHeader replaces the first Link + // header, which silently dropped the storageDescription link. + resp.addHeader("Link", "<" + getLinksetURI(BASE + "description") + ">; rel=\"linkset\"; type=\"application/linkset+json\""); resp.setHeader("Vary", "Accept"); resp.getWriter().write(descriptionJson(BASE)); return; @@ -240,10 +289,13 @@ && isHDF5(h5Candidate) && isSparqlRequest(req)) { boolean wantJson = (accept.contains("ld+json") || accept.contains("json")) || forceJsonLd; if (isContainer && wantHtml) { resp.setContentType("text/html; charset=utf-8"); + // The request path and item names come from the URL / the filesystem; + // escape them for HTML and percent-encode hrefs (stored-XSS sink). + String safePath = escapeHtml(reqPath); try (PrintWriter out = resp.getWriter()) { - out.println("LWS Storage – /" + (reqPath.isEmpty() ? "" : reqPath) + ""); + out.println("LWS Storage – /" + safePath + ""); out.println(""); - out.println("

Linked Web Storage: /" + (reqPath.isEmpty() ? "" : reqPath) + "

"); + out.println("

Linked Web Storage: /" + safePath + "

"); out.println("

Storage Description | "); out.println("Turtle | JSON-LD | "); out.println("SPARQL Endpoint


"); @@ -256,7 +308,8 @@ && isHDF5(h5Candidate) && isSparqlRequest(req)) { String name = item.getURI().substring(HTTP_ROOT.length()); if (name.isEmpty()) name = "(root)"; String link = name.startsWith("/") ? name : "/" + name; - out.printf("
  • %s
  • %n", link, name); + out.printf("
  • %s
  • %n", + escapeHtml(encodeHref(link)), escapeHtml(name)); } out.println(""); } @@ -269,6 +322,7 @@ && isHDF5(h5Candidate) && isSparqlRequest(req)) { Resource httpR = out.createResource(BASE + (reqPath.isEmpty() ? "" : reqPath)); r.listProperties().forEachRemaining(s -> { RDFNode obj = s.getObject(); + if (!exposableToClient(obj)) return; // never leak file:/// server paths if (obj.isResource() && obj.asResource().getURI() != null && obj.asResource().getURI().startsWith(HTTP_ROOT)) { String newURI = BASE + obj.asResource().getURI().substring(HTTP_ROOT.length()); httpR.addProperty(s.getPredicate(), out.createResource(newURI)); @@ -295,7 +349,11 @@ && isHDF5(h5Candidate) && isSparqlRequest(req)) { int startIdx = (int) start; List paged = items.subList(startIdx, Math.min(startIdx+size, total)); Resource pageR = out.createResource(BASE + (reqPath.isEmpty() ? "" : reqPath) + (reqPath.isEmpty() ? "" : "/") + "?page=" + page); - r.listProperties().forEachRemaining(s -> { if (!s.getPredicate().equals(LWS_ITEMS)) pageR.addProperty(s.getPredicate(), s.getObject()); }); + r.listProperties().forEachRemaining(s -> { + if (!s.getPredicate().equals(LWS_ITEMS) && exposableToClient(s.getObject())) { + pageR.addProperty(s.getPredicate(), s.getObject()); + } + }); pageR.addProperty(RDF.type, LWS.ContainerPage); pageR.addProperty(ResourceFactory.createProperty("https://www.w3.org/ns/activitystreams#first"), BASE + (reqPath.isEmpty() ? "" : reqPath) + "?page=1"); int pages = (total + size - 1) / size; @@ -307,6 +365,7 @@ && isHDF5(h5Candidate) && isSparqlRequest(req)) { pageR.addProperty(LWS_ITEMS, out.createResource(itHttp)); it.listProperties().forEachRemaining(st -> { RDFNode obj = st.getObject(); + if (!exposableToClient(obj)) return; // never leak file:/// server paths if (obj.isResource() && obj.asResource().getURI() != null && obj.asResource().getURI().startsWith(HTTP_ROOT)) { String newURI = BASE + obj.asResource().getURI().substring(HTTP_ROOT.length()); out.getResource(itHttp).addProperty(st.getPredicate(), out.createResource(newURI)); @@ -320,6 +379,7 @@ && isHDF5(h5Candidate) && isSparqlRequest(req)) { String itHttp = BASE + it.getURI().substring(HTTP_ROOT.length()); it.listProperties().forEachRemaining(st -> { RDFNode obj = st.getObject(); + if (!exposableToClient(obj)) return; // never leak file:/// server paths if (obj.isResource() && obj.asResource().getURI() != null && obj.asResource().getURI().startsWith(HTTP_ROOT)) { String newURI = BASE + obj.asResource().getURI().substring(HTTP_ROOT.length()); out.getResource(itHttp).addProperty(st.getPredicate(), out.createResource(newURI)); @@ -351,11 +411,16 @@ && isHDF5(h5Candidate) && isSparqlRequest(req)) { if (media == null) media = "application/octet-stream"; } resp.setContentType(media); + // Stored bytes are served as a download: with nosniff above, this keeps an + // HTML/SVG file someone placed under the root from rendering in this origin. + String filename = localFile.getFileName().toString().replace("\"", ""); + resp.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); resp.setContentLengthLong(Files.size(localFile)); Files.copy(localFile, resp.getOutputStream()); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + resp.setHeader("X-Content-Type-Options", "nosniff"); logger.info("LWS {} {} ct={} query-param={} bodyLen={}", req.getMethod(), req.getRequestURI(), req.getContentType(), req.getParameter("query") != null, req.getContentLengthLong()); diff --git a/src/main/java/com/ebremer/beakgraph/core/fuseki/SPARQLEndPoint.java b/src/main/java/com/ebremer/beakgraph/core/fuseki/SPARQLEndPoint.java index 6bb1aff8..a83c6919 100644 --- a/src/main/java/com/ebremer/beakgraph/core/fuseki/SPARQLEndPoint.java +++ b/src/main/java/com/ebremer/beakgraph/core/fuseki/SPARQLEndPoint.java @@ -235,7 +235,13 @@ private static class HDF5SparqlServlet extends HttpServlet { } private void handle(HttpServletRequest req, HttpServletResponse resp) throws IOException { - String queryStr = BGSparqlService.extractQuery(req); + String queryStr; + try { + queryStr = BGSparqlService.extractQuery(req); + } catch (BGSparqlService.QueryBodyTooLargeException e) { + resp.sendError(413, e.getMessage()); + return; + } if (queryStr == null || queryStr.isBlank()) { resp.sendError(400, "No SPARQL query provided"); return; diff --git a/src/main/java/com/ebremer/beakgraph/features/MajorMinor.java b/src/main/java/com/ebremer/beakgraph/features/MajorMinor.java index cf613845..8ffd2b7e 100644 --- a/src/main/java/com/ebremer/beakgraph/features/MajorMinor.java +++ b/src/main/java/com/ebremer/beakgraph/features/MajorMinor.java @@ -2,6 +2,7 @@ import com.ebremer.ns.GEO; import com.ebremer.ns.HAL; import java.util.ArrayList; +import java.util.Locale; import org.apache.jena.datatypes.RDFDatatype; import org.apache.jena.graph.Node; import org.apache.jena.graph.NodeFactory; @@ -58,11 +59,12 @@ public static void add(Resource f, String wkt) { double ay = majorlen / 2 * v0.get(1); double bx = minorlen / 2 * v1.get(0); double by = minorlen / 2 * v1.get(1); - // WKT strings - String centroidWKT = String.format("POINT(%.4f %.4f)", mx, my); - String majorWKT = String.format("LINESTRING(%.4f %.4f, %.4f %.4f)", + // WKT strings: Locale.ROOT so the decimal separator is always '.', + // not the default locale's (e.g. ',' on de_DE, which is invalid WKT). + String centroidWKT = String.format(Locale.ROOT, "POINT(%.4f %.4f)", mx, my); + String majorWKT = String.format(Locale.ROOT, "LINESTRING(%.4f %.4f, %.4f %.4f)", mx - ax, my - ay, mx + ax, my + ay); - String minorWKT = String.format("LINESTRING(%.4f %.4f, %.4f %.4f)", + String minorWKT = String.format(Locale.ROOT, "LINESTRING(%.4f %.4f, %.4f %.4f)", mx - bx, my - by, mx + bx, my + by); // add to the feature f.addProperty(HAL.centroid, f.getModel().createTypedLiteral(centroidWKT, GEO.wktLiteral.getURI())); @@ -107,9 +109,10 @@ public static void add(ArrayList quads, Node f, String wkt) { double ay = majorlen / 2 * v0.get(1); double bx = minorlen / 2 * v1.get(0); double by = minorlen / 2 * v1.get(1); - String centroidWKT = String.format("POINT(%.4f %.4f)", mx, my); - String majorWKT = String.format("LINESTRING(%.4f %.4f, %.4f %.4f)", mx - ax, my - ay, mx + ax, my + ay); - String minorWKT = String.format("LINESTRING(%.4f %.4f, %.4f %.4f)", mx - bx, my - by, mx + bx, my + by); + // Locale.ROOT: see the WKT note in the Resource overload above. + String centroidWKT = String.format(Locale.ROOT, "POINT(%.4f %.4f)", mx, my); + String majorWKT = String.format(Locale.ROOT, "LINESTRING(%.4f %.4f, %.4f %.4f)", mx - ax, my - ay, mx + ax, my + ay); + String minorWKT = String.format(Locale.ROOT, "LINESTRING(%.4f %.4f, %.4f %.4f)", mx - bx, my - by, mx + bx, my + by); Node graph = Quad.defaultGraphIRI; RDFDatatype wktDT = NodeFactory.getType(GEO.wktLiteral.getURI()); quads.add(Quad.create(graph, f, HAL.centroid.asNode(), NodeFactory.createLiteralDT(centroidWKT, wktDT))); diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorMaster.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorMaster.java index ab204038..a42a7de4 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorMaster.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorMaster.java @@ -72,7 +72,11 @@ public BGIteratorMaster(HDF5Reader reader, PositionalDictionaryReader dict, Bind Iterator sub = new BGIteratorMaster(reader, dict, bnid, new Quad(n, quad.getSubject(), quad.getPredicate(), quad.getObject()), filter, nodeTable); NodeId gId = new NodeId(dict.getGraphs().locate(n), NodeType.GRAPH); - its.add(Iter.map(sub, b -> { b.put(gVar, gId); return b; })); + // The graph variable may also occur inside the pattern (e.g. + // GRAPH ?g { ?g ?p ?o }); a row whose pattern binding conflicts + // with this graph must be dropped, not silently kept. + its.add(Iter.removeNulls(Iter.map(sub, + b -> b.putCompatible(gVar, gId, nodeTable) ? b : null))); }); } chain = new IteratorChain<>(its); diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorOS.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorOS.java index 0bc7ce65..c19483ec 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorOS.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorOS.java @@ -181,28 +181,24 @@ private String flipOp(String op) { private void applyBound(Var var, String op, Node value, PositionalDictionaryReader dict, Quad quad) { if (!var.equals(quad.getSubject())) return; - long rawResult = dict.getSubjects().search(value); - long id = (rawResult >= 0) ? rawResult : -rawResult - 1; - boolean found = (rawResult >= 0); + // Snap the bound to the edges of the whole value-equal cluster (degenerates + // to the plain insertion point for non-literal constants); see ValueCluster. + long[] c = ValueCluster.of(dict.getSubjects(), value); switch (op) { case ">" -> { - long target = found ? id + 1 : id; + long target = c[1] + 1; if (Long.compareUnsigned(target, minSubId) > 0) minSubId = target; } case ">=" -> { - if (Long.compareUnsigned(id, minSubId) > 0) minSubId = id; + if (Long.compareUnsigned(c[0], minSubId) > 0) minSubId = c[0]; } case "<" -> { - if (id <= 1) { maxSubId = 0; minSubId = 1; } else { - long target = id - 1; - if (Long.compareUnsigned(target, maxSubId) < 0) maxSubId = target; - } + long target = c[0] - 1; + if (Long.compareUnsigned(target, maxSubId) < 0) maxSubId = target; } case "<=" -> { - long target = found ? id : id - 1; - if (id <= 1 && !found) { maxSubId = 0; minSubId = 1; } else { - if (Long.compareUnsigned(target, maxSubId) < 0) maxSubId = target; - } + long target = c[1]; + if (Long.compareUnsigned(target, maxSubId) < 0) maxSubId = target; } } } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorPOS.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorPOS.java index 20a4b2fb..2b824020 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorPOS.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorPOS.java @@ -32,11 +32,13 @@ public class BGIteratorPOS implements Iterator { private long maxObjId = Long.MAX_VALUE; private boolean hasNext = false; private PositionalDictionaryReader dict; + private final NodeTable nodeTable; public BGIteratorPOS(PositionalDictionaryReader dict, IndexReader reader, BindingNodeId bnid, Quad quad, ExprList filter, NodeTable nodeTable) { this.parentBinding = bnid; this.queryQuad = quad; this.dict = dict; + this.nodeTable = nodeTable; this.Bp = reader.getBitmapBuffer('P'); this.Sp = reader.getIDBuffer('P'); @@ -91,8 +93,11 @@ public BGIteratorPOS(PositionalDictionaryReader dict, IndexReader reader, Bindin if (rawOStart == -1 || rawOStart > rawOEnd) return; // C. APPLY FILTER: Narrow the Object Range using Binary Search + // upperBound already returns the last index whose value is <= maxObjId + // (inclusive), so it is used as oEnd directly - subtracting 1 dropped the + // boundary object group from FILTER(?o <= X) results. this.oStart = (minObjId <= 0) ? rawOStart : So.lowerBound(rawOStart, rawOEnd, minObjId); - this.oEnd = (maxObjId == Long.MAX_VALUE) ? rawOEnd : So.upperBound(rawOStart, rawOEnd, maxObjId) - 1; + this.oEnd = (maxObjId == Long.MAX_VALUE) ? rawOEnd : So.upperBound(rawOStart, rawOEnd, maxObjId); if (oStart > oEnd || oStart < 0) return; @@ -154,31 +159,26 @@ private String flipOp(String op) { private void applyBound(Var var, String op, Node value, PositionalDictionaryReader dict, Quad quad) { if (!var.equals(quad.getObject())) return; - long rawResult = dict.getObjects().search(value); - long id = (rawResult >= 0) ? rawResult : -rawResult - 1; - boolean found = (rawResult >= 0); - + // Snap the bound to the edges of the whole value-equal cluster: value-equal + // but term-distinct literals ("5"^^xsd:int vs "5"^^xsd:integer) occupy + // adjacent distinct ids, and the raw exact-term insertion point can land + // inside that cluster, silently dropping qualifying boundary rows. + long[] c = ValueCluster.of(dict.getObjects(), value); switch (op) { case ">" -> { - long target = found ? id + 1 : id; + long target = c[1] + 1; if (Long.compareUnsigned(target, minObjId) > 0) minObjId = target; } case ">=" -> { - if (Long.compareUnsigned(id, minObjId) > 0) minObjId = id; + if (Long.compareUnsigned(c[0], minObjId) > 0) minObjId = c[0]; } case "<" -> { - if (id == 0) { maxObjId = 0; minObjId = 1; } - else { - long target = id - 1; - if (Long.compareUnsigned(target, maxObjId) < 0) maxObjId = target; - } + long target = c[0] - 1; + if (Long.compareUnsigned(target, maxObjId) < 0) maxObjId = target; } case "<=" -> { - long target = found ? id : id - 1; - if (id == 0 && !found) { maxObjId = 0; minObjId = 1; } - else { - if (Long.compareUnsigned(target, maxObjId) < 0) maxObjId = target; - } + long target = c[1]; + if (Long.compareUnsigned(target, maxObjId) < 0) maxObjId = target; } } } @@ -190,25 +190,56 @@ private long select1Safe(HDTBitmapDirectory dir, BitPackedUnSignedLongBuffer fal return (dir != null) ? dir.select1(rank) : fallback.select1(rank); } + // Look-ahead: the next deliverable row, or null. Rows whose repeated-variable + // bindings conflict are skipped here, so hasNext() only answers true when + // next() really has a row to return. + private BindingNodeId pending = null; + private boolean primed = false; + + /** + * Builds the next row whose bindings are all compatible. A variable repeated in + * the pattern (e.g. ?x

    ?x as subject and object) must bind to the same term + * in both positions; putCompatible reports the conflict and the row is skipped + * rather than emitted with the first value. + */ + private BindingNodeId computeNext() { + while (hasNext) { + BindingNodeId result = new BindingNodeId(this.parentBinding); + long currentObjectId = So.get(curOIndex); + long currentSubjectId = Ss.get(curSIndex); + boolean ok = true; + if (queryQuad.getObject().isVariable()) { + ok = result.putCompatible(Var.alloc(queryQuad.getObject()), new NodeId(currentObjectId, NodeType.OBJECT), nodeTable); + } + if (ok && queryQuad.getSubject().isVariable()) { + ok = result.putCompatible(Var.alloc(queryQuad.getSubject()), new NodeId(currentSubjectId, NodeType.SUBJECT), nodeTable); + } + curSIndex++; + advanceToNextValid(); + if (ok) return result; + } + return null; + } + + private void prime() { + if (!primed) { + primed = true; + pending = computeNext(); + } + } + @Override public boolean hasNext() { - return hasNext; + prime(); + return pending != null; } @Override public BindingNodeId next() { - if (!hasNext) throw new NoSuchElementException(); - BindingNodeId result = new BindingNodeId(this.parentBinding); - long currentObjectId = So.get(curOIndex); - long currentSubjectId = Ss.get(curSIndex); - if (queryQuad.getObject().isVariable()) { - result.put(Var.alloc(queryQuad.getObject()), new NodeId(currentObjectId, NodeType.OBJECT)); - } - if (queryQuad.getSubject().isVariable()) { - result.put(Var.alloc(queryQuad.getSubject()), new NodeId(currentSubjectId, NodeType.SUBJECT)); - } - curSIndex++; - advanceToNextValid(); - return result; + prime(); + if (pending == null) throw new NoSuchElementException(); + BindingNodeId r = pending; + pending = computeNext(); + return r; } } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorSO.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorSO.java index a9bab5ea..1bc1c990 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorSO.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorSO.java @@ -95,24 +95,32 @@ public BGIteratorSO(PositionalDictionaryReader dict, IndexReader reader, Binding if (rawOStart == -1 || rawOStart > rawOEnd) return; // D. Apply Specific Object Bound or Range Filters - long specificObjId = resolveNode(quad.getObject(), dict.getObjects(), bnid); + // Distinguish "object is an unbound variable" from "object is a concrete + // term (or bound variable)": resolveNode returns -1 for both an unbound + // variable and a term missing from the dictionary, and a missing term must + // yield no match - not a full range scan (which fabricated phantom rows, + // e.g. ASK with a non-existent object answered true). + Node oNode = quad.getObject(); + boolean oUnbound = oNode.isVariable() && (bnid == null || !bnid.containsKey(Var.alloc(oNode))); + + if (oUnbound) { + // Case: Object is a variable, apply min/max ID range filters + this.i = (minObjId <= 0) ? rawOStart : So.lowerBound(rawOStart, rawOEnd, minObjId); + this.j = (maxObjId == Long.MAX_VALUE) ? rawOEnd : So.upperBound(rawOStart, rawOEnd, maxObjId); - if (specificObjId > 0) { + if (this.i != -1 && this.i <= this.j) { + this.hasNext = true; + } + } else { // Case: Object is bound (e.g., G, S, P, O are all known, just checking existence) + long specificObjId = resolveNode(oNode, dict.getObjects(), bnid); + if (specificObjId < 1) return; // concrete term absent from this store -> no match long foundIdx = So.binarySearch(rawOStart, rawOEnd, specificObjId); if (foundIdx >= 0) { this.i = foundIdx; this.j = foundIdx; this.hasNext = true; } - } else { - // Case: Object is a variable, apply min/max ID range filters - this.i = (minObjId <= 0) ? rawOStart : So.lowerBound(rawOStart, rawOEnd, minObjId); - this.j = (maxObjId == Long.MAX_VALUE) ? rawOEnd : So.upperBound(rawOStart, rawOEnd, maxObjId); - - if (this.i != -1 && this.i <= this.j) { - this.hasNext = true; - } } } @@ -157,30 +165,26 @@ private String flipOp(String op) { private void applyBound(Var var, String op, Node value, PositionalDictionaryReader dict, Quad quad) { if (!var.equals(quad.getObject())) return; - long rawResult = dict.getObjects().search(value); - long id = (rawResult >= 0) ? rawResult : -rawResult - 1; - boolean found = (rawResult >= 0); + // Snap the bound to the edges of the whole value-equal cluster: value-equal + // but term-distinct literals ("5"^^xsd:int vs "5"^^xsd:integer) occupy + // adjacent distinct ids, and the raw exact-term insertion point can land + // inside that cluster, silently dropping qualifying boundary rows. + long[] c = ValueCluster.of(dict.getObjects(), value); switch (op) { case ">" -> { - long target = found ? id + 1 : id; + long target = c[1] + 1; if (Long.compareUnsigned(target, minObjId) > 0) minObjId = target; } case ">=" -> { - if (Long.compareUnsigned(id, minObjId) > 0) minObjId = id; + if (Long.compareUnsigned(c[0], minObjId) > 0) minObjId = c[0]; } case "<" -> { - if (id == 0) { maxObjId = 0; minObjId = 1; } - else { - long target = id - 1; - if (Long.compareUnsigned(target, maxObjId) < 0) maxObjId = target; - } + long target = c[0] - 1; + if (Long.compareUnsigned(target, maxObjId) < 0) maxObjId = target; } case "<=" -> { - long target = found ? id : id - 1; - if (id == 0 && !found) { maxObjId = 0; minObjId = 1; } - else { - if (Long.compareUnsigned(target, maxObjId) < 0) maxObjId = target; - } + long target = c[1]; + if (Long.compareUnsigned(target, maxObjId) < 0) maxObjId = target; } } } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorSPO_All.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorSPO_All.java index 257bb5a6..73287347 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorSPO_All.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorSPO_All.java @@ -31,15 +31,20 @@ public class BGIteratorSPO_All implements Iterator { private long resS, resP, resO; private final long gi; private boolean hasNext = false; - private long minSubId = 0, maxSubId = Long.MAX_VALUE; + // minSubId starts at 1, not 0: real subject ids are 1-based, and the writer pads + // empty graph blocks with (S=0,P=0,O=0) dummy rows. Starting at 0 leaked those + // padding rows as phantom bindings (and extract(0) throws on materialization). + private long minSubId = 1, maxSubId = Long.MAX_VALUE; private long minPid = 0, maxPid = Long.MAX_VALUE; private long minObjId = 0, maxObjId = Long.MAX_VALUE; private final PositionalDictionaryReader dict; + private final NodeTable nodeTable; public BGIteratorSPO_All(PositionalDictionaryReader dict, IndexReader reader, BindingNodeId bnid, Quad quad, ExprList filter, NodeTable nodeTable) { this.parentBinding = bnid; this.queryQuad = quad; this.dict = dict; + this.nodeTable = nodeTable; this.Bs = reader.getBitmapBuffer('S'); this.Ss = reader.getIDBuffer('S'); this.Bp = reader.getBitmapBuffer('P'); @@ -261,22 +266,22 @@ private String flipOp(String op) { } private void applyBound(Var var, String op, Node value, PositionalDictionaryReader dict, Quad quad) { - int type; + int type; if (var.equals(quad.getSubject())) type = 1; else if (var.equals(quad.getPredicate())) type = 2; else if (var.equals(quad.getObject())) type = 3; else return; - long rawResult; - rawResult = switch (type) { - case 1 -> dict.getSubjects().search(value); - case 2 -> dict.getPredicates().search(value); - default -> dict.getObjects().search(value); + // Snap the bound to the edges of the whole value-equal cluster: value-equal + // but term-distinct literals ("5"^^xsd:int vs "5"^^xsd:integer) occupy + // adjacent distinct ids, and the raw exact-term insertion point can land + // inside that cluster, silently dropping qualifying boundary rows. + long[] c = switch (type) { + case 1 -> ValueCluster.of(dict.getSubjects(), value); + case 2 -> ValueCluster.of(dict.getPredicates(), value); + default -> ValueCluster.of(dict.getObjects(), value); }; - long id = (rawResult >= 0) ? rawResult : -rawResult - 1; - boolean found = (rawResult >= 0); - long min, max; switch (type) { case 1 -> { min = minSubId; max = maxSubId; } @@ -285,10 +290,10 @@ private void applyBound(Var var, String op, Node value, PositionalDictionaryRead } switch (op) { - case ">" -> min = Math.max(min, found ? id + 1 : id); - case ">=" -> min = Math.max(min, id); - case "<" -> max = Math.min(max, id - 1); - case "<=" -> max = Math.min(max, id); + case ">" -> min = Math.max(min, c[1] + 1); + case ">=" -> min = Math.max(min, c[0]); + case "<" -> max = Math.min(max, c[0] - 1); + case "<=" -> max = Math.min(max, c[1]); } switch (type) { @@ -298,28 +303,60 @@ private void applyBound(Var var, String op, Node value, PositionalDictionaryRead } } + // Look-ahead: the next deliverable row, or null. Rows whose repeated-variable + // bindings conflict are skipped here, so hasNext() only answers true when + // next() really has a row to return. + private BindingNodeId pending = null; + private boolean primed = false; + + /** + * Builds the next row whose bindings are all compatible. A variable repeated in + * the pattern (?s ?p ?s, ?x ?x ?o, ...) must bind to the same term in every + * position it occupies; putCompatible reports a conflict and the row is skipped + * rather than emitted with the first value. (Subject/object vs predicate repeats + * span two id-spaces - putCompatible resolves those through the node table.) + */ + private BindingNodeId computeNext() { + while (hasNext) { + BindingNodeId result = new BindingNodeId(parentBinding); + boolean ok = true; + if (queryQuad.getGraph().isVariable()) { + ok = result.putCompatible(Var.alloc(queryQuad.getGraph()), new NodeId(gi, NodeType.GRAPH), nodeTable); + } + if (ok && queryQuad.getSubject().isVariable()) { + ok = result.putCompatible(Var.alloc(queryQuad.getSubject()), new NodeId(resS, NodeType.SUBJECT), nodeTable); + } + if (ok && queryQuad.getPredicate().isVariable()) { + ok = result.putCompatible(Var.alloc(queryQuad.getPredicate()), new NodeId(resP, NodeType.PREDICATE), nodeTable); + } + if (ok && queryQuad.getObject().isVariable()) { + ok = result.putCompatible(Var.alloc(queryQuad.getObject()), new NodeId(resO, NodeType.OBJECT), nodeTable); + } + advance(); + if (ok) return result; + } + return null; + } + + private void prime() { + if (!primed) { + primed = true; + pending = computeNext(); + } + } + @Override public boolean hasNext() { - return hasNext; + prime(); + return pending != null; } @Override public BindingNodeId next() { - if (!hasNext) throw new NoSuchElementException(); - BindingNodeId result = new BindingNodeId(parentBinding); - if (queryQuad.getGraph().isVariable()) { - result.put(Var.alloc(queryQuad.getGraph()), new NodeId(gi, NodeType.GRAPH)); - } - if (queryQuad.getSubject().isVariable()) { - result.put(Var.alloc(queryQuad.getSubject()), new NodeId(resS, NodeType.SUBJECT)); - } - if (queryQuad.getPredicate().isVariable()) { - result.put(Var.alloc(queryQuad.getPredicate()), new NodeId(resP, NodeType.PREDICATE)); - } - if (queryQuad.getObject().isVariable()) { - result.put(Var.alloc(queryQuad.getObject()), new NodeId(resO, NodeType.OBJECT)); - } - advance(); - return result; + prime(); + if (pending == null) throw new NoSuchElementException(); + BindingNodeId r = pending; + pending = computeNext(); + return r; } } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGReader.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGReader.java index 79d80895..ef5a4c07 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGReader.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGReader.java @@ -25,4 +25,10 @@ public interface BGReader extends AutoCloseable { public Stream streamQuads(); public boolean containsGraph(Node graphNode); public URI getURI(); + + /** + * Whether this reader is still usable. Pool validation uses this to evict + * instances whose underlying storage has been closed. + */ + public default boolean isOpen() { return true; } } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingBG.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingBG.java index 018fd732..472e7c2c 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingBG.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingBG.java @@ -6,6 +6,7 @@ import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.engine.binding.Binding; import org.apache.jena.sparql.engine.binding.BindingBase; +import org.apache.jena.sparql.engine.binding.BindingBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,8 +64,35 @@ protected boolean contains1(Var var) { return idBinding.containsKey(var); } + /** + * Detaching must materialize the NodeId-backed bindings into plain nodes: + * Jena detaches bindings it copies or spills beyond the execution that + * created them, and a detached binding must not keep resolving lazily + * against this graph's reader (which may be closed by then). Both detach + * paths are overridden - the default "original parent" path would return + * {@code this}, still reader-backed. + */ @Override protected Binding detachWithNewParent(Binding newParent) { - throw new UnsupportedOperationException("Not supported yet."); + return materialize(newParent); + } + + @Override + protected Binding detachWithOriginalParent() { + return materialize(idBinding.getParentBinding()); + } + + private Binding materialize(Binding newParent) { + BindingBuilder builder = Binding.builder(newParent); + Iterator it = idBinding.iterator(); + while (it.hasNext()) { + Var v = it.next(); + if (builder.contains(v)) continue; + Node n = get1(v); + if (n != null) { + builder.add(v, n); + } + } + return builder.build(); } } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingNodeId.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingNodeId.java index 0425a868..ebd74bbf 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingNodeId.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingNodeId.java @@ -1,10 +1,12 @@ package com.ebremer.beakgraph.hdf5.jena; +import com.ebremer.beakgraph.core.NodeTable; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.apache.jena.atlas.lib.Map2; +import org.apache.jena.graph.Node; import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.engine.binding.Binding; @@ -44,6 +46,14 @@ public BindingNodeId() { public Binding getParentBinding() { return parentBinding; } + /** + * Binds {@code v} to {@code n}; when {@code v} is already bound, the existing + * binding is kept. Only safe when the caller guarantees the re-put carries the + * same term (e.g. re-binding a value derived from this binding's own entry). + * Row-building code that can see a variable repeated within one triple pattern + * must use {@link #putCompatible} and reject the row on a conflict instead - + * silently keeping the first value made {@code ?s ?p ?s} match every triple. + */ @Override public void put(Var v, NodeId n) { if ( v == null || n == null ) @@ -54,6 +64,48 @@ public void put(Var v, NodeId n) { } } + /** + * Binds {@code v} to {@code n}, or reports a conflict: returns true when the + * binding was added or the existing binding denotes the same term, false when + * {@code v} is already bound to a different term (the caller must reject the + * row). {@code nodeTable} is needed only to compare ids across the predicate / + * entity id-spaces; pass null when that cross-space case cannot occur. + */ + public boolean putCompatible(Var v, NodeId n, NodeTable nodeTable) { + if ( v == null || n == null ) + throw new IllegalArgumentException("("+v+","+n+")"); + NodeId existing = get(v); + if (existing == null) { + super.put(v, n); + return true; + } + return sameTerm(existing, n, nodeTable); + } + + /** + * Whether two NodeIds denote the same RDF term. GRAPH, SUBJECT and OBJECT ids + * share the universal entity id-space (object literals are offset beyond the + * entity range), so within it equal ids mean equal terms. PREDICATE ids live in + * an isolated dictionary, so a predicate/entity pair is resolved to Nodes and + * compared as terms. + */ + private static boolean sameTerm(NodeId a, NodeId b, NodeTable nodeTable) { + if (a.equals(b)) return true; + NodeType ta = a.getType(); + NodeType tb = b.getType(); + if (ta == NodeType.SPECIAL || tb == NodeType.SPECIAL) return false; // a.equals(b) already said no + boolean aPred = (ta == NodeType.PREDICATE); + boolean bPred = (tb == NodeType.PREDICATE); + if (aPred == bPred) { + // Same id-space (both predicate, or both universal entity/object space). + return a.getId() == b.getId(); + } + if (nodeTable == null) return false; + Node na = nodeTable.getNodeForNodeId(a); + Node nb = nodeTable.getNodeForNodeId(b); + return na != null && na.equals(nb); + } + public void putAll(BindingNodeId other) { Iterator vIter = other.iterator(); for (; vIter.hasNext() ; ) { diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/OpExecutorBG.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/OpExecutorBG.java index 0b438295..83860759 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/OpExecutorBG.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/OpExecutorBG.java @@ -1,31 +1,21 @@ package com.ebremer.beakgraph.hdf5.jena; import com.ebremer.beakgraph.core.BeakGraph; -import com.ebremer.beakgraph.hdf5.readers.PositionalDictionaryReader; import org.apache.jena.graph.Graph; -import org.apache.jena.graph.Node; -import org.apache.jena.graph.Triple; import org.apache.jena.sparql.ARQInternalErrorException; import org.apache.jena.sparql.algebra.Op; import org.apache.jena.sparql.algebra.op.*; import org.apache.jena.sparql.core.BasicPattern; -import org.apache.jena.sparql.core.Quad; import org.apache.jena.sparql.core.Substitute; -import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.engine.ExecutionContext; import org.apache.jena.sparql.engine.QueryIterator; -import org.apache.jena.sparql.engine.binding.Binding; -import org.apache.jena.sparql.engine.binding.BindingFactory; import org.apache.jena.sparql.engine.iterator.QueryIterPeek; -import org.apache.jena.sparql.engine.iterator.QueryIterPlainWrapper; import org.apache.jena.sparql.engine.main.OpExecutor; import org.apache.jena.sparql.engine.main.OpExecutorFactory; import org.apache.jena.sparql.engine.main.QC; import org.apache.jena.sparql.engine.optimizer.reorder.ReorderProc; import org.apache.jena.sparql.engine.optimizer.reorder.ReorderTransformation; import org.apache.jena.sparql.expr.ExprList; -import java.util.Iterator; -import java.util.stream.Stream; import org.apache.jena.sparql.algebra.optimize.TransformFilterPlacement; /** @@ -44,104 +34,20 @@ public OpExecutor create(ExecutionContext execCxt) { private final boolean isForBeakGraph; - private enum Position { SUBJECT, PREDICATE, OBJECT, GRAPH, NONE } - public OpExecutorBG(ExecutionContext execCtx) { super(execCtx); isForBeakGraph = execCtx.getActiveGraph() instanceof BeakGraph; } - /** - * OPTIMIZATION: Overriding execute for OpDistinct to catch schema-listing queries. - * Logic: If we are asking for DISTINCT elements across a triple or quad pattern, - * we skip the index scan and stream directly from the specific Dictionary position. - * @param opDistinct - * @param input - * @return - */ - @Override - protected QueryIterator execute(OpDistinct opDistinct, QueryIterator input) { - if (!isForBeakGraph) { - return super.execute(opDistinct, input); - } - - Op subOp = opDistinct.getSubOp(); - - // Pattern: Distinct -> Project(?v) -> BGP(?s ?p ?o) - if (subOp instanceof OpProject project && project.getVars().size() == 1) { - Var targetVar = project.getVars().get(0); - Op innerOp = project.getSubOp(); - - Position pos = getFullScanPosition(innerOp, targetVar); - - if (pos != Position.NONE) { - // Determine if we can resolve the BeakGraph - Graph active = execCxt.getActiveGraph(); - if (active instanceof BeakGraph bg) { - PositionalDictionaryReader dict = (PositionalDictionaryReader) bg.getReader().getDictionary(); - - Stream stream = switch (pos) { - case GRAPH -> dict.streamGraphs(); - case PREDICATE -> dict.streamPredicates(); - case SUBJECT -> dict.streamSubjects(); - case OBJECT -> dict.streamObjects(); - default -> null; - }; - - if (stream != null) { - return new QueryIterDictionary(targetVar, stream, execCxt); - } - } - } - } - - return super.execute(opDistinct, input); - } - - /** - * Recursively checks if the pattern is a simple "?s ?p ?o" scan that encompasses - * the entire space, and identifies the target variable's position. - */ - private Position getFullScanPosition(Op op, Var targetVar) { - // Unwrap OpFilter (if any exists around the pattern) - if (op instanceof OpFilter filter) { - return getFullScanPosition(filter.getSubOp(), targetVar); - } - // Case 1: Triple { ?s ?p ?o } - if (op instanceof OpBGP bgp && bgp.getPattern().size() == 1) { - Triple t = bgp.getPattern().get(0); - if (t.getSubject().isVariable() && t.getPredicate().isVariable() && t.getObject().isVariable()) { - if (t.getPredicate().equals(targetVar)) return Position.PREDICATE; - if (t.getSubject().equals(targetVar)) return Position.SUBJECT; - if (t.getObject().equals(targetVar)) return Position.OBJECT; - } - } - // Case 2: Quad { GRAPH ?g { ?s ?p ?o } } - if (op instanceof OpQuadPattern qp && qp.getPattern().size() == 1) { - Quad q = qp.getPattern().get(0); - if (q.getGraph().isVariable() && q.getSubject().isVariable() && - q.getPredicate().isVariable() && q.getObject().isVariable()) { - if (q.getGraph().equals(targetVar)) return Position.GRAPH; - if (q.getPredicate().equals(targetVar)) return Position.PREDICATE; - if (q.getSubject().equals(targetVar)) return Position.SUBJECT; - if (q.getObject().equals(targetVar)) return Position.OBJECT; - } - } - // Case 3: OpGraph ?g { ?s ?p ?o } - if (op instanceof OpGraph opGraph && opGraph.getNode().isVariable()) { - if (opGraph.getNode().equals(targetVar)) { - if (opGraph.getSubOp() instanceof OpBGP bgp && bgp.getPattern().size() == 1) { - Triple t = bgp.getPattern().get(0); - if (t.getSubject().isVariable() && t.getPredicate().isVariable() && t.getObject().isVariable()) { - return Position.GRAPH; - } - } - } else { - return getFullScanPosition(opGraph.getSubOp(), targetVar); - } - } - return Position.NONE; - } + // NOTE: an earlier version intercepted OpDistinct ("SELECT DISTINCT ?p { ?s ?p ?o }") + // and streamed the dictionary's per-position id lists instead of executing the + // query. That was removed as unsound: the columnar lists are file-global (they + // span every named graph, including the always-present VoID metadata graph, so + // default-graph queries over-reported terms), any FILTER wrapped around the + // pattern was silently dropped, DISTINCT ?g included the default graph, and the + // incoming iterator (join semantics) was discarded. A correct fast path would + // need per-graph id lists in the format plus filter/join guards; until then + // DISTINCT executes normally. @Override protected QueryIterator execute(OpPropFunc opPropFunc, QueryIterator input) { @@ -222,13 +128,13 @@ public OpExecutor create(ExecutionContext execCxt) { private static class OpExecutorPlainBeak extends OpExecutor { final ExprList filter; - + public OpExecutorPlainBeak(ExecutionContext execCxt) { super(execCxt); ExecutionContextBG ecr = (ExecutionContextBG) execCxt; filter = ecr.getFilter(); } - + @Override public QueryIterator execute(OpBGP opBGP, QueryIterator input) { Graph g = execCxt.getActiveGraph(); @@ -239,22 +145,4 @@ public QueryIterator execute(OpBGP opBGP, QueryIterator input) { return super.execute(opBGP, input) ; } } - - /** - * Inner class to wrap the Dictionary Stream as a Jena QueryIterator. - */ - private static class QueryIterDictionary extends QueryIterPlainWrapper { - public QueryIterDictionary(Var var, Stream nodes, ExecutionContext execCxt) { - super(convert(var, nodes.iterator()), execCxt); - } - - private static Iterator convert(Var var, Iterator nodes) { - return new Iterator<>() { - @Override public boolean hasNext() { return nodes.hasNext(); } - @Override public Binding next() { - return BindingFactory.binding(var, nodes.next()); - } - }; - } - } } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/QueryIterDictionary.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/QueryIterDictionary.java deleted file mode 100644 index 6d37c3ec..00000000 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/QueryIterDictionary.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.ebremer.beakgraph.hdf5.jena; - -import org.apache.jena.graph.Node; -import org.apache.jena.sparql.core.Var; -import org.apache.jena.sparql.engine.binding.Binding; -import org.apache.jena.sparql.engine.binding.BindingFactory; -import org.apache.jena.sparql.engine.iterator.QueryIterPlainWrapper; -import java.util.Iterator; -import java.util.stream.Stream; -import org.apache.jena.sparql.engine.ExecutionContext; - -public class QueryIterDictionary extends QueryIterPlainWrapper { - public QueryIterDictionary(Var var, Stream nodes, ExecutionContext execCxt) { - super(convert(var, nodes.iterator()), execCxt); - } - - private static Iterator convert(Var var, Iterator nodes) { - return new Iterator<>() { - @Override public boolean hasNext() { return nodes.hasNext(); } - @Override public Binding next() { - return BindingFactory.binding(var, nodes.next()); - } - }; - } -} \ No newline at end of file diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/SpatialIndexIterator.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/SpatialIndexIterator.java index 8fc02b77..eb20c56b 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/SpatialIndexIterator.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/SpatialIndexIterator.java @@ -34,13 +34,15 @@ public SpatialIndexIterator(Iterator input, BeakGraph bGraph, Var NodeTable currentTable = bGraph.getReader().getNodeTable(); this.outputIterator = Iter.flatMap(input, parent -> { Iterator lazyCandidateNodes = new LazyCandidateIterator(ranges, bGraph, context.scale); - - return Iter.map(lazyCandidateNodes, node -> { + + // The target variable may already be bound in the parent row; a + // candidate that conflicts with that binding must be dropped, not + // silently overridden by the parent value. + return Iter.removeNulls(Iter.map(lazyCandidateNodes, node -> { NodeId nodeId = currentTable.getNodeIdForNode(node); BindingNodeId child = new BindingNodeId(parent); - child.put(targetVar, nodeId); - return child; - }); + return child.putCompatible(targetVar, nodeId, currentTable) ? child : null; + })); }); } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/readers/HDF5Reader.java b/src/main/java/com/ebremer/beakgraph/hdf5/readers/HDF5Reader.java index 181b1c1a..cb37fd11 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/readers/HDF5Reader.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/readers/HDF5Reader.java @@ -16,11 +16,17 @@ import java.io.File; import java.net.URI; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Stream; +import org.apache.commons.collections4.iterators.IteratorChain; +import org.apache.jena.atlas.iterator.Iter; import org.apache.jena.graph.Node; import org.apache.jena.graph.Triple; import org.apache.jena.sparql.core.Quad; @@ -41,7 +47,10 @@ public class HDF5Reader implements BGReader { private final Map indexCache = new ConcurrentHashMap<>(); private final URI uri; private final long formatVersion; - + // Closed readers must be detectable (pool validation) and close() must be + // idempotent (a poisoned pooled instance is closed again on destroy). + private volatile boolean open = true; + static { JenaSystem.init(); Spatial.init(); @@ -53,20 +62,30 @@ public HDF5Reader(Path src) { public HDF5Reader(File src) { this.hdf = new HdfFile(src.toPath()); - this.hdt = (Group) hdf.getChild(Params.BG); - this.formatVersion = readFormatVersion(hdt); - if (formatVersion > Params.FORMAT_VERSION) { - hdf.close(); - throw new IllegalStateException( - "BeakGraph HDF5 format version " + formatVersion + " in " + src - + " is newer than this build supports (max " + Params.FORMAT_VERSION - + "). Upgrade BeakGraph."); + try { + this.hdt = (Group) hdf.getChild(Params.BG); + if (hdt == null) { + throw new IllegalStateException( + "Not a BeakGraph file (no '" + Params.BG + "' group): " + src); + } + this.formatVersion = readFormatVersion(hdt); + if (formatVersion > Params.FORMAT_VERSION) { + throw new IllegalStateException( + "BeakGraph HDF5 format version " + formatVersion + " in " + src + + " is newer than this build supports (max " + Params.FORMAT_VERSION + + "). Upgrade BeakGraph."); + } + Group dictionary = (Group) hdt.getChild(Params.DICTIONARY); + this.dict = new PositionalDictionaryReader(dictionary); + this.defaultGraph = Quad.defaultGraphIRI; + nodeTable = new SimpleNodeTable(dict); + this.uri = src.toURI(); + } catch (RuntimeException | Error e) { + // Close the mapped file before propagating: a leaked HdfFile pins the + // file handle (and on Windows, the file lock) with no way to release it. + try { hdf.close(); } catch (Exception ignore) {} + throw e; } - Group dictionary = (Group) hdt.getChild(Params.DICTIONARY); - this.dict = new PositionalDictionaryReader(dictionary); - this.defaultGraph = Quad.defaultGraphIRI; - nodeTable = new SimpleNodeTable(dict); - this.uri = src.toURI(); } /** @@ -116,6 +135,9 @@ public Iterator read(Node ng, BindingNodeId bnid, Triple triple, || boundToMissing(triple.getObject(), bnid)) { return Collections.emptyIterator(); } + if (Quad.isUnionGraph(ng)) { + return readUnion(bnid, triple, filter, nodeTable); + } boolean isDefault = ng.equals(Quad.defaultGraphNodeGenerated) || ng.equals(Quad.defaultGraphIRI); Node g = isDefault ? this.defaultGraph : ng; Node s = substitute(triple.getSubject(), bnid, nodeTable); @@ -125,6 +147,34 @@ public Iterator read(Node ng, BindingNodeId bnid, Triple triple, return new BGIteratorMaster(this, dict, bnid, quadPattern, filter, nodeTable); } + /** + * {@code urn:x-arq:unionGraph}: the union of all named graphs, with the + * SPARQL-mandated set semantics - a triple present in several named graphs + * appears once. Rows are deduplicated on the values of the pattern's + * variables (the concrete positions are identical across graphs by + * construction). + */ + private Iterator readUnion(BindingNodeId bnid, Triple triple, ExprList filter, NodeTable nodeTable) { + List vars = new ArrayList<>(3); + for (Node n : new Node[]{triple.getSubject(), triple.getPredicate(), triple.getObject()}) { + if (n.isVariable()) vars.add(Var.alloc(n)); + } + List> its = new ArrayList<>(); + dict.streamGraphs() + .filter(n -> !(n.equals(Quad.defaultGraphIRI) || n.equals(Quad.defaultGraphNodeGenerated))) + .forEach(gn -> its.add(read(gn, bnid, triple, filter, nodeTable))); + Iterator chain = new IteratorChain<>(its); + Set> seen = new HashSet<>(); + return Iter.filter(chain, b -> { + List key = new ArrayList<>(vars.size()); + for (Var v : vars) { + NodeId id = b.get(v); + key.add(id == null ? Long.MIN_VALUE : id.getId()); + } + return seen.add(key); + }); + } + /** True when {@code n} is a variable already bound to a node that does not exist here. */ private static boolean boundToMissing(Node n, BindingNodeId bnid) { if (bnid != null && n.isVariable()) { @@ -191,8 +241,18 @@ public ExtendedIterator graphBaseFind(Node graph, Triple tp) { @Override public NodeTable getNodeTable() { return nodeTable; } - @Override public void close() { hdf.close(); } - @Override public GSPODictionary getDictionary() { return dict; } + + @Override + public void close() { + if (!open) return; + open = false; + hdf.close(); + } + + @Override + public boolean isOpen() { return open; } + + @Override public GSPODictionary getDictionary() { return dict; } @Override public int getNumberOfTriples(String ng) { return 0; } @Override public Stream streamQuads() { return Stream.empty(); } @@ -203,7 +263,11 @@ public Iterator listGraphNodes() { @Override public boolean containsGraph(Node graphNode) { - return (dict.getGraphs().locate(graphNode) != -1); + // Graphs share the universal entity dictionary, so locate() alone matches + // every subject/object entity too; membership in the columnar graphs list + // is what makes an entity an actual graph. + long id = dict.getGraphs().locate(graphNode); + return id != -1 && dict.isGraph(id); } } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/readers/PositionalDictionaryReader.java b/src/main/java/com/ebremer/beakgraph/hdf5/readers/PositionalDictionaryReader.java index ebf9d94c..246c6324 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/readers/PositionalDictionaryReader.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/readers/PositionalDictionaryReader.java @@ -124,6 +124,15 @@ public long getNumberOfNodes() { }; } + /** + * True when {@code entityId} appears in the columnar list of actual graphs. + * Graphs share the universal entity ID space, so a bare dictionary lookup + * cannot distinguish a graph from any other entity - this can. + */ + public boolean isGraph(long entityId) { + return graphs != null && graphs.stream().anyMatch(id -> id == entityId); + } + @Override public Stream streamGraphs() { if (graphs == null || entities == null) { diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/writers/FCDWriter.java b/src/main/java/com/ebremer/beakgraph/hdf5/writers/FCDWriter.java index c59f0c90..f0eed63f 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/writers/FCDWriter.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/writers/FCDWriter.java @@ -87,10 +87,14 @@ public void add(String item) throws IOException { private int commonPrefixLength(String s1, String s2) { int minLength = Math.min(s1.length(), s2.length()); - for (int i = 0; i < minLength; i++) { - if (s1.charAt(i) != s2.charAt(i)) return i; - } - return minLength; + int i = 0; + while (i < minLength && s1.charAt(i) == s2.charAt(i)) i++; + // Never split a UTF-16 surrogate pair: the suffix is encoded to UTF-8 on its + // own, and a suffix starting with an unpaired low surrogate encodes as '?', + // silently corrupting the stored string. Back off so the whole pair stays + // in the suffix. + if (i > 0 && Character.isHighSurrogate(s1.charAt(i - 1))) i--; + return i; } @Override public long getNumEntries() { return numEntries; } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/writers/MultiTypeDictionaryWriter.java b/src/main/java/com/ebremer/beakgraph/hdf5/writers/MultiTypeDictionaryWriter.java index 1604cbc7..768b4950 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/writers/MultiTypeDictionaryWriter.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/writers/MultiTypeDictionaryWriter.java @@ -83,6 +83,9 @@ protected MultiTypeDictionaryWriter(Builder builder) throws FileNotFoundExceptio // bit pattern survives the unsigned mask round-trip in BitPackedUnSignedLongBuffer. int intWidth = (stats.minInteger < 0) ? 32 : (1 + MinBits(stats.maxInteger)); int longWidth = (stats.minLong < 0) ? 64 : (1 + MinBits(stats.maxLong)); + // The bit-packed buffer supports widths 1..57 and 64 only, and this width is + // value-derived: a legal xsd:long in [2^56, 2^62) lands in 58..63. Round up. + if (longWidth > 57) longWidth = 64; this.integers = (!et.contains(Types.INTEGER) || (stats.numInteger == 0)) ? null : new BitPackedUnSignedLongBuffer(Path.of("integers"), null, 0, intWidth); this.longs = (!et.contains(Types.LONG) || (stats.numLong == 0)) ? null : new BitPackedUnSignedLongBuffer(Path.of("longs"), null, 0, longWidth); diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/writers/PositionalDictionaryWriterBuilder.java b/src/main/java/com/ebremer/beakgraph/hdf5/writers/PositionalDictionaryWriterBuilder.java index df4907fc..6e99fc3b 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/writers/PositionalDictionaryWriterBuilder.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/writers/PositionalDictionaryWriterBuilder.java @@ -3,6 +3,7 @@ import com.ebremer.beakgraph.Params; import com.ebremer.beakgraph.core.fuseki.BGVoIDSD; import com.ebremer.beakgraph.core.lib.Stats; +import com.ebremer.beakgraph.utils.ImageTools; import com.ebremer.halcyon.hilbert.HilbertSpace; import com.ebremer.halcyon.hilbert.PolygonScaler; import com.ebremer.halcyon.hilbert.WKTDatatype; @@ -217,7 +218,10 @@ private boolean isDegeneratePolygon(String wkt) { private ArrayList addSpatial(Quad quad) { final ArrayList qqq = new ArrayList<>(); - String wkt = quad.getObject().getLiteralLexicalForm(); + // The GeoSPARQL-standard " WKT" form must be indexed too: strip the + // prefix once here so the degeneracy check and the scaler both see plain WKT + // (previously such geometries failed the parse and were silently dropped). + String wkt = ImageTools.stripCrs(quad.getObject().getLiteralLexicalForm()); if (isDegeneratePolygon(wkt)) { IO.println("Degenerate Polygon : "+wkt); return qqq; @@ -351,7 +355,42 @@ private Node relativizeNode(Node n) { u.equals(REL_BASE) ? "" : u.substring(REL_BASE_PREFIX.length())); } - private void ProcessQuad(Quad quad) { + /** + * Numeric literal canonicalization policy: xsd:int / xsd:long / xsd:float / + * xsd:double objects are stored by VALUE and the reader regenerates the + * canonical lexical form, so two lexical variants of one value ("01" vs + * "1"^^xsd:int) would become two term-distinct dictionary entries that both + * extract to the same canonical term - duplicate "equal" entries that break + * the strict ordering the dictionary binary search relies on, leaving some + * triples unreachable by term lookup. Rewriting the object to its canonical + * term at ingest collapses the variants onto one entry and keeps locate() + * and extract() symmetric. (The value-typed storage never preserved the + * non-canonical lexical form anyway.) + */ + private Quad canonicalizeNumericObject(Quad quad) { + Node o = quad.getObject(); + if (!o.isLiteral()) return quad; + String dt = o.getLiteralDatatypeURI(); + try { + Node canonical = null; + if (XSD.xint.getURI().equals(dt)) { + if (o.getLiteralValue() instanceof Number n) canonical = NodeFactory.createLiteralByValue(n.intValue()); + } else if (XSD.xlong.getURI().equals(dt)) { + if (o.getLiteralValue() instanceof Number n) canonical = NodeFactory.createLiteralByValue(n.longValue()); + } else if (XSD.xfloat.getURI().equals(dt)) { + if (o.getLiteralValue() instanceof Number n) canonical = NodeFactory.createLiteralByValue(n.floatValue()); + } else if (XSD.xdouble.getURI().equals(dt)) { + if (o.getLiteralValue() instanceof Number n) canonical = NodeFactory.createLiteralByValue(n.doubleValue()); + } + if (canonical == null || canonical.equals(o)) return quad; + return new Quad(quad.getGraph(), quad.getSubject(), quad.getPredicate(), canonical); + } catch (RuntimeException e) { + // Malformed numeric literal: leave it untouched; downstream handling decides. + return quad; + } + } + + private void ProcessQuad(Quad quad) { Node g = quad.getGraph(); Node s = quad.getSubject(); Node p = quad.getPredicate(); @@ -477,6 +516,7 @@ public PositionalDictionaryWriter build() throws IOException { : quad) .map(this::relativize) .map(this::AlignBnodes) + .map(this::canonicalizeNumericObject) .forEach(quad -> { quadcount.incrementAndGet(); if (quadcount.get() % 100_000 == 0) { @@ -508,8 +548,9 @@ public PositionalDictionaryWriter build() throws IOException { throw new IOException("Spatial processing failed for " + src, ex.getCause()); } extraQuads.forEach(q -> { - quadslist.add(q); - ProcessQuad(q); + Quad canon = canonicalizeNumericObject(q); + quadslist.add(canon); + ProcessQuad(canon); }); } Model xxx = xvoid.getModel(); @@ -524,7 +565,7 @@ public PositionalDictionaryWriter build() throws IOException { xxx.setNsPrefix("exif", "http://www.w3.org/2003/12/exif/ns#"); xvoid.getModel().listStatements().forEach(s->{ Triple ff = s.asTriple(); - Quad qqq = Quad.create(BGVOID, ff); + Quad qqq = canonicalizeNumericObject(Quad.create(BGVOID, ff)); ProcessQuad(qqq); quadslist.add(qqq); }); diff --git a/src/main/java/com/ebremer/beakgraph/pool/BeakGraphPoolFactory.java b/src/main/java/com/ebremer/beakgraph/pool/BeakGraphPoolFactory.java index 17ce3b35..05e73473 100644 --- a/src/main/java/com/ebremer/beakgraph/pool/BeakGraphPoolFactory.java +++ b/src/main/java/com/ebremer/beakgraph/pool/BeakGraphPoolFactory.java @@ -32,6 +32,16 @@ public PooledObject wrap(BeakGraph value) { return new DefaultPooledObject<>(value); } + /** + * Without this override, BaseKeyedPooledObjectFactory.validateObject always + * returns true and setTestOnBorrow(true) validates nothing - an instance whose + * reader was closed (poisoned) would be re-issued and fail on first use. + */ + @Override + public boolean validateObject(URI uri, PooledObject p) { + return p.getObject().getReader().isOpen(); + } + @Override public void destroyObject(URI uri, PooledObject p, DestroyMode mode) throws Exception { logger.trace("destroyObject {}", uri); diff --git a/src/main/java/com/ebremer/beakgraph/turbo/Intersects.java b/src/main/java/com/ebremer/beakgraph/turbo/Intersects.java index d72dba8b..a5a3c59b 100644 --- a/src/main/java/com/ebremer/beakgraph/turbo/Intersects.java +++ b/src/main/java/com/ebremer/beakgraph/turbo/Intersects.java @@ -4,6 +4,7 @@ import java.util.List; import org.apache.jena.atlas.lib.Lib; import org.apache.jena.query.QueryBuildException; +import org.apache.jena.sparql.expr.ExprEvalException; import org.apache.jena.sparql.expr.ExprList; import org.apache.jena.sparql.expr.NodeValue; import org.apache.jena.sparql.function.FunctionBase; @@ -11,10 +12,16 @@ import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.WKTReader; +/** + * JTS-backed implementation of geof:sfIntersects. This is the fallback for any + * sfIntersects the Hilbert index rewrite does not capture, so it must answer + * honestly - the previous version returned TRUE unconditionally, which made + * every uncaptured spatial filter match everything. + */ public class Intersects extends FunctionBase { private static final String WKT_DATATYPE_URI = GEO.wktLiteral.getURI(); - + @Override public void checkBuild(String uri, ExprList args) { if (( args.size() < 2 ) || ( args.size() > 3 )) { @@ -22,38 +29,35 @@ public void checkBuild(String uri, ExprList args) { } } - /* @Override - public NodeValue exec(NodeValue v1, NodeValue v2) { - return NodeValue.TRUE; - /* + public NodeValue exec(List args) { + NodeValue v1 = args.get(0); + NodeValue v2 = args.get(1); if (v1 == null || v2 == null) { - throw new ExprEvalException("sfWithin: Arguments cannot be null"); + throw new ExprEvalException("sfIntersects: arguments cannot be null"); } if (!isValidGeometryLiteral(v1) || !isValidGeometryLiteral(v2)) { - throw new ExprEvalException("sfWithin: Arguments must be geo:wktLiteral"); + throw new ExprEvalException("sfIntersects: arguments must be geo:wktLiteral"); } - String geo1 = v1.asNode().getLiteralLexicalForm(); - String geo2 = v2.asNode().getLiteralLexicalForm(); try { - boolean isWithin = performSpatialCheck(geo1, geo2); - return isWithin ? NodeValue.TRUE : NodeValue.FALSE; + boolean intersects = performSpatialCheck( + v1.asNode().getLiteralLexicalForm(), + v2.asNode().getLiteralLexicalForm()); + return intersects ? NodeValue.TRUE : NodeValue.FALSE; } catch (Exception e) { - throw new ExprEvalException("sfWithin: Calculation failed: " + e.getMessage()); + throw new ExprEvalException("sfIntersects: " + e.getMessage()); } - }*/ + } private boolean isValidGeometryLiteral(NodeValue nv) { - if (!nv.isLiteral()) return false; + if (!nv.isLiteral()) return false; String dtURI = nv.asNode().getLiteralDatatypeURI(); return WKT_DATATYPE_URI.equals(dtURI); } /** - * Uses JTS to check if wkt1 is within wkt2. - * @param wkt1 The subject geometry (e.g., the point) - * @param wkt2 The containing geometry (e.g., the polygon) - * @return true if wkt1 is within wkt2 + * Uses JTS to check whether the two WKT geometries intersect (share at + * least one point) - the geof:sfIntersects relation. * @throws ParseException if WKT is invalid */ private boolean performSpatialCheck(String wkt1, String wkt2) throws ParseException { @@ -71,7 +75,7 @@ private boolean performSpatialCheck(String wkt1, String wkt2) throws ParseExcept throw new ParseException("Encountered invalid geometry topology."); } - return g1.within(g2); + return g1.intersects(g2); } /** @@ -90,9 +94,4 @@ private String extractWkt(String geoSparqlLiteral) { } return trimmed; } - - @Override - public NodeValue exec(List args) { - return NodeValue.TRUE; - } } \ No newline at end of file diff --git a/src/main/java/com/ebremer/beakgraph/turbo/Spatial.java b/src/main/java/com/ebremer/beakgraph/turbo/Spatial.java index 8a58540a..5cd160fc 100644 --- a/src/main/java/com/ebremer/beakgraph/turbo/Spatial.java +++ b/src/main/java/com/ebremer/beakgraph/turbo/Spatial.java @@ -2,8 +2,6 @@ import com.ebremer.ns.GEOF; import org.apache.jena.sparql.function.FunctionRegistry; -import org.apache.jena.sparql.pfunction.PropertyFunctionRegistry; -import org.apache.jena.vocabulary.RDFS; /** @@ -14,10 +12,16 @@ public final class Spatial { private static Spatial spatial = null; private Spatial() { - PropertyFunctionRegistry.get().remove(RDFS.member.getURI()); - FunctionRegistry.get().put(GEOF.sfIntersects.getURI(), Intersects.class); + // Register a real, JTS-backed geof:sfIntersects so spatial filters that the + // index rewrite does not capture still evaluate correctly. Registering a + // filter function globally is the normal Jena pattern; what this must NOT + // do is alter standard semantics for other datasets - the old code here + // remove()d the rdfs:member property function JVM-wide. BG datasets opt out + // of rdfs:member rewriting via their own dataset-scoped registry instead + // (see BGDatasetGraph). + FunctionRegistry.get().put(GEOF.sfIntersects.getURI(), Intersects.class); } - + public synchronized static void init() { if (spatial == null) { spatial = new Spatial(); diff --git a/src/main/java/com/ebremer/beakgraph/utils/ImageTools.java b/src/main/java/com/ebremer/beakgraph/utils/ImageTools.java index 7befb113..b99b4b5b 100644 --- a/src/main/java/com/ebremer/beakgraph/utils/ImageTools.java +++ b/src/main/java/com/ebremer/beakgraph/utils/ImageTools.java @@ -95,11 +95,28 @@ public static Polygon wktToPolygon(String wkt) throws Exception { return polygons.isEmpty() ? null : polygons.get(0); } + /** + * Strips the optional CRS/SRS URI prefix from a GeoSPARQL wktLiteral + * ("<http://...crs...> POLYGON(...)" -> "POLYGON(...)"). The GeoSPARQL + * spec allows the prefix and data in the wild commonly carries it; JTS's + * WKTReader does not accept it. + */ + public static String stripCrs(String wkt) { + String trimmed = wkt.trim(); + if (trimmed.startsWith("<")) { + int end = trimmed.indexOf('>'); + if (end != -1) { + return trimmed.substring(end + 1).trim(); + } + } + return trimmed; + } + public static List wktToPolygons(String wkt) throws Exception { if (wkt == null || wkt.trim().isEmpty()) { return Collections.emptyList(); } - Geometry geom = WKT_READER.read(wkt.trim()); + Geometry geom = WKT_READER.read(stripCrs(wkt)); if (geom.isEmpty()) { return Collections.emptyList(); } diff --git a/src/main/java/com/ebremer/halcyon/hilbert/HilbertSpace.java b/src/main/java/com/ebremer/halcyon/hilbert/HilbertSpace.java index 228e1dd6..e6401c68 100644 --- a/src/main/java/com/ebremer/halcyon/hilbert/HilbertSpace.java +++ b/src/main/java/com/ebremer/halcyon/hilbert/HilbertSpace.java @@ -1,5 +1,6 @@ package com.ebremer.halcyon.hilbert; +import com.ebremer.beakgraph.utils.ImageTools; import com.ebremer.halcyon.geometry.Point; import com.ebremer.halcyon.geometry.Box; import com.ebremer.halcyon.geometry.Vector2D; @@ -48,7 +49,10 @@ public final class HilbertSpace { private HilbertSpace() {} public static boolean inRange(ArrayList rr, Point p, Byte neighbor) { - switch (neighbor) { + // Return the membership result - the old switch *statement* computed + // contains(...) and discarded it, so this always answered false and the + // getPolygon boundary walk never advanced. + return switch (neighbor) { case N -> contains(rr,p.x,p.y-1); case NE -> contains(rr,p.x+1,p.y-1); case E -> contains(rr,p.x+1,p.y); @@ -57,12 +61,12 @@ public static boolean inRange(ArrayList rr, Point p, Byte neighbor) { case SW -> contains(rr,p.x-1,p.y+1); case W -> contains(rr,p.x-1,p.y); case NW -> contains(rr,p.x-1,p.y-1); - } - return false; + default -> false; + }; } - + public static boolean inRange(Ranges rr, Point p, Byte neighbor) { - switch (neighbor) { + return switch (neighbor) { case N -> contains(rr,p.x,p.y-1); case NE -> contains(rr,p.x+1,p.y-1); case E -> contains(rr,p.x+1,p.y); @@ -71,8 +75,8 @@ public static boolean inRange(Ranges rr, Point p, Byte neighbor) { case SW -> contains(rr,p.x-1,p.y+1); case W -> contains(rr,p.x-1,p.y); case NW -> contains(rr,p.x-1,p.y-1); - } - return false; + default -> false; + }; } public static Point getPoint(long p) { @@ -659,15 +663,20 @@ public static ArrayList Polygon2Hilbert(Polygon p) { public static org.locationtech.jts.geom.Polygon fromWkt(String wkt) { WKTReader reader = new WKTReader(); Geometry geom; + // GeoSPARQL wktLiterals may carry a " WKT" prefix; JTS does not + // accept it. Failures raise a catchable exception (with the offending + // input), never a bare java.lang.Error. + String clean = ImageTools.stripCrs(wkt); try { - geom = reader.read(wkt); + geom = reader.read(clean); if (!(geom instanceof org.locationtech.jts.geom.Polygon)) { logger.error("WKT is not a Polygon: {}", geom.getGeometryType()); - throw new Error("WKT is not a Polygon: " + geom.getGeometryType()); + throw new IllegalArgumentException("WKT is not a Polygon: " + geom.getGeometryType()); } return (org.locationtech.jts.geom.Polygon) geom; } catch (ParseException ex) { - throw new Error("Parsing Error!"); + throw new IllegalArgumentException("Invalid WKT: " + + (clean.length() > 100 ? clean.substring(0, 100) + "..." : clean), ex); } } diff --git a/src/test/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServletTest.java b/src/test/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServletTest.java index df803986..a0f2d04d 100644 --- a/src/test/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServletTest.java +++ b/src/test/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServletTest.java @@ -71,6 +71,44 @@ void resolveWithinRejectsTraversalAndAbsolutePaths() throws Exception { assertNull(LWSStorageServlet.resolveWithin(null, "anything")); } + @Test + void escapeHtmlNeutralizesMarkupAndAttributeBreakouts() { + assertEquals("<script>alert(1)</script>", + LWSStorageServlet.escapeHtml("")); + assertEquals("a" onmouseover="x", LWSStorageServlet.escapeHtml("a\" onmouseover=\"x")); + assertEquals("a&b'c", LWSStorageServlet.escapeHtml("a&b'c")); + assertEquals("plain-name.h5", LWSStorageServlet.escapeHtml("plain-name.h5")); + } + + @Test + void encodeHrefPercentEncodesUnsafeCharactersButKeepsSlashes() { + assertEquals("/sub/a%20b.h5", LWSStorageServlet.encodeHref("/sub/a b.h5")); + assertEquals("/x%22y", LWSStorageServlet.encodeHref("/x\"y")); + assertEquals("/plain/file.h5", LWSStorageServlet.encodeHref("/plain/file.h5")); + } + + @Test + void fileUrisAreNotExposableToClients() { + org.apache.jena.rdf.model.Model m = org.apache.jena.rdf.model.ModelFactory.createDefaultModel(); + assertFalse(LWSStorageServlet.exposableToClient( + m.createResource("file:///C:/secret/storage/data.h5")), "server paths must be redacted"); + assertTrue(LWSStorageServlet.exposableToClient(m.createResource("https://example.org/r"))); + assertTrue(LWSStorageServlet.exposableToClient(m.createLiteral("file:///looks-like-but-is-a-literal"))); + assertTrue(LWSStorageServlet.exposableToClient(m.createResource())); // bnode + } + + @Test + void sparqlBodyReadIsBounded() throws Exception { + String small = "SELECT * WHERE { ?s ?p ?o }"; + assertEquals(small, BGSparqlService.readBody( + new java.io.ByteArrayInputStream(small.getBytes(java.nio.charset.StandardCharsets.UTF_8)), 1024)); + byte[] huge = new byte[2048]; + java.util.Arrays.fill(huge, (byte) 'x'); + org.junit.jupiter.api.Assertions.assertThrows( + BGSparqlService.QueryBodyTooLargeException.class, + () -> BGSparqlService.readBody(new java.io.ByteArrayInputStream(huge), 1024)); + } + @Test void resolveWithinRejectsSymlinkEscape() throws Exception { Path root = Files.createTempDirectory("lws-sym").toRealPath(); From 8f2110890c5f9dce45ea43f36138bd699f968326 Mon Sep 17 00:00:00 2001 From: Erich Bremer Date: Thu, 11 Jun 2026 12:24:39 -0400 Subject: [PATCH 2/4] add new tests --- .../beakgraph/hdf5/jena/ValueCluster.java | 70 ++++++ .../beakgraph/DistinctCorrectnessTest.java | 116 +++++++++ .../HighSeverityFixesRoundTripTest.java | 228 ++++++++++++++++++ .../beakgraph/HilbertSpaceFixesTest.java | 79 ++++++ .../NumericCanonicalizationTest.java | 130 ++++++++++ .../beakgraph/ReaderLifecycleTest.java | 128 ++++++++++ .../ebremer/beakgraph/RegistryWiringTest.java | 175 ++++++++++++++ .../RepeatedVariablePatternTest.java | 131 ++++++++++ .../beakgraph/SpatialCrsIndexingTest.java | 68 ++++++ .../beakgraph/UnionGraphAndDetachTest.java | 163 +++++++++++++ .../beakgraph/ValueClusterFilterTest.java | 128 ++++++++++ .../features/MajorMinorLocaleTest.java | 51 ++++ 12 files changed, 1467 insertions(+) create mode 100644 src/main/java/com/ebremer/beakgraph/hdf5/jena/ValueCluster.java create mode 100644 src/test/java/com/ebremer/beakgraph/DistinctCorrectnessTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/HighSeverityFixesRoundTripTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/HilbertSpaceFixesTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/NumericCanonicalizationTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/ReaderLifecycleTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/RegistryWiringTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/RepeatedVariablePatternTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/SpatialCrsIndexingTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/UnionGraphAndDetachTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/ValueClusterFilterTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/features/MajorMinorLocaleTest.java diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/ValueCluster.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/ValueCluster.java new file mode 100644 index 00000000..a4392412 --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/ValueCluster.java @@ -0,0 +1,70 @@ +package com.ebremer.beakgraph.hdf5.jena; + +import com.ebremer.beakgraph.core.Dictionary; +import org.apache.jena.graph.Node; +import org.apache.jena.sparql.expr.Expr; +import org.apache.jena.sparql.expr.NodeValue; + +/** + * Locates the contiguous id range of dictionary entries that compare + * value-equal to a filter constant. + *

    + * The dictionaries order literals by value first (NodeValue.compareAlways) and + * break value ties on the exact RDF term, so value-equal but term-distinct + * literals ("5"^^xsd:int, "5"^^xsd:integer, "5.0"^^xsd:double) occupy a run of + * adjacent ids - and an exact-term binary search can land anywhere inside that + * run. Range-filter pushdown (FILTER(?o >= 5)) must therefore snap its bound to + * the edges of the whole cluster: with [lo, hi] from {@link #of}, + *

    + *   >   -> min = hi + 1        >=  -> min = lo
    + *   <   -> max = lo - 1        <=  -> max = hi
    + * 
    + * For a constant with no value-equal entries (including all non-literals) the + * cluster is empty ({@code hi == lo - 1}, both at the insertion point) and the + * formulas reduce exactly to the plain insertion-point bounds. + */ +final class ValueCluster { + + private ValueCluster() {} + + /** + * Returns {@code {lo, hi}}: the inclusive 1-based id range of entries in + * {@code dict} that are value-equal to {@code value}. Empty when {@code hi < lo}. + */ + static long[] of(Dictionary dict, Node value) { + long raw = dict.search(value); + boolean found = raw >= 0; + long pos = found ? raw : (-raw - 1); + long lo = pos; + long hi = found ? pos : pos - 1; + if (!value.isLiteral()) { + // URIs/bnodes are ordered by term, never by value: no cluster to grow. + return new long[]{lo, hi}; + } + long n = dict.getNumberOfNodes(); + while (hi + 1 <= n && valueEqual(extractOrNull(dict, hi + 1), value)) hi++; + while (lo - 1 >= 1 && valueEqual(extractOrNull(dict, lo - 1), value)) lo--; + return new long[]{lo, hi}; + } + + private static Node extractOrNull(Dictionary dict, long id) { + try { + return dict.extract(id); + } catch (RuntimeException e) { + return null; + } + } + + private static boolean valueEqual(Node a, Node b) { + if (a == null || !a.isLiteral()) return false; + try { + // Value-only comparison. compareAlways would be wrong here: it never + // answers "equal" for distinct terms (it breaks value ties on the term), + // which is exactly the distinction this cluster must ignore. Throws for + // non-comparable values (e.g. string vs number) - not value-equal. + return NodeValue.compare(NodeValue.makeNode(a), NodeValue.makeNode(b)) == Expr.CMP_EQUAL; + } catch (RuntimeException e) { + return false; + } + } +} diff --git a/src/test/java/com/ebremer/beakgraph/DistinctCorrectnessTest.java b/src/test/java/com/ebremer/beakgraph/DistinctCorrectnessTest.java new file mode 100644 index 00000000..80143943 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/DistinctCorrectnessTest.java @@ -0,0 +1,116 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.apache.jena.rdf.model.RDFNode; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Regression tests for C2: SELECT DISTINCT over a single all-variable pattern + * previously streamed the file-global dictionary id lists instead of executing + * the query. Those lists span every named graph - including the always-written + * VoID metadata graph - so default-graph queries over-reported terms that have + * no default-graph triple, any FILTER around the pattern was silently dropped, + * and DISTINCT ?g included the default graph. DISTINCT must answer exactly + * what a normal execution answers. + */ +class DistinctCorrectnessTest { + + private static final String TTL = """ + @prefix ex: . + ex:s1 ex:p ex:o1 . + ex:s2 ex:q ex:o2 . + ex:s1 ex:q "lit" . + """; + + private static final String PREFIX = "PREFIX ex: "; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("distinct.ttl").toFile(); + File h5 = dir.resolve("distinct.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder() + .setSource(ttl).setDestination(h5) + .setSpatial(false).setFeatures(false) + .build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + /** URIs as-is; literals as their lexical form. */ + private static Set select(String var, String query) { + Set values = new HashSet<>(); + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + query)).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + RDFNode n = rs.next().get(var); + if (n == null) continue; + values.add(n.isLiteral() ? n.asLiteral().getLexicalForm() : n.asResource().getURI()); + } + } + return values; + } + + @Test + void distinctPredicatesAreDefaultGraphOnly() { + // The VoID metadata graph contributes rdf:type, void:*, sd:* predicates - + // none of which occur in any default-graph triple. + assertEquals(Set.of("http://ex.org/p", "http://ex.org/q"), + select("p", "SELECT DISTINCT ?p WHERE { ?s ?p ?o }")); + } + + @Test + void distinctSubjectsAreDefaultGraphOnly() { + assertEquals(Set.of("http://ex.org/s1", "http://ex.org/s2"), + select("s", "SELECT DISTINCT ?s WHERE { ?s ?p ?o }")); + } + + @Test + void distinctObjectsAreDefaultGraphOnly() { + assertEquals(Set.of("http://ex.org/o1", "http://ex.org/o2", "lit"), + select("o", "SELECT DISTINCT ?o WHERE { ?s ?p ?o }")); + } + + @Test + void distinctRespectsFilters() { + assertEquals(Set.of("http://ex.org/q"), + select("p", "SELECT DISTINCT ?p WHERE { ?s ?p ?o FILTER(?p != ex:p) }")); + assertEquals(Set.of("http://ex.org/s1"), + select("s", "SELECT DISTINCT ?s WHERE { ?s ?p ?o FILTER(?p = ex:p) }")); + } + + @Test + void distinctGraphsExcludeDefaultGraph() { + // SPARQL: GRAPH ?g ranges over named graphs only. + assertEquals(Set.of(Params.VOIDSTRING), + select("g", "SELECT DISTINCT ?g WHERE { GRAPH ?g { ?s ?p ?o } }")); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/HighSeverityFixesRoundTripTest.java b/src/test/java/com/ebremer/beakgraph/HighSeverityFixesRoundTripTest.java new file mode 100644 index 00000000..38065236 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/HighSeverityFixesRoundTripTest.java @@ -0,0 +1,228 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; +import org.apache.jena.graph.NodeFactory; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.apache.jena.rdf.model.Literal; +import org.apache.jena.rdf.model.RDFNode; +import org.apache.jena.vocabulary.XSD; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Regression tests for the high-severity correctness fixes: + *
      + *
    • C3 - a concrete object term absent from the dictionary must yield no + * solutions (BGIteratorSO previously treated "not in dictionary" like an + * unbound variable and scanned the whole object range, so + * {@code ASK {

      }} answered true).

    • + *
    • C6a - {@code FILTER(?o <= X)} range pushdown must keep the boundary row + * (BGIteratorPOS subtracted 1 from an already-inclusive upperBound).
    • + *
    • H4 - {@code GRAPH } where x is an entity but not a graph must return + * empty instead of leaking id-0 padding rows (which crashed extract), and + * containsGraph must only report actual graphs.
    • + *
    • H1 - xsd:long values needing 58-63 bits (>= 2^56) must build instead of + * crashing on an unsupported bit width.
    • + *
    • H2 - sorted-adjacent strings sharing a high surrogate (emoji) must not + * be corrupted by the front-coded dictionary splitting the pair.
    • + *
    + */ +class HighSeverityFixesRoundTripTest { + + // p/q/r emoji pairs: each pair is sorted-adjacent and shares its prefix up to + // (and including) the high surrogate of the emoji, so front-coding would split + // the surrogate pair. Three pairs so at least two are front-coded within a + // block regardless of where the FCD block boundary (blockSize 16) falls. + private static final String TTL = """ + @prefix ex: . + @prefix xsd: . + ex:s1 ex:p ex:o1 . + ex:s1 ex:q "alpha" . + ex:v1 ex:value 10 . + ex:v2 ex:value 20 . + ex:v3 ex:value 30 . + ex:v4 ex:value 40 . + ex:t1 ex:stamp "100000000000000000"^^xsd:long . + ex:t2 ex:stamp "5"^^xsd:long . + ex:e1 ex:label "p😀" . + ex:e2 ex:label "p😁" . + ex:e3 ex:label "q😀" . + ex:e4 ex:label "q😁" . + ex:e5 ex:label "r😀" . + ex:e6 ex:label "r😁" . + """; + + private static final String PREFIX = + "PREFIX ex: PREFIX xsd: "; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("highsev.ttl").toFile(); + File h5 = dir.resolve("highsev.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder() + .setSource(ttl).setDestination(h5) + .setSpatial(false).setFeatures(false) + .build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static boolean ask(String pattern) { + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + "ASK { " + pattern + " }")).build()) { + return qe.execAsk(); + } + } + + private static int count(String whereBody) { + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + "SELECT * WHERE { " + whereBody + " }")).build()) { + ResultSet rs = qe.execSelect(); + int n = 0; + while (rs.hasNext()) { rs.next(); n++; } + return n; + } + } + + private static Set selectURIs(String var, String query) { + Set uris = new HashSet<>(); + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + query)).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + RDFNode n = rs.next().get(var); + if (n != null && n.isURIResource()) uris.add(n.asResource().getURI()); + } + } + return uris; + } + + // --- C3: concrete object absent from the dictionary ------------------- + + @Test + void askWithAbsentConcreteObjectIsFalse() { + assertTrue(ask("ex:s1 ex:p ex:o1"), "control: existing triple must match"); + assertFalse(ask("ex:s1 ex:p ex:notInStore"), "URI object absent from the store"); + assertFalse(ask("ex:s1 ex:q \"not in store\""), "literal object absent from the store"); + assertFalse(ask("ex:s1 ex:p \"42\"^^xsd:int"), "literal absent from the store"); + } + + @Test + void selectWithAbsentConcreteObjectIsEmpty() { + assertEquals(0, count("ex:s1 ex:p ex:notInStore")); + assertEquals(0, count("ex:s1 ex:q \"not in store\"")); + } + + // --- C6a: FILTER upper-bound boundary row ------------------------------ + + @Test + void filterLessOrEqualKeepsBoundaryRow() { + assertEquals(Set.of("http://ex.org/v1", "http://ex.org/v2", "http://ex.org/v3"), + selectURIs("s", "SELECT ?s WHERE { ?s ex:value ?o FILTER(?o <= 30) }")); + } + + @Test + void filterLessThanKeepsLastIncludedRow() { + assertEquals(Set.of("http://ex.org/v1", "http://ex.org/v2", "http://ex.org/v3"), + selectURIs("s", "SELECT ?s WHERE { ?s ex:value ?o FILTER(?o < 40) }")); + } + + // --- H4: GRAPH on a non-graph entity ----------------------------------- + + @Test + void graphPatternOnNonGraphEntityIsEmpty() { + // ex:o1 exists in the entity dictionary (as an object) but is not a graph. + // Previously the GSPO padding rows (S=0) leaked through and extract(0) threw. + assertEquals(0, count("GRAPH ex:o1 { ?s ?p ?o }")); + } + + @Test + void graphPatternOnRealNamedGraphStillWorks() { + // The writer always embeds VoID metadata in its own named graph; the id-0 + // padding guard must not suppress real rows. + assertTrue(count("GRAPH <" + Params.VOIDSTRING + "> { ?s ?p ?o }") > 0, + "VoID named graph must still be queryable"); + } + + @Test + void containsGraphReportsOnlyActualGraphs() { + assertFalse(ds.asDatasetGraph().containsGraph(NodeFactory.createURI("http://ex.org/o1")), + "an entity that never occurs as a graph is not a graph"); + assertTrue(ds.asDatasetGraph().containsGraph(NodeFactory.createURI(Params.VOIDSTRING)), + "the VoID metadata graph is a real named graph"); + } + + // --- H1: xsd:long needing 58-63 bits ------------------------------------ + + @Test + void largeLongRoundTrips() { + // 1e17 > 2^56, so the value-derived width is 58 - previously rejected by + // BitPackedUnSignedLongBuffer (which supports 1..57 and 64 only), crashing + // the whole build in @BeforeAll. + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + "SELECT ?v WHERE { ex:t1 ex:stamp ?v }")).build()) { + ResultSet rs = qe.execSelect(); + assertTrue(rs.hasNext()); + Literal v = rs.next().getLiteral("v"); + assertEquals("100000000000000000", v.getLexicalForm()); + assertEquals(XSD.xlong.getURI(), v.getDatatypeURI()); + assertFalse(rs.hasNext()); + } + } + + // --- H2: surrogate-pair-safe front coding ------------------------------- + + @Test + void supplementaryPlaneStringsRoundTrip() { + String[][] cases = { + {"http://ex.org/e1", "p😀"}, + {"http://ex.org/e2", "p😁"}, + {"http://ex.org/e3", "q😀"}, + {"http://ex.org/e4", "q😁"}, + {"http://ex.org/e5", "r😀"}, + {"http://ex.org/e6", "r😁"}, + }; + for (String[] c : cases) { + // Extraction: the stored value must come back byte-identical. + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + "SELECT ?v WHERE { <" + c[0] + "> ex:label ?v }")).build()) { + ResultSet rs = qe.execSelect(); + assertTrue(rs.hasNext(), "no label for " + c[0]); + assertEquals(c[1], rs.next().getLiteral("v").getLexicalForm(), + "label for " + c[0] + " must survive front coding"); + } + // Lookup: the exact term must be locatable again. + assertEquals(Set.of(c[0]), + selectURIs("s", "SELECT ?s WHERE { ?s ex:label \"" + c[1] + "\" }"), + "term lookup for label of " + c[0]); + } + } +} diff --git a/src/test/java/com/ebremer/beakgraph/HilbertSpaceFixesTest.java b/src/test/java/com/ebremer/beakgraph/HilbertSpaceFixesTest.java new file mode 100644 index 00000000..f12ea876 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/HilbertSpaceFixesTest.java @@ -0,0 +1,79 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.hdf5.jena.HilbertPolygon; +import com.ebremer.halcyon.geometry.Point; +import com.ebremer.halcyon.hilbert.HilbertSpace; +import java.util.ArrayList; +import org.davidmoten.hilbert.Range; +import org.junit.jupiter.api.Test; + +/** + * Regression tests for two HilbertSpace bugs: + *
      + *
    • H8 - {@code fromWkt} did not strip the optional CRS prefix GeoSPARQL + * wktLiterals may carry and threw a bare {@code java.lang.Error} on any + * parse problem, crashing the spatial query path for standard-form data.
    • + *
    • H10 - both {@code inRange} overloads computed {@code contains(...)} in + * arrow-switch statements, discarded the result, and always returned + * false (breaking the {@code getPolygon} boundary walk).
    • + *
    + */ +class HilbertSpaceFixesTest { + + private static final String CRS = " "; + private static final String SQUARE = "POLYGON((0 0,8 0,8 8,0 8,0 0))"; + + // --- H8 ----------------------------------------------------------------- + + @Test + void fromWktAcceptsCrsPrefixedLiterals() { + org.locationtech.jts.geom.Polygon p = HilbertSpace.fromWkt(CRS + SQUARE); + assertNotNull(p); + assertEquals(64.0, p.getArea(), 1e-9); + // And the plain form keeps working. + assertEquals(64.0, HilbertSpace.fromWkt(SQUARE).getArea(), 1e-9); + } + + @Test + void polygon2HilbertAcceptsCrsPrefixedLiterals() { + ArrayList ranges = HilbertPolygon.Polygon2Hilbert(CRS + SQUARE, 0); + assertFalse(ranges.isEmpty(), "a real polygon must produce Hilbert ranges"); + } + + @Test + void fromWktRejectsGarbageWithCatchableException() { + // Not a java.lang.Error: callers must be able to catch and degrade. + try { + HilbertSpace.fromWkt("NOT A POLYGON AT ALL"); + } catch (RuntimeException expected) { + return; + } + throw new AssertionError("malformed WKT must raise a RuntimeException"); + } + + // --- H10 ---------------------------------------------------------------- + + @Test + void inRangeReportsNeighborMembership() { + // A single-cell range at Hilbert index of (5,4). + long idx = HilbertSpace.hc.index(5, 4); + ArrayList ranges = new ArrayList<>(); + ranges.add(new Range(idx, idx)); + + // From (5,5): the N neighbour is (5,4) -> in range; S is (5,6) -> not. + assertTrue(HilbertSpace.inRange(ranges, new Point(5, 5), HilbertSpace.N), + "north neighbour (5,4) is in the range"); + assertFalse(HilbertSpace.inRange(ranges, new Point(5, 5), HilbertSpace.S), + "south neighbour (5,6) is not in the range"); + // From (4,4): the E neighbour is (5,4) -> in range; W is (3,4) -> not. + assertTrue(HilbertSpace.inRange(ranges, new Point(4, 4), HilbertSpace.E)); + assertFalse(HilbertSpace.inRange(ranges, new Point(4, 4), HilbertSpace.W)); + // Diagonals: from (6,5), NW is (5,4) -> in range. + assertTrue(HilbertSpace.inRange(ranges, new Point(6, 5), HilbertSpace.NW)); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/NumericCanonicalizationTest.java b/src/test/java/com/ebremer/beakgraph/NumericCanonicalizationTest.java new file mode 100644 index 00000000..077817f0 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/NumericCanonicalizationTest.java @@ -0,0 +1,130 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.apache.jena.rdf.model.Literal; +import org.apache.jena.rdf.model.RDFNode; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Regression tests for H3: numeric literals (xsd:int / xsd:long / xsd:float / + * xsd:double) are stored by VALUE, and the reader regenerates the canonical + * lexical form. Two lexical variants of one value ("01" vs "1"^^xsd:int) used + * to become two term-distinct dictionary entries that both extract to the same + * canonical term - duplicate "equal" entries that break the strict ordering + * the dictionary binary search relies on, leaving some triples unreachable by + * term lookup. + *

    + * Policy: such literals are canonicalized at ingest (the value-typed storage + * never preserved their lexical form anyway), so all variants collapse onto + * one term and every triple is findable via the canonical form. + */ +class NumericCanonicalizationTest { + + private static final String TTL = """ + @prefix ex: . + @prefix xsd: . + ex:a ex:v "01"^^xsd:int . + ex:b ex:v "1"^^xsd:int . + ex:c ex:v "007"^^xsd:long . + ex:d ex:v "7"^^xsd:long . + ex:e ex:v "2.50"^^xsd:float . + ex:f ex:v "2.5"^^xsd:float . + ex:g ex:v "1.0E1"^^xsd:double . + ex:h ex:v "10.0"^^xsd:double . + ex:z ex:v "2"^^xsd:int . + """; + + private static final String PREFIX = + "PREFIX ex: PREFIX xsd: "; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("canon.ttl").toFile(); + File h5 = dir.resolve("canon.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder() + .setSource(ttl).setDestination(h5) + .setSpatial(false).setFeatures(false) + .build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static Set subjects(String objectTerm) { + Set uris = new HashSet<>(); + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + "SELECT ?s WHERE { ?s ex:v " + objectTerm + " }")).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + RDFNode n = rs.next().get("s"); + if (n != null && n.isURIResource()) uris.add(n.asResource().getURI()); + } + } + return uris; + } + + @Test + void lexicalVariantsCollapseAndAllTriplesStayFindable() { + assertEquals(Set.of("http://ex.org/a", "http://ex.org/b"), subjects("\"1\"^^xsd:int")); + assertEquals(Set.of("http://ex.org/c", "http://ex.org/d"), subjects("\"7\"^^xsd:long")); + assertEquals(Set.of("http://ex.org/e", "http://ex.org/f"), subjects("\"2.5\"^^xsd:float")); + assertEquals(Set.of("http://ex.org/g", "http://ex.org/h"), subjects("\"10.0\"^^xsd:double")); + // Neighbouring entries are still findable (ordering is intact). + assertEquals(Set.of("http://ex.org/z"), subjects("\"2\"^^xsd:int")); + } + + @Test + void nonCanonicalQueryConstantMatchesNothing() { + // Documented policy: the store contains the canonical term only; "01"^^xsd:int + // is a different RDF term and (correctly, under term semantics) matches nothing. + assertEquals(Set.of(), subjects("\"01\"^^xsd:int")); + } + + @Test + void extractionReturnsCanonicalForm() { + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + "SELECT ?v WHERE { ex:a ex:v ?v }")).build()) { + ResultSet rs = qe.execSelect(); + Literal v = rs.next().getLiteral("v"); + assertEquals("1", v.getLexicalForm()); + } + } + + @Test + void distinctValuesCollapseToCanonicalTerms() { + Set values = new HashSet<>(); + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + "SELECT DISTINCT ?v WHERE { ?s ex:v ?v }")).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) values.add(rs.next().getLiteral("v").getLexicalForm()); + } + assertEquals(Set.of("1", "7", "2.5", "10.0", "2"), values); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/ReaderLifecycleTest.java b/src/test/java/com/ebremer/beakgraph/ReaderLifecycleTest.java new file mode 100644 index 00000000..a472e66b --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/ReaderLifecycleTest.java @@ -0,0 +1,128 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import com.ebremer.beakgraph.pool.BeakGraphPool; +import io.jhdf.HdfFile; +import io.jhdf.WritableHdfFile; +import java.io.File; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Regression tests for the reader lifecycle fixes: + *

      + *
    • H5 - opening a structurally valid HDF5 file that is not a BeakGraph + * file must fail with a clear exception AND release the underlying file + * mapping (a leaked HdfFile pins the file lock on Windows).
    • + *
    • H6 - closing a named-graph wrapper obtained from the dataset must not + * close the shared reader under the rest of the dataset, and the keyed + * pool must not re-issue an instance whose reader has been closed.
    • + *
    + */ +class ReaderLifecycleTest { + + private static final String TTL = """ + @prefix ex: . + ex:s ex:p ex:o . + ex:s ex:p "v" . + """; + + @TempDir + static Path dir; + static File h5; + + @BeforeAll + static void build() throws Exception { + File ttl = dir.resolve("life.ttl").toFile(); + h5 = dir.resolve("life.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder() + .setSource(ttl).setDestination(h5) + .setSpatial(false).setFeatures(false) + .build().write(); + } + + @AfterAll + static void drainPool() { + BeakGraphPool.getPool().clear(h5.toURI()); + } + + private static int count(Dataset ds) { + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create("SELECT * WHERE { ?s ?p ?o }")).build()) { + ResultSet rs = qe.execSelect(); + int n = 0; + while (rs.hasNext()) { rs.next(); n++; } + return n; + } + } + + // --- H5 --------------------------------------------------------------- + + @Test + void malformedFileIsRejectedAndReleased() throws Exception { + Path notBG = dir.resolve("notbeakgraph.h5"); + try (WritableHdfFile out = HdfFile.write(notBG)) { + out.putGroup("SomethingElse").putAttribute("hello", 1); + } + assertThrows(IllegalStateException.class, () -> new HDF5Reader(notBG.toFile()), + "a non-BeakGraph HDF5 file must be rejected explicitly"); + // The failed constructor must have closed the mapped file: on Windows an + // open HdfFile mapping makes this delete fail. + Files.delete(notBG); + } + + // --- H6: named-graph wrapper close ------------------------------------ + + @Test + void closingNamedGraphWrapperDoesNotKillDataset() throws Exception { + try (BeakGraph bg = new BeakGraph(new HDF5Reader(h5))) { + Dataset ds = bg.getDataset(); + // Routine Jena usage: obtain a named model, read it, close it - BEFORE + // anything else has touched the file, so a close that wrongly cascades + // to the shared reader cannot hide behind already-cached index buffers. + ds.getNamedModel(Params.VOIDSTRING).close(); + assertTrue(count(ds) > 0, + "closing a named-graph view must not close the shared reader"); + assertTrue(bg.getReader().isOpen(), "shared reader must remain open"); + } + } + + // --- H6: pool must not re-issue a closed instance ----------------------- + + @Test + void poolDoesNotReissueClosedInstance() throws Exception { + URI key = h5.toURI(); + BeakGraph first = BeakGraphPool.getPool().borrowObject(key); + assertNotNull(first); + // Poison the instance the way a buggy/abusive caller would, then return it. + first.close(); + BeakGraphPool.getPool().returnObject(key, first); + + BeakGraph second = BeakGraphPool.getPool().borrowObject(key); + try { + // With testOnBorrow active and a working validateObject, the poisoned + // instance is destroyed and a fresh one is created - so this works. + assertTrue(count(second.getDataset()) > 0, + "borrowed instance must be usable after a poisoned return"); + } finally { + BeakGraphPool.getPool().returnObject(key, second); + } + } +} diff --git a/src/test/java/com/ebremer/beakgraph/RegistryWiringTest.java b/src/test/java/com/ebremer/beakgraph/RegistryWiringTest.java new file mode 100644 index 00000000..58f7c4e9 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/RegistryWiringTest.java @@ -0,0 +1,175 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.jena.OpExecutorBG; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; +import org.apache.jena.query.ARQ; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryExecutionFactory; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.apache.jena.rdf.model.Model; +import org.apache.jena.rdf.model.ModelFactory; +import org.apache.jena.rdf.model.RDFNode; +import org.apache.jena.rdf.model.Resource; +import org.apache.jena.sparql.engine.main.QC; +import org.apache.jena.sparql.pfunction.PropertyFunctionRegistry; +import org.apache.jena.vocabulary.RDF; +import org.apache.jena.vocabulary.RDFS; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Regression tests for H7: loading BeakGraph must not mutate global Jena + * semantics for other datasets in the same JVM. + *
      + *
    • The standard rdfs:member property function must stay registered + * globally (it used to be remove()d JVM-wide).
    • + *
    • BG stores treat rdfs:member as a plain stored predicate - excluded + * from property-function rewriting via a dataset-scoped registry, not by + * changing the global one.
    • + *
    • The BG OpExecutor factory is wired into the dataset's context, not the + * global ARQ context.
    • + *
    • The globally registered geof:sfIntersects must actually evaluate + * intersection (it used to return TRUE unconditionally).
    • + *
    + */ +class RegistryWiringTest { + + private static final String TTL = """ + @prefix ex: . + @prefix rdfs: . + ex:bag rdfs:member ex:item . + ex:s1 ex:p ex:o1 . + """; + + private static final String GEO_WKT = "http://www.opengis.net/ont/geosparql#wktLiteral"; + private static final String GEOF = "http://www.opengis.net/def/function/geosparql/"; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("wiring.ttl").toFile(); + File h5 = dir.resolve("wiring.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder() + .setSource(ttl).setDestination(h5) + .setSpatial(false).setFeatures(false) + .build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + // --- global registries stay intact ------------------------------------- + + @Test + void rdfsMemberStaysRegisteredGlobally() { + assertNotNull(PropertyFunctionRegistry.get().get(RDFS.member.getURI()), + "loading BeakGraph must not remove the standard rdfs:member property function"); + } + + @Test + void rdfsMemberStillWorksOnPlainJenaModels() { + // rdf:_1 containership answered via the rdfs:member property function + // (which requires the subject to be typed as a container). + Model m = ModelFactory.createDefaultModel(); + Resource c = m.createResource("http://ex.org/c"); + Resource item = m.createResource("http://ex.org/i"); + c.addProperty(RDF.type, RDF.Seq); + c.addProperty(RDF.li(1), item); + try (QueryExecution qe = QueryExecutionFactory.create(QueryFactory.create( + "PREFIX rdfs: " + + "SELECT ?x WHERE { rdfs:member ?x }"), m)) { + ResultSet rs = qe.execSelect(); + assertTrue(rs.hasNext(), "container membership must be answered"); + assertEquals("http://ex.org/i", rs.next().getResource("x").getURI()); + assertFalse(rs.hasNext()); + } + } + + @Test + void globalOpExecutorFactoryIsNotHijacked() { + assertNotSame(OpExecutorBG.opExecFactoryBG, QC.getFactory(ARQ.getContext()), + "the BG OpExecutor factory must not be installed JVM-globally"); + } + + // --- per-dataset wiring -------------------------------------------------- + + @Test + void datasetContextCarriesBGExecutorAndScopedPropertyFunctions() { + assertSame(OpExecutorBG.opExecFactoryBG, QC.getFactory(ds.asDatasetGraph().getContext()), + "BG datasets must carry their executor in their own context"); + PropertyFunctionRegistry scoped = + PropertyFunctionRegistry.chooseRegistry(ds.asDatasetGraph().getContext()); + assertNull(scoped.get(RDFS.member.getURI()), + "BG datasets must not rewrite rdfs:member patterns into container membership"); + } + + @Test + void rdfsMemberIsAPlainPredicateInBGData() { + // The stored triple uses rdfs:member literally; the property function + // (which expands to rdf:_N lookups) would answer nothing here. + Set items = new HashSet<>(); + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create( + "PREFIX rdfs: " + + "SELECT ?x WHERE { rdfs:member ?x }")).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + RDFNode n = rs.next().get("x"); + if (n != null && n.isURIResource()) items.add(n.asResource().getURI()); + } + } + assertEquals(Set.of("http://ex.org/item"), items); + } + + // --- sfIntersects fallback is sound -------------------------------------- + + private static boolean intersects(String wkt1, String wkt2) { + String q = "ASK { FILTER(<" + GEOF + "sfIntersects>(" + + "\"" + wkt1 + "\"^^<" + GEO_WKT + ">, \"" + wkt2 + "\"^^<" + GEO_WKT + ">)) }"; + try (QueryExecution qe = QueryExecutionFactory.create( + QueryFactory.create(q), ModelFactory.createDefaultModel())) { + return qe.execAsk(); + } + } + + @Test + void sfIntersectsEvaluatesGeometry() { + assertTrue(intersects("POLYGON((0 0,10 0,10 10,0 10,0 0))", "POINT(5 5)"), + "point inside polygon"); + assertTrue(intersects("POLYGON((0 0,10 0,10 10,0 10,0 0))", "POLYGON((5 5,15 5,15 15,5 15,5 5))"), + "overlapping polygons intersect even though neither is within the other"); + assertFalse(intersects("POLYGON((0 0,10 0,10 10,0 10,0 0))", "POINT(50 50)"), + "disjoint geometries must NOT intersect (previously always true)"); + assertTrue(intersects(" POINT(5 5)", + "POLYGON((0 0,10 0,10 10,0 10,0 0))"), + "CRS-prefixed wktLiteral must be handled"); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/RepeatedVariablePatternTest.java b/src/test/java/com/ebremer/beakgraph/RepeatedVariablePatternTest.java new file mode 100644 index 00000000..ac14b122 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/RepeatedVariablePatternTest.java @@ -0,0 +1,131 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.QuerySolution; +import org.apache.jena.query.ResultSet; +import org.apache.jena.rdf.model.RDFNode; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Regression tests for C1: a variable repeated within one triple pattern must + * only match rows where both positions hold the same term. BindingNodeId.put + * previously kept the first value and silently ignored the second, so + * {@code ?s ?p ?s} matched every triple. + */ +class RepeatedVariablePatternTest { + + // ex:loop is subject, predicate AND object of one triple (S=P=O); + // ex:a and ex:c are S=O with distinct predicates; (a p b) and (d q e) + // are ordinary triples that must NOT match repeated-variable patterns. + private static final String TTL = """ + @prefix ex: . + ex:loop ex:loop ex:loop . + ex:a ex:p ex:a . + ex:a ex:p ex:b . + ex:c ex:q ex:c . + ex:d ex:q ex:e . + """; + + private static final String PREFIX = "PREFIX ex: "; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("repvar.ttl").toFile(); + File h5 = dir.resolve("repvar.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder() + .setSource(ttl).setDestination(h5) + .setSpatial(false).setFeatures(false) + .build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static Set select(String var, String query) { + Set uris = new HashSet<>(); + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + query)).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + QuerySolution qs = rs.next(); + RDFNode n = qs.get(var); + if (n != null && n.isURIResource()) uris.add(n.asResource().getURI()); + } + } + return uris; + } + + @Test + void subjectObjectRepeatMatchesOnlyEqualRows() { + // ?s ?p ?s : subject must equal object -> loop, a, c (NOT b/d/e rows). + assertEquals(Set.of("http://ex.org/loop", "http://ex.org/a", "http://ex.org/c"), + select("s", "SELECT ?s WHERE { ?s ?p ?s }")); + } + + @Test + void subjectObjectRepeatWithBoundPredicate() { + // ?x ex:p ?x : only (a p a); (a p b) must not match. + assertEquals(Set.of("http://ex.org/a"), + select("x", "SELECT ?x WHERE { ?x ex:p ?x }")); + assertEquals(Set.of("http://ex.org/c"), + select("x", "SELECT ?x WHERE { ?x ex:q ?x }")); + } + + @Test + void subjectPredicateRepeatMatchesOnlyEqualRows() { + // ?x ?x ?o : subject must equal predicate -> only the loop triple. + // (Subject ids live in the entity dictionary, predicate ids in their own + // dictionary, so this also exercises the cross-id-space comparison.) + assertEquals(Set.of("http://ex.org/loop"), + select("x", "SELECT ?x WHERE { ?x ?x ?o }")); + assertEquals(Set.of("http://ex.org/loop"), + select("o", "SELECT ?o WHERE { ?x ?x ?o }")); + } + + @Test + void tripleRepeatMatchesOnlyAllEqualRow() { + // ?x ?x ?x : S = P = O -> only the loop triple. + assertEquals(Set.of("http://ex.org/loop"), + select("x", "SELECT ?x WHERE { ?x ?x ?x }")); + } + + @Test + void askVariantsAgree() { + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + "ASK { ex:d ?p ex:d }")).build()) { + assertFalse(qe.execAsk(), "ex:d is never its own object"); + } + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + "ASK { ex:a ?p ex:a }")).build()) { + assertTrue(qe.execAsk()); + } + } +} diff --git a/src/test/java/com/ebremer/beakgraph/SpatialCrsIndexingTest.java b/src/test/java/com/ebremer/beakgraph/SpatialCrsIndexingTest.java new file mode 100644 index 00000000..0098cdfa --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/SpatialCrsIndexingTest.java @@ -0,0 +1,68 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Regression test for the H8 write path: a wktLiteral carrying the optional + * GeoSPARQL CRS prefix must be spatially indexed. Previously the raw lexical + * form went straight into a JTS WKTReader, failed to parse, and the geometry + * was silently dropped from the index (classified "degenerate"). + */ +class SpatialCrsIndexingTest { + + private static final String TTL = """ + @prefix ex: . + @prefix geo: . + ex:f1 geo:asWKT " POLYGON((0 0,64 0,64 64,0 64,0 0))"^^geo:wktLiteral . + """; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("crs.ttl").toFile(); + File h5 = dir.resolve("crs.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder() + .setSource(ttl).setDestination(h5) + .setSpatial(true).setFeatures(false) + .build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + @Test + void crsPrefixedGeometryIsIndexed() { + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create( + "SELECT * WHERE { GRAPH <" + Params.SPATIALSTRING + "> { ?s ?p ?o } }")).build()) { + ResultSet rs = qe.execSelect(); + int n = 0; + while (rs.hasNext()) { rs.next(); n++; } + assertTrue(n > 0, "the spatial graph must contain index rows for a CRS-prefixed geometry"); + } + } +} diff --git a/src/test/java/com/ebremer/beakgraph/UnionGraphAndDetachTest.java b/src/test/java/com/ebremer/beakgraph/UnionGraphAndDetachTest.java new file mode 100644 index 00000000..bd24fcf6 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/UnionGraphAndDetachTest.java @@ -0,0 +1,163 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.jena.BindingBG; +import com.ebremer.beakgraph.hdf5.jena.BindingNodeId; +import com.ebremer.beakgraph.hdf5.jena.NodeId; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Iterator; +import org.apache.jena.graph.Node; +import org.apache.jena.graph.NodeFactory; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.apache.jena.sparql.core.Quad; +import org.apache.jena.sparql.core.Var; +import org.apache.jena.sparql.engine.binding.Binding; +import org.apache.jena.sparql.engine.binding.BindingFactory; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Regression tests for three dataset/binding contract gaps: + *
      + *
    • {@code GRAPH } must query the union of all named + * graphs (it silently returned empty).
    • + *
    • {@code findNG} must return named-graph quads only (it delegated to + * {@code find}, which prepends the default graph).
    • + *
    • {@code BindingBG.detachWithNewParent} must materialize the + * NodeId-backed bindings (it threw UnsupportedOperationException, which + * breaks Jena's binding detach/copy paths).
    • + *
    + */ +class UnionGraphAndDetachTest { + + private static final String TTL = """ + @prefix ex: . + ex:s1 ex:p ex:o1 . + ex:s2 ex:p "v" . + """; + + private static final int DEFAULT_GRAPH_TRIPLES = 2; + // Use Jena's constant - the URI is urn:x-arq:UnionGraph (capital U), and a + // hand-typed variant silently names a non-existent graph. + private static final String UNION = Quad.unionGraph.getURI(); + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("union.ttl").toFile(); + File h5 = dir.resolve("union.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder() + .setSource(ttl).setDestination(h5) + .setSpatial(false).setFeatures(false) + .build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static int count(String query) { + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create("PREFIX ex: " + query)).build()) { + ResultSet rs = qe.execSelect(); + int n = 0; + while (rs.hasNext()) { rs.next(); n++; } + return n; + } + } + + private static int voidGraphSize() { + return count("SELECT * WHERE { GRAPH <" + Params.VOIDSTRING + "> { ?s ?p ?o } }"); + } + + // --- union default graph ------------------------------------------------- + + @Test + void unionGraphQueriesAllNamedGraphs() { + int voidCount = voidGraphSize(); + assertTrue(voidCount > 0, "control: the VoID named graph is non-empty"); + assertEquals(voidCount, + count("SELECT * WHERE { GRAPH <" + UNION + "> { ?s ?p ?o } }"), + "the union graph must contain exactly the named-graph triples"); + } + + @Test + void unionGraphExcludesDefaultGraphTriples() { + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create( + "PREFIX ex: ASK { GRAPH <" + UNION + "> { ex:s1 ex:p ex:o1 } }")).build()) { + assertFalse(qe.execAsk(), "default-graph triples are not part of the union of named graphs"); + } + } + + @Test + void getUnionModelWorks() { + assertEquals(voidGraphSize(), ds.getUnionModel().size()); + } + + // --- findNG --------------------------------------------------------------- + + @Test + void findNGReturnsNamedGraphQuadsOnly() { + Iterator it = ds.asDatasetGraph().findNG(Node.ANY, Node.ANY, Node.ANY, Node.ANY); + int n = 0; + while (it.hasNext()) { + Quad q = it.next(); + assertFalse(Quad.isDefaultGraph(q.getGraph()), + "findNG must not return default-graph quads, got: " + q); + n++; + } + assertEquals(voidGraphSize(), n); + } + + @Test + void findAnyStillIncludesDefaultGraph() { + Iterator it = ds.asDatasetGraph().find(Node.ANY, Node.ANY, Node.ANY, Node.ANY); + int n = 0; + while (it.hasNext()) { it.next(); n++; } + assertEquals(DEFAULT_GRAPH_TRIPLES + voidGraphSize(), n); + } + + // --- detach ---------------------------------------------------------------- + + @Test + void detachMaterializesNodeIdBindings() { + Node s1 = NodeFactory.createURI("http://ex.org/s1"); + NodeId id = bg.getReader().getNodeTable().getNodeIdForNode(s1); + assertFalse(NodeId.isDoesNotExist(id), "control: ex:s1 must be in the dictionary"); + + Node parentTerm = NodeFactory.createURI("http://ex.org/parent"); + Binding parent = BindingFactory.binding(Var.alloc("x"), parentTerm); + BindingNodeId bnid = new BindingNodeId(parent); + bnid.put(Var.alloc("s"), id); + + Binding detached = new BindingBG(bnid, bg).detach(); + assertFalse(detached instanceof BindingBG, + "detach must materialize away from the reader-backed binding"); + assertEquals(s1, detached.get(Var.alloc("s")), + "detached binding must carry the materialized node"); + assertEquals(parentTerm, detached.get(Var.alloc("x")), + "detached binding must keep parent bindings"); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/ValueClusterFilterTest.java b/src/test/java/com/ebremer/beakgraph/ValueClusterFilterTest.java new file mode 100644 index 00000000..4b5cbc20 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/ValueClusterFilterTest.java @@ -0,0 +1,128 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.apache.jena.rdf.model.RDFNode; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Regression tests for C6b: range-filter pushdown must enclose the whole + * cluster of value-equal but term-distinct literals. "5"^^xsd:int, 5 + * (xsd:integer) and "5.0"^^xsd:double compare value-equal and occupy distinct + * adjacent dictionary ids; deriving the scan bound from the exact-term + * insertion point landed inside that cluster and silently dropped qualifying + * rows at the boundary (e.g. FILTER(?o >= 5) missed "5"^^xsd:int). + */ +class ValueClusterFilterTest { + + private static final String TTL = """ + @prefix ex: . + @prefix xsd: . + ex:m1 ex:value "5"^^xsd:int . + ex:m2 ex:value 5 . + ex:m3 ex:value "5.0"^^xsd:double . + ex:m4 ex:value 4 . + ex:m5 ex:value 6 . + """; + + private static final String PREFIX = + "PREFIX ex: PREFIX xsd: "; + + private static final Set ALL_FIVES_AND_UP = + Set.of("http://ex.org/m1", "http://ex.org/m2", "http://ex.org/m3", "http://ex.org/m5"); + private static final Set ALL_FIVES_AND_DOWN = + Set.of("http://ex.org/m1", "http://ex.org/m2", "http://ex.org/m3", "http://ex.org/m4"); + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("cluster.ttl").toFile(); + File h5 = dir.resolve("cluster.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder() + .setSource(ttl).setDestination(h5) + .setSpatial(false).setFeatures(false) + .build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static Set subjects(String where) { + Set uris = new HashSet<>(); + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + "SELECT ?s WHERE { " + where + " }")).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + RDFNode n = rs.next().get("s"); + if (n != null && n.isURIResource()) uris.add(n.asResource().getURI()); + } + } + return uris; + } + + // --- bound predicate (GPOS / BGIteratorPOS route) ----------------------- + + @Test + void greaterOrEqualIncludesWholeValueCluster() { + assertEquals(ALL_FIVES_AND_UP, subjects("?s ex:value ?o FILTER(?o >= 5)")); + } + + @Test + void lessOrEqualIncludesWholeValueCluster() { + assertEquals(ALL_FIVES_AND_DOWN, subjects("?s ex:value ?o FILTER(?o <= 5)")); + } + + @Test + void strictBoundsExcludeWholeValueCluster() { + assertEquals(Set.of("http://ex.org/m5"), subjects("?s ex:value ?o FILTER(?o > 5)")); + assertEquals(Set.of("http://ex.org/m4"), subjects("?s ex:value ?o FILTER(?o < 5)")); + } + + @Test + void absentConstantInsideClusterRange() { + // 4.5 is not a stored term; the insertion point sits next to the 5-cluster. + assertEquals(ALL_FIVES_AND_UP, subjects("?s ex:value ?o FILTER(?o > 4.5)")); + assertEquals(Set.of("http://ex.org/m4"), subjects("?s ex:value ?o FILTER(?o < 4.5)")); + } + + @Test + void typedConstantVariantsAgree() { + // The same value written as a different term must produce identical results. + assertEquals(ALL_FIVES_AND_UP, subjects("?s ex:value ?o FILTER(?o >= \"5\"^^xsd:int)")); + assertEquals(ALL_FIVES_AND_UP, subjects("?s ex:value ?o FILTER(?o >= \"5.0\"^^xsd:double)")); + } + + // --- variable predicate (GSPO full scan / BGIteratorSPO_All route) ------ + + @Test + void fullScanRouteAgrees() { + assertEquals(ALL_FIVES_AND_UP, subjects("?s ?p ?o FILTER(?o >= 5)")); + assertEquals(ALL_FIVES_AND_DOWN, subjects("?s ?p ?o FILTER(?o <= 5)")); + assertEquals(Set.of("http://ex.org/m5"), subjects("?s ?p ?o FILTER(?o > 5)")); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/features/MajorMinorLocaleTest.java b/src/test/java/com/ebremer/beakgraph/features/MajorMinorLocaleTest.java new file mode 100644 index 00000000..8218cb4f --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/features/MajorMinorLocaleTest.java @@ -0,0 +1,51 @@ +package com.ebremer.beakgraph.features; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.ebremer.ns.HAL; +import java.util.ArrayList; +import java.util.Locale; +import org.apache.jena.graph.NodeFactory; +import org.apache.jena.sparql.core.Quad; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.locationtech.jts.io.WKTReader; + +/** + * Regression test: the WKT literals MajorMinor generates must use '.' as the + * decimal separator regardless of the JVM default locale. Under de_DE the old + * String.format calls produced "POINT(5,0000 2,5000)" - invalid WKT. + */ +class MajorMinorLocaleTest { + + private Locale saved; + + @BeforeEach + void forceCommaDecimalLocale() { + saved = Locale.getDefault(); + Locale.setDefault(Locale.GERMANY); + } + + @AfterEach + void restoreLocale() { + Locale.setDefault(saved); + } + + @Test + void wktUsesDotDecimalSeparatorUnderCommaLocale() throws Exception { + ArrayList quads = new ArrayList<>(); + MajorMinor.add(quads, NodeFactory.createURI("http://ex.org/f"), + "POLYGON((0 0, 10 0, 10 5, 0 5, 0 0))"); + assertEquals(3, quads.size(), "centroid + major axis + minor axis expected"); + + WKTReader reader = new WKTReader(); + String centroid = null; + for (Quad q : quads) { + String wkt = q.getObject().getLiteralLexicalForm(); + reader.read(wkt); // throws ParseException on locale-corrupted WKT + if (q.getPredicate().equals(HAL.centroid.asNode())) centroid = wkt; + } + assertEquals("POINT(5.0000 2.5000)", centroid); + } +} From f734f2aa794bb764bf5d664e1dc38c9b6ad38e05 Mon Sep 17 00:00:00 2001 From: Erich Bremer Date: Thu, 11 Jun 2026 14:24:08 -0400 Subject: [PATCH 3/4] code cleanup and fixes --- .github/workflows/ci.yml | 27 + README.md | 55 +- REVIEW.md | 151 +++++ pom.xml | 40 +- src/main/java/com/ebremer/beakgraph/BG.java | 14 +- .../beakgraph/cmdline/BeakGraphCLI.java | 54 +- .../beakgraph/cmdline/FileCounter.java | 12 +- .../beakgraph/core/BGDatasetGraph.java | 83 ++- .../com/ebremer/beakgraph/core/BeakGraph.java | 15 +- .../beakgraph/core/EmptyDictionaryWriter.java | 12 +- .../com/ebremer/beakgraph/core/VoidStats.java | 6 +- .../core/fuseki/BGSparqlService.java | 69 ++- .../beakgraph/core/fuseki/BGVoIDSD.java | 6 +- .../core/fuseki/LWSStorageServlet.java | 161 +++++- .../core/fuseki/RelativeIRIResolver.java | 33 +- .../beakgraph/core/fuseki/SPARQLEndPoint.java | 33 +- .../beakgraph/core/lib/NodeComparator.java | 138 ++++- .../com/ebremer/beakgraph/core/lib/Stats.java | 9 +- .../com/ebremer/beakgraph/core/lib/VByte.java | 154 +---- .../beakgraph/features/MajorMinor.java | 216 ++++--- .../beakgraph/features/ShapeAnalysis.java | 31 +- .../features/pyradiomics/Gen2DFeatures.java | 78 ++- .../hdf5/BitPackedUnSignedLongBuffer.java | 87 +-- .../com/ebremer/beakgraph/hdf5/Buffer.java | 70 --- .../com/ebremer/beakgraph/hdf5/Index.java | 236 +------- .../beakgraph/hdf5/jena/BGIteratorMaster.java | 48 +- .../beakgraph/hdf5/jena/BGIteratorOS.java | 20 +- .../hdf5/jena/BGIteratorSPO_All.java | 13 +- .../ebremer/beakgraph/hdf5/jena/BGReader.java | 7 +- .../beakgraph/hdf5/jena/BindingBG.java | 49 +- .../beakgraph/hdf5/jena/BindingNodeId.java | 35 -- .../beakgraph/hdf5/jena/HilbertPolygon.java | 43 +- .../ebremer/beakgraph/hdf5/jena/NumScale.java | 58 -- .../beakgraph/hdf5/jena/PatternMatchBG.java | 87 +-- .../beakgraph/hdf5/jena/QueryEngineBeak.java | 59 -- .../beakgraph/hdf5/jena/SimpleNodeTable.java | 15 +- .../hdf5/jena/SpatialIndexIterator.java | 247 ++++---- .../beakgraph/hdf5/readers/FCDReader.java | 40 +- .../beakgraph/hdf5/readers/HDF5Reader.java | 31 +- .../readers/MultiTypeDictionaryReader.java | 58 +- .../readers/PositionalDictionaryReader.java | 21 +- .../beakgraph/hdf5/writers/BGIndex.java | 13 +- .../beakgraph/hdf5/writers/FCDWriter.java | 10 +- .../beakgraph/hdf5/writers/HDF5Writer.java | 68 ++- .../writers/MultiTypeDictionaryWriter.java | 85 ++- .../writers/PositionalDictionaryWriter.java | 16 +- .../PositionalDictionaryWriterBuilder.java | 288 +++++++--- .../beakgraph/lws/LWSMetadataGenerator.java | 10 +- .../beakgraph/pool/BeakGraphKeyedPool.java | 11 +- .../ebremer/beakgraph/pool/BeakGraphPool.java | 8 +- .../beakgraph/pool/BeakGraphPoolFactory.java | 27 +- .../ebremer/beakgraph/turbo/Intersects.java | 21 +- .../beakgraph/turbo/SineWaveGenerator.java | 41 -- .../beakgraph/utils/HDTBitmapDirectory.java | 53 +- .../com/ebremer/beakgraph/utils/UTIL.java | 86 +-- .../ebremer/halcyon/geometry/Vector2D.java | 19 +- .../ebremer/halcyon/hilbert/HilbertSpace.java | 537 ++---------------- .../halcyon/hilbert/PolygonScaler.java | 122 +++- .../ebremer/halcyon/hilbert/WKTDatatype.java | 50 +- .../com/ebremer/halcyon/hilbert/eRange.java | 74 --- .../com/ebremer/halcyon/hilbert/hNode.java | 11 - .../com/ebremer/halcyon/hilbert/hTools.java | 26 - .../ebremer/halcyon/hilbert/hsPolygon.java | 41 -- .../native-image/resource-config.json | 4 +- .../resources/META-INF/sparql/beakgraph.png | Bin 1616762 -> 0 bytes src/main/resources/log4j2.yml | 9 + .../BGIteratorConcreteSubjectTest.java | 10 +- .../beakgraph/BadPolygonResilienceTest.java | 139 +++++ .../BitPackedUnSignedLongBufferTest.java | 28 + .../beakgraph/DefaultGraphSentinelTest.java | 84 +++ .../ebremer/beakgraph/DualRoleUriTest.java | 10 +- .../FeatureGenerationResilienceTest.java | 97 ++++ .../ebremer/beakgraph/FeatureMathTest.java | 49 ++ .../beakgraph/HilbertSpaceFixesTest.java | 30 + .../beakgraph/InputBindingShapeTest.java | 126 ++++ .../MalformedLiteralRoundTripTest.java | 122 ++++ .../beakgraph/NonExistentBindingTest.java | 10 +- .../beakgraph/PolygonScalerGridCellTest.java | 46 ++ .../beakgraph/QuadFormatIngestionTest.java | 106 ++++ .../beakgraph/SpatialConcreteSubjectTest.java | 133 +++++ .../beakgraph/SpatialFidelityTest.java | 114 ++++ .../SpatialGeometryCollectionTest.java | 94 +++ .../beakgraph/SpatialHugeCoordinateTest.java | 103 ++++ .../SpatialNegativeCoordinateTest.java | 119 ++++ .../SpatialQueryCorrectnessTest.java | 136 +++++ .../beakgraph/TemporalTotalOrderTest.java | 212 +++++++ .../beakgraph/TransactionStateTest.java | 82 +++ .../beakgraph/VariableGraphScanTest.java | 28 + .../beakgraph/WriteErrorHandlingTest.java | 27 + .../cmdline/BeakGraphCLIConversionTest.java | 66 +++ .../beakgraph/cmdline/FileCounterTest.java | 31 + .../ebremer/beakgraph/core/VoidStatsTest.java | 51 ++ .../core/fuseki/LWSStorageServletTest.java | 32 ++ .../core/fuseki/RelativeIRIResolverTest.java | 43 +- .../features/FeatureEdgeCasesTest.java | 101 ++++ .../lws/LWSMetadataGeneratorTest.java | 36 ++ .../pool/BeakGraphPoolValidationTest.java | 47 ++ 97 files changed, 4306 insertions(+), 2257 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 REVIEW.md delete mode 100644 src/main/java/com/ebremer/beakgraph/hdf5/Buffer.java delete mode 100644 src/main/java/com/ebremer/beakgraph/hdf5/jena/NumScale.java delete mode 100644 src/main/java/com/ebremer/beakgraph/hdf5/jena/QueryEngineBeak.java delete mode 100644 src/main/java/com/ebremer/beakgraph/turbo/SineWaveGenerator.java delete mode 100644 src/main/java/com/ebremer/halcyon/hilbert/eRange.java delete mode 100644 src/main/java/com/ebremer/halcyon/hilbert/hNode.java delete mode 100644 src/main/java/com/ebremer/halcyon/hilbert/hTools.java delete mode 100644 src/main/java/com/ebremer/halcyon/hilbert/hsPolygon.java delete mode 100644 src/main/resources/META-INF/sparql/beakgraph.png create mode 100644 src/test/java/com/ebremer/beakgraph/BadPolygonResilienceTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/DefaultGraphSentinelTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/FeatureGenerationResilienceTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/FeatureMathTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/InputBindingShapeTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/MalformedLiteralRoundTripTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/PolygonScalerGridCellTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/QuadFormatIngestionTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/SpatialConcreteSubjectTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/SpatialFidelityTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/SpatialGeometryCollectionTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/SpatialHugeCoordinateTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/SpatialNegativeCoordinateTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/SpatialQueryCorrectnessTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/TemporalTotalOrderTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/TransactionStateTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/cmdline/BeakGraphCLIConversionTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/cmdline/FileCounterTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/core/VoidStatsTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/features/FeatureEdgeCasesTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/lws/LWSMetadataGeneratorTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/pool/BeakGraphPoolValidationTest.java diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..b58355c4 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,27 @@ +# Linux + Windows test matrix. The Linux leg exists deliberately: the LWS +# symlink-escape test (LWSStorageServletTest.resolveWithinRejectsSymlinkEscape) +# auto-skips on Windows without symlink privileges, so Windows-only development +# never exercises that protection. +name: CI + +on: + push: + branches: [ master, next ] + pull_request: + +jobs: + test: + strategy: + fail-fast: false + matrix: + os: [ ubuntu-latest, windows-latest ] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 25 + cache: maven + - name: Build and test + run: mvn -B -Plib clean test diff --git a/README.md b/README.md index 8e9a13ec..be458976 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ alt="BeakGraph" title="BeakGraph"> -Beakgraph is an [Apache Jena](https://jena.apache.org/) Graph Implmentation of [RDF HDT](https://www.rdfhdt.org/) technology pumped into a [HDF5](https://www.hdfgroup.org/solutions/hdf5/) file and extended to support a full RDF Dataset. +BeakGraph is an [Apache Jena](https://jena.apache.org/) Graph implementation of [RDF HDT](https://www.rdfhdt.org/) technology pumped into a [HDF5](https://www.hdfgroup.org/solutions/hdf5/) file and extended to support a full RDF Dataset.
    @@ -30,26 +30,32 @@ Core Library Jar Library mvn -Plib clean package ``` -## Using BreakGraph in your code +## Using BeakGraph in your code ### Creating a BeakGraph from your data -``` -HDF5Writer.Builder() - .setSource(file) - .setSpatial(true) # only needed if GeoSPARQL spatial data is present - .setDestination(dest) + +The source syntax is detected from the file name (Turtle, TriG, N-Quads, +N-Triples; `.gz` compression is handled), so named graphs can be loaded from +quad-capable formats. + +```java +BG.getBGWriterBuilder() + .setSource(new File("mydata.ttl")) + .setDestination(new File("mydata.ttl.h5")) + .setSpatial(true) // only needed if GeoSPARQL spatial data is present + .setFeatures(false) // optional: derive 2D shape features for geometries .build() .write(); ``` ### Using a BeakGraph with Apache Jena -``` - File file = new File("mydata.h5"); - try (BeakGraph bg = BG.getBeakGraph(file)) { - Dataset ds = bg.getDataset(); - ds.getDefaultModel().write(System.out, "NTRIPLE"); - } +```java +File file = new File("mydata.ttl.h5"); +try (BeakGraph bg = BG.getBeakGraph(file)) { + Dataset ds = bg.getDataset(); + ds.getDefaultModel().write(System.out, "NTRIPLE"); +} ``` BeakGraph is a [Apache Jena](https://jena.apache.org/) Graph implementation backed by [HDF5](https://www.hdfgroup.org/solutions/hdf5/). @@ -57,15 +63,28 @@ Beakgraph's HDF5 design is heavily inspired by [RDF HDT](https://www.rdfhdt.org/ ### Limitations -* extremely limited GeoSPARQL support (only sfIntersects) +* BeakGraph files are read-only; the writer builds them in one pass and holds + the working set in RAM (very large datasets may need a correspondingly large + heap). +* GeoSPARQL support covers `geof:sfIntersects` only. It is fully functional: a + recall-safe Hilbert cell-cover index produces candidate geometries and every + candidate is verified with real JTS geometry, so results are exact. Other + GeoSPARQL functions are not implemented. +* `.h5` files written before the spatial-index redesign carry the old + corner-based index entries, which the query side no longer reads - rebuild + them from source for spatial queries (their spatial answers were unsound + anyway; non-spatial queries are unaffected). +* Numeric literals typed `xsd:int`, `xsd:long`, `xsd:float` or `xsd:double` are + stored by value and canonicalized at ingest: `"01"^^xsd:int` is stored - and + matched - as `"1"^^xsd:int`. ### Author's notes The first iteration of BeakGraph was backed by Apache Arrow instead of [HDF5](https://www.hdfgroup.org/solutions/hdf5/). An Apache Arrow version will return. Reasons for this are varied with some of these reasons being just experimentation. -The general idea of BeakGraph is a read-only, searchable, indexed set of binary [sussinct data structures](https://en.wikipedia.org/wiki/Succinct_data_structure) to represent an [RDF Dataset](https://www.w3.org/TR/rdf11-datasets/). -What these sussinct data structures are stored in, is somewhat immaterial, but the choice of container has it's pro and cons. HDF5 treats multi-dimensional arrays as first class citizens, and has a free viewer for -HDF5 files called [HDFView](https://www.hdfgroup.org/download-hdfview/). HDFView providing a nice way to debug the sussinct data structures during development. There are other perks to HDF5 which will become apparent in time. +The general idea of BeakGraph is a read-only, searchable, indexed set of binary [succinct data structures](https://en.wikipedia.org/wiki/Succinct_data_structure) to represent an [RDF Dataset](https://www.w3.org/TR/rdf11-datasets/). +What these succinct data structures are stored in, is somewhat immaterial, but the choice of container has its pros and cons. HDF5 treats multi-dimensional arrays as first class citizens, and has a free viewer for +HDF5 files called [HDFView](https://www.hdfgroup.org/download-hdfview/). HDFView provides a nice way to debug the succinct data structures during development. There are other perks to HDF5 which will become apparent in time. -Support for spatial indexing based on [GeoSPARQL](https://github.com/opengeospatial/ogc-geosparql) is being worked on. +Spatial indexing based on [GeoSPARQL](https://github.com/opengeospatial/ogc-geosparql) is supported for `geof:sfIntersects` (see Limitations above). The full list of containers under consideration are: * [HDF5](https://www.hdfgroup.org/solutions/hdf5/) diff --git a/REVIEW.md b/REVIEW.md new file mode 100644 index 00000000..9087fb42 --- /dev/null +++ b/REVIEW.md @@ -0,0 +1,151 @@ +# BeakGraph code review — full repo + +*Branch `next`, 2026-07-01. Five subsystem deep-reviews (storage/HDF5 I/O, core write pipeline, SPARQL query engine, spatial/Hilbert/geometry, services/pool/CLI) over ~16k LOC; key findings reproduced at runtime and mechanisms re-verified in code. Test suite at review time: 155/155 green (1 skipped). After the fixes below: 211/211 green (1 skipped).* + +**Overall:** the storage core is in genuinely good shape — the bit-packing, rank/select directories, front-coded dictionaries, VByte, and writer↔reader symmetry were traced end-to-end and came back clean. The bugs cluster at the *integration seams*: the comparator contract with Jena's value ordering, the spatial index's variable binding, Jena's `BindingBase` parent invariant, and the HTTP/IRI layer. Two findings are critical; both produce silently wrong query results or failed builds on realistic data. + +## Checklist + +**Critical** +- [x] 1. `NodeComparator` total-order violation (mixed-timezone temporals, durations) +- [x] 2. Constant-subject `sfIntersects` silently returns zero rows + +**High** +- [x] 3. `BindingBG` double-exposure breaks `DISTINCT` +- [x] 4. Negative coordinate space excluded from the spatial index +- [x] 5. Invalid stored geometries unqueryable (`Intersects` throws) +- [x] 6. `absoluteToStorage()` rewrites absolute-stored IRIs into guaranteed misses +- [x] 7. CLI `-src` without `-dest` silently "succeeds" + +**Medium** +- [x] M1. Failed rebuild deletes the previous good artifact +- [x] M2. CRS-prefixed WKT literals get no derived features +- [x] M3. LWS RDF listings emit doubled-slash URIs +- [x] M4. Percent-encoding mismatch 404s encodable filenames +- [x] M5. Link headers/linksets advertise the canonical base, not the live one +- [x] M6. Content negotiation ignores `*/*` (and container POST answered 406) +- [x] M7. `-version`/`-v` prints nothing +- [x] M8. Hilbert-layer external-API traps (`isRangeRelevant`, `getGridCells`) + +**Low** +- [x] L1. `DefaultGraphNode` sentinel collapses with the default-graph sentinel +- [x] L2. Pool never invalidates failed readers; validation checks only `isOpen()` +- [x] L3. Committed-response failures: truncated 200 + double `sendError` ISE +- [x] L4. `SPARQLEndPoint.getDataset()` NPE; `file:///` resolution base leak +- [x] L5. `LWSMetadataGenerator` indexes its own metadata cache +- [x] L6. `SparqlWebPageServlet` classpath lookup lacks dot-segment rejection +- [x] L7. `FileCounter` summary double-subtracts zero-length files +- [x] L8. Feature-math edge cases (thin polygons, INF literals, holed-polygon PCA bias, axis-convention mismatch) +- [x] L9. Mixed `GEOMETRYCOLLECTION` non-polygon members unindexed +- [x] L10. Coordinates ≥ 2³¹ silently alias in the Hilbert curve +- [x] L11. `VoidStats` per-predicate counts overwritten across graph partitions +- [x] L12. RDF-star guard asymmetry (silent dictionary desync landmine) +- [x] L13. `isInTransaction()` unconditionally true +- [x] L14. `BGIteratorSPO_All` ignores a pre-bound graph variable + +**Packaging & design notes** +- [x] P1. Self-contained fat jar by owner decision (verified standalone: convert + serve + query); trade-offs documented +- [x] P2. CI matrix with a Linux leg (symlink-escape test finally runs) +- [x] P3. Dead/misleading API pruned; `FCDWriter` block-size guard +- [x] P4. Large-store performance items (lazy per-graph iterators, graph-id set, negative-lookup caching, compact union dedup key, lazy tiered index) + +## Critical + +- [x] **1. `NodeComparator` is not a total order for mixed timezoned/naive `xsd:dateTime` — breaks every sort and binary search built on it** — `NodeComparator.java:52` + `NodeValue.compareAlways` uses value order when XSD comparison is determinate but falls back to lexical term order when it's *indeterminate* (tz vs no-tz within ±14h). Mixing the two orderings pairwise creates cycles — hand-verified 3-cycle: `"2020-01-02T00:00:00"` < `"2020-01-02T08:00:00+14:00"` < `"2020-01-01T20:00:00Z"` < the first. Reproduced against the built project: a 400-triple file of ordinary mixed local/UTC timestamps **fails to build** (`IllegalStateException: Cannot resolve Object (not in dictionary)`), and on files that do build, binary search missed 2550/3000 stored literals — i.e., **silent missing rows**. Same hazard applies to `xsd:date`/`xsd:time` (also optionally timezoned) and `xsd:duration` (year-month vs day-time indeterminacy). Everything sits on this comparator: `NodeSorter`, `PositionalDictionaryWriter`, the GSPO/GPOS quad sorts and their dedup, `NodeSearch.findPosition`, `searchFAST`, and the `ValueCluster` range pushdown. + *Status: **FIXED** (2026-07-01). Timezone-sensitive temporal spaces (dateTime/date/time/g\*) now order by a UTC-pinned timeline key and durations by (total months, total seconds), both with exact-term tie-breaks; every other value space stays on `compareAlways`, whose cross-space ordering was probe-verified to be a consistent value-space rank. The new order agrees with XSD value order on every determinate pair, so the `ValueCluster` pushdown stays over-inclusive and value-equal terms stay adjacent; healthy existing files keep an identical sort order (no format bump — files with mixed-timezone temporals were already unsearchable and need a rebuild). Regression: `TemporalTotalOrderTest` (comparator totality incl. the reproduced cycles, plus mixed-tz dateTime and mixed-kind duration build/query round-trips — all failing before the fix, the round-trips with the original `Cannot resolve Object` error).* + +- [x] **2. Spatial `sfIntersects` with a constant subject silently returns zero rows** — `PatternMatchBG.java:47-53` + `SpatialIndexIterator.java:76` + When the trigger triple's subject is concrete (`ex:small geo:asWKT ?w FILTER(geof:sfIntersects(?w, …))`), `varToBind` stays the geometry variable, and the spatial iterator binds it to candidate **subject** IDs (`NodeId(id, NodeType.SUBJECT)`). The subsequent pattern solve substitutes the WKT-literal position with a subject URI, which can never match — `ASK` returns false for a geometry that genuinely intersects. Found independently by two reviewers, both runtime-reproduced. + *Status: **FIXED** (2026-07-01). `findTriggerTriple` now only returns a triple with the geometry variable in the object position AND a variable subject, and that subject is the only thing ever seeded (recall-safe for any predicate, since the writer indexes the subject of every wktLiteral-object quad). With a concrete subject the index is skipped and the always-present `sfIntersects` filter verifies — correct, just unaccelerated. This also closes the adjacent latent case where the geometry variable found in a subject/predicate position would have been seeded with subject ids. Regression: `SpatialConcreteSubjectTest` (pinned-subject SELECT/ASK, disjoint negative, VALUES-pre-bound subject, variable-subject control — SELECT/ASK failing before the fix).* + +## High + +- [x] **3. Input bindings are double-exposed through `BindingBG`, breaking `DISTINCT`** — `SolverLibBeak.java:41`, `BindingBG.java:23` + `convert()` copies every var of the incoming binding into the `BindingNodeId` map, and `BindingBG` *also* mounts the original binding as its `BindingBase` parent. Jena assumes a child never re-binds a parent var: `size()` inflates (3 for 2 vars), `vars()` yields duplicates, and `BindingLib.equal` fails on the size mismatch — runtime-reproduced: `SELECT DISTINCT` returned two identical rows. Hits any BGP fed by `VALUES`, `BIND`, subqueries, or joins across graphs. + *Status: **FIXED** (2026-07-01). `BindingBG` now exposes only vars the parent does not bind (`ownVar` filter on `get1/vars1/size1/contains1`); parent-copied vars — including "does not exist" terms — resolve through the parent, which carries the identical term the ids were derived from. Regression: `InputBindingShapeTest` (binding size/vars shape, DISTINCT merge for VALUES and BIND, missing-term ride-through — all failing before the fix).* + +- [x] **4. Negative coordinate space is excluded from the spatial index on both sides** — `SpatialIndexIterator.java:99-104`, writer at `PositionalDictionaryWriterBuilder.java:296-302` + Fully-negative geometries are skipped at build (warning only), straddling geometries are clamped, and query regions with a negative max bail out to zero candidates — probe-verified silent false negatives. The iterator's own recall proof states `0 ≤ coord < 2^31`; fine for slide imagery, but the README advertises GeoSPARQL, where negative lon/lat is most of the planet. + *Status: **FIXED** (2026-07-01). Both sides now clamp bboxes into the non-negative Hilbert domain with the same monotone projection (never skip, never bail): overlap survives the clamp, so recall is preserved — negative-space geometry indexes coarsely at the axis cells and the exact JTS verification removes the clamp's false positives. No format change; old files simply lack the previously-skipped geometries until rebuilt. Regression: `SpatialNegativeCoordinateTest` (negative/straddling regions and geometries, origin-clustering false-positive check — failing before the fix).* + +- [x] **5. Topologically invalid stored geometries are indexed but permanently invisible** — `Intersects.java:74-76` + The verification stage throws on `!isValid()` (Jena drops the row) for exactly the self-intersecting polygons the write path deliberately indexes — `BadPolygonResilienceTest`'s own comment says real pathology data contains them. Probe-verified: a bowtie polygon is never returned by any `sfIntersects` query, with no warning. + *Status: **FIXED** (2026-07-01). Invalid geometries (stored or query region) are repaired with JTS `GeometryFixer.fix` before the intersection test — chosen over `buffer(0)` because it preserves the point set (bowtie → its two triangles) and doesn't discard lines/points. Regression: two new tests in `BadPolygonResilienceTest` (bowtie returned by a query over its real area; invalid query region answers instead of emptying — both failing before the fix).* + +- [x] **6. `absoluteToStorage()` rewrites same-host absolute IRIs into forms the dictionary never contains** — `RelativeIRIResolver.java:68` (applied at `BGSparqlService.java:92`) + Jena's `relativize` happily returns `/other/thing` and `../other.png` (both `isRelative()`), but the writer's storage forms — source-relative IRIs re-relativized against the one-segment sentinel base — can never start with `/` or `../`. So a query naming an absolute same-host IRI that's stored *absolute* gets rewritten into a guaranteed dictionary miss: zero rows while `?s ?p ?o` shows the triple. + *Status: **FIXED** (2026-07-01). `absoluteToStorage` now takes a dictionary-membership probe and rewrites only when the relative form IS stored and the absolute form is NOT (both stored → the exact term the query named wins). `BGSparqlService` supplies the probe from the BG node table (one binary search — deliberately not a per-graph `find()`), via `BGDatasetGraph.getBeakGraph()`; non-BG datasets never rewrite. Regression: `RelativeIRIResolverTest` gained absolute-stored, `../`-form, and both-forms cases; existing relativization tests updated to the probe API.* + +- [x] **7. CLI: `-src` without `-dest` "succeeds" while converting nothing** — `BeakGraphCLI.java:178` + `:126` + `params.dest` is never validated; `FileProcessor.call()` NPEs on `params.dest.toPath()` *before* its try/catch, inside a Future that's discarded at the `engine.submit()` call. Result: no log, no failure count, progress bar advances, summary says "Successful Conversions: N", exit code 0, zero files written. + *Status: **FIXED** (2026-07-01). `main()` refuses `-src` without `-dest` (stderr + usage + exit 1), the missing-src message now also goes to stderr with exit 1, `FileProcessor.call()` counts and logs every failure from the top of the method (nothing escapes into the discarded Future), and a run with failed conversions exits 2. Regression: `BeakGraphCLIConversionTest` (bad source counted while good source still converts; dest-less processing fails loudly into the counter).* + +## Medium + +- [x] **M1. Failed rebuild deletes the previous good artifact** — `HDF5Writer.java:58`. The cleanup deleted the destination even when the failure (parse error, finding #1…) happened before anything was written, destroying a pre-existing valid `.h5`. + *Fixed (2026-07-01): builds go to a sibling `.tmp` file and are atomically moved over the destination only on success; failure cleans up the temp file and never touches the destination, and readers never observe a half-written file at the published path. Regression: `WriteErrorHandlingTest.failedRebuildPreservesThePreviousGoodArtifact` (byte-identical artifact after a failed rebuild; no `.tmp` left behind) — failing before the fix.* +- [x] **M2. CRS-prefixed WKT literals get no derived features** — `PositionalDictionaryWriterBuilder.java:331-336`. `addSpatial` strips the `` prefix (the earlier fix) but `addFeatures` re-read the *unstripped* lexical form; JTS threw, both feature generators skipped. Probe-verified. + *Fixed (2026-07-01): `addFeatures` now receives the CRS-stripped WKT computed once in `addSpatial`. Regression: `FeatureGenerationResilienceTest.crsPrefixedGeometryGetsFeatures` — failing before the fix.* +- [x] **M3. LWS RDF listings emit doubled-slash URIs that 404** — `LWSStorageServlet.java:331` (also 368–388). `BASE` ends with `/` and the canonical remainder starts with `/`; the HTML branch was correct, the machine-readable branches weren't. The paged container's self URI also disagreed in shape with its own `first`/`last`/`prev`/`next` values, which were emitted as plain literals. + *Fixed (2026-07-01): all canonical→live mapping goes through `toLiveUri` (strips the leading slash) — item URIs, per-item property objects, and page URIs; navigation links are now resources with the same URI shape as the page's self URI. Regression: `LWSStorageServletTest.toLiveUriMapsCanonicalUrisWithoutDoubledSlashes`.* +- [x] **M4. Percent-encoding mismatch makes encodable filenames permanently 404** — `LWSStorageServlet.java:243`. Raw `getRequestURI()` was compared against model URIs built from raw filenames — the servlet's own encoded listing links couldn't be followed for `a b.h5`. + *Fixed (2026-07-01): `doGet`/`doPost` decode the raw request URI via `decodePath` (java.net.URI semantics — no `+`→space damage); a malformed URI answers 400. The traversal guard now sees the real decoded path, strengthening it against encoded dot-segments. Regression: `LWSStorageServletTest.decodePathDecodesPercentEncodingAndRejectsGarbage`.* +- [x] **M5. Link headers/linksets advertise the canonical base, not the live one** — `LWSStorageServlet.java:283`. On any non-default port every advertised linkset URI pointed at the wrong server; `/description`'s advertised `.meta` 404'd even on defaults. + *Fixed (2026-07-01): the Link header and the linkset's `anchor`/`up` are mapped to the live base via `toLiveUri`, and `GET /description.meta` is answered directly (the description document is not in the metadata model).* +- [x] **M6. Content negotiation ignores `*/*`** — `LWSStorageServlet.java:287`. `curl` (default `Accept: */*`) got 406 on containers; RFC 9110 requires `*/*` to match. `doPost` also answered 406 where 405 was meant. + *Fixed (2026-07-01): `acceptsHtmlRepresentation` treats `*/*`, `text/*`, and an absent Accept header as HTML-capable; POST to a container answers 405. Regression: `LWSStorageServletTest.wildcardAcceptHeadersGetARepresentationNotA406`.* +- [x] **M7. `-version`/`-v` prints nothing** — `BeakGraphCLI.java:86`. Only reachable inside the `ParameterException` catch; a bare `-v` parsed fine and fell through silently. + *Fixed (2026-07-01): handled on the success path immediately after parse — prints the version and exits 0. Verified by running the CLI (`beakgraph -v` → `beakgraph - Version : 0.15.0`).* +- [x] **M8. Latent external-API traps in the Hilbert layer** — `HilbertPolygon.isRangeRelevant` kept ranges only if the polygon covers the endpoint cell *corner points* (a sub-cell polygon produced an EMPTY cover; diagonal strips lost interior cells), and `PolygonScaler.getGridCells` double-applied the scale factor, disagreeing with the writer-persisted tiles for every s≥1. Neither is on the in-repo query path, but both are the public Polygon→Hilbert API surface. + *Fixed (2026-07-01): `isRangeRelevant` now tests whole-cell intersection across the range's cells (capped at 64 cells; longer ranges are kept unexamined — superset-safe), and `getGridCells` uses the constant `GRIDTILESIZE` on the already-scaled polygon, matching the writer's `generateGridURNs` grid exactly. Regressions: `HilbertSpaceFixesTest` (sub-cell polygon cover, interior-overlap range) and `PolygonScalerGridCellTest` — all failing before the fix.* + +## Low + +- [x] **L1.** `urn:x-arq:DefaultGraphNode` as a data term compares equal to the default-graph sentinel → two distinct terms collapse in the dictionary (`NodeComparator.java:30,83-86`). + *Fixed (2026-07-01): both sentinels still rank first, but the pair is now ordered by exact term (null ≡ the default-graph IRI, which keeps the lowest rank). Regression: `DefaultGraphSentinelTest` (comparator distinctness + sentinel-URI-as-data round-trip) — failing before the fix.* +- [x] **L2.** Pool never `invalidateObject`s after a failure and `validateObject` only checks `isOpen()` (`LWSStorageServlet.java:93`, `BeakGraphPoolFactory.java:47`). + *Fixed (2026-07-01): `handleSparqlQuery` invalidates on any execution/infrastructure failure (via `BGSparqlService.execute`'s new health signal), and `validateObject` probes real mapped data (one dictionary `extract`) under the existing `testOnBorrow`, so an open-but-broken reader is culled on next borrow. Regression: `BeakGraphPoolValidationTest` (pins probe wiring; the open-but-broken scenario isn't portably reproducible on Windows).* +- [x] **L3.** Committed-response error handling: mid-stream failure yields a complete-looking truncated 200, then two `sendError` calls throw `IllegalStateException` (`BGSparqlService.java:132`). + *Fixed (2026-07-01): `execute` throws `QueryExecutionFailedException` when the response is already committed; callers invalidate the reader, touch the response only when uncommitted, and let the exception propagate so the container aborts the connection — the honest signal for a truncated transfer. No servlet-mock harness exists, so this is code-reviewed rather than test-pinned.* +- [x] **L4.** `SPARQLEndPoint.getDataset()` NPEs in single-file mode; single-file `/rdf` uses the local file URI as resolution base, disclosing `file:///…` paths (`SPARQLEndPoint.java:155,134`). + *Fixed (2026-07-01): the endpoint holds its Dataset directly (no registry lookup), and the `/rdf` servlet resolves against the served URL (`BASE_URL + "rdf"`). Requires a running server to test; code-reviewed.* +- [x] **L5.** Re-running `LWSMetadataGenerator` indexes its own previous `beakgraph.ttl.gz`, exposing the raw metadata with `owl:sameAs ` paths (`LWSMetadataGenerator.java:71`). + *Fixed (2026-07-01): the walk skips `CACHE_FILE_NAME`. Regression: `LWSMetadataGeneratorTest` — failing before the fix.* +- [x] **L6.** `SparqlWebPageServlet` concatenates decoded `pathInfo` into classpath lookups with no dot-segment rejection (`SPARQLEndPoint.java:203`). + *Fixed (2026-07-01): paths containing `..` or `\` answer 404 before touching the classpath — containment no longer depends on Jetty compliance defaults. Private servlet, no harness; code-reviewed.* +- [x] **L7.** `FileCounter` summary math double-subtracts zero-length files (can print negative "Successful Conversions") (`FileCounter.java:74`). + *Fixed (2026-07-01): `getSuccessfulConversionCount()` = RDF − failed (empties never entered the RDF count). Regression: `FileCounterTest`.* +- [x] **L8.** Feature-math edge cases: sub-0.5-unit polygons lost ALL features (`ShapeAnalysis.java:234`); zero-area geometry emitted `"INF"^^xsd:double` literals (`ShapeAnalysis.java:98`); holed polygons biased the PCA centroid/axes (`MajorMinor.java:31`); drawn axis (2·σ vertex cloud) disagreed with `PYR.MajorAxisLength` (4·σ pixel cloud). + *Fixed (2026-07-01): raster dimensions come from the internal envelope clamped to ≥1px (degenerate envelopes no longer throw); non-finite feature values are skipped per-feature; `MajorMinor` now computes exact polygon AREA moments (Green's theorem, shell minus holes) with the pyradiomics 4·√λ axis convention — the same definition the raster feature uses. Regression: `FeatureEdgeCasesTest` (thin polygon, bowtie INF, donut centroid — the pre-fix bias reproduced exactly as POINT(1.7778 1.7778) — and the axis convention).* +- [x] **L9.** Mixed `GEOMETRYCOLLECTION`: non-polygon members unindexed when any polygon part exists (`PositionalDictionaryWriterBuilder.java:238`). + *Fixed (2026-07-01): every non-polygonal member gets its expanded-envelope stand-in, per member instead of only as a no-polygon fallback. Regression: `SpatialGeometryCollectionTest` — point-member query failing before the fix.* +- [x] **L10.** Coordinates ≥ 2³¹ silently alias (the Hilbert curve masks to 31 bits, no guard) (`HilbertSpace.java:31`). + *Fixed (2026-07-01): `HilbertSpace.clampToDomain` clamps into [0, 2³¹) on the writer, query, and `Polygon2Hilbert` sides — the same monotone-projection recall argument as the negative-space fix, and no more reliance on the library's undefined masking. Regression: `SpatialHugeCoordinateTest` (pins the defined behavior; the old masking happened to alias consistently in this scenario).* +- [x] **L11.** `VoidStats` per-predicate counts overwritten (not summed) across graph partitions (`VoidStats.java:84`). + *Fixed (2026-07-01): `merge(…, Long::sum)`. Regression: `VoidStatsTest` — 2-vs-5 failing before the fix.* +- [x] **L12.** Guard asymmetry landmine: an RDF-star triple term in the subject path desynchronizes the dictionary silently (`MultiTypeDictionaryWriter.java:190`, builder `:494`). + *Fixed (2026-07-01): the subject branch and `addNodeInternal` now throw like the graph/object branches. Unreachable via current parsers (that's the point of the guard); code-reviewed.* +- [x] **L13.** `isInTransaction()` unconditionally returns true (`BGDatasetGraph.java:253`). + *Fixed (2026-07-01): transaction lifecycle delegates to Jena's `TransactionalLock` (MRSW) — real per-thread state; write transactions still rejected. Regression: `TransactionStateTest` (lifecycle, `Txn.executeRead`, WRITE rejection) — all three failing before the fix.* +- [x] **L14.** `BGIteratorSPO_All` ignores a graph variable pre-bound in the `BindingNodeId` (`BGIteratorSPO_All.java:62`). + *Fixed (2026-07-01): resolves the graph from the binding exactly like the other three iterators behind the dispatcher. Regression: new case in `VariableGraphScanTest` — 0-vs-20 rows failing before the fix.* + +## Packaging & design notes + +- [x] **P1.** The default `lib` profile **shades all dependencies unrelocated into the main artifact** and embeds `log4j2.yml` at the classpath root — duplicate-class conflicts and logging hijack for library consumers. + *Resolved by owner decision (2026-07-01): the BeakGraph jar is DELIBERATELY self-contained — one jar that runs with nothing else on the classpath. The `lib` profile keeps its fat, executable jar (dependencies, `log4j2.yml`, SPARQL web UI, merged service files, Main-Class). Verified end-to-end with the bare artifact from a neutral directory: `-v`, a spatial TTL→HDF5 conversion, and a booted `-endpoint` answering an HTTP SPARQL query. Retained hygiene: the log4j backend + YAML-config Jackson modules stay `optional` in the POM (accurate — main code logs only through slf4j; shade still embeds them). Accepted residual trade-off, documented in the POM: a consumer that ALSO brings its own Jena/JTS sees duplicate unrelocated classes, and the embedded `log4j2.yml` takes over that application's logging. Operational note: package profiles with `clean` (as the README shows) — switching profiles over a stale `target/` can reuse the other profile's jar.* +- [x] **P2.** The LWS symlink-escape test auto-skips on Windows, so that protection is never exercised on this dev machine. + *Fixed (2026-07-01): `.github/workflows/ci.yml` runs `mvn -Plib clean test` on an ubuntu-latest + windows-latest matrix (Temurin 25, Maven cache). The Linux leg exercises the symlink test; the workflow itself needs a push to GitHub to be exercised.* +- [x] **P3.** Dead/misleading API pruned: `eRange` deleted (zero callers; its `join()` was a hull with no overlap precondition); `HDTBitmapDirectory.getId(rank)` (indexed by row, not rank), `rank1`, and `getBitCount` deleted (no callers); `UTIL.getBytes` (matched a nonexistent class name), `subBuffer`, `skipNullTerminatedStrings`, `readNullTerminatedString` deleted (no callers); `BindingNodeId.putAll` deleted (would have thrown if ever used); `FCDWriter` now rejects `blockSize < 2` at construction instead of writing an unreadable dictionary. +- [x] **P4.** Performance items for large stores, all addressed (2026-07-01): + - `containsGraph`/`isGraph` answers from a lazily-built id set instead of decoding the whole columnar graphs list per call; + - negative node-table lookups are cached (the store is immutable, so absence is permanent — a repeated foreign-term miss no longer re-runs two binary searches); + - `readUnion` chains per-graph iterators lazily and dedups on a record of three primitive longs instead of a boxed `List` (the set itself is inherent to union set-semantics); + - the unbound-graph scan (`BGIteratorMaster`), `find(ANY,…)`, and `findNG(ANY,…)` build each graph's sub-iterator lazily as iteration reaches it, and the master scan pre-binds the graph id from the columnar list (no `extract→locate` round trip; the rare `?g`-in-predicate shape keeps the substitution+compatibility-filter path because predicate ids live in an isolated id-space); + - the dictionary's tiered search index builds lazily on first search (volatile-published, race-benign) instead of doing `numEntries/1024` full extracts at every file-open. + *All behavior pinned by the existing suite (union/DISTINCT/variable-graph-scan/concurrent-read/reader-lifecycle tests) — 211/211 green after the changes.* + +## Verified sound + +Worth stating, since it's most of the risk surface: MSB-first bit-packing round-trips at all edge widths, the rank/select directory math (pinned exhaustively by `RankSelectDirectoryTest`), FCD front-coding including UTF-16 prefix handling and surrogate back-off, VByte, the L0 padding/select1 addressing scheme, the index-selection matrix across all four iterators, repeated-variable handling via `putCompatible`, `ValueCluster` pushdown (over-inclusive only, filter always re-applied), reader thread-safety (absolute-position reads, immutable dictionaries), pool borrow/return discipline at the single borrow site, and HDF5 resource cleanup on error paths. diff --git a/pom.xml b/pom.xml index 2fc8bc46..a4dfb6c4 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,11 @@ 4.5.0 - 3.0.0-beta2 + + 2.25.2 2.0.17 0.10.0 3.0 @@ -139,11 +143,6 @@ jackson-databind 2.21.1 - - org.apache.logging.log4j - log4j-config-yaml - ${log4j.version} - io.airlift aircompressor-v3 @@ -191,7 +190,7 @@ maven-compiler-plugin ${maven-compiler-plugin.version} - 25 + ${java.version} true ${java.home}/bin/javac @@ -215,6 +214,12 @@ BeakGraph-${project.version} + org.apache.maven.plugins maven-shade-plugin @@ -303,9 +308,15 @@ --no-fallback --enable-url-protocols=https -H:+AddAllCharsets + -march=native -J-Xmx32G -H:IncludeResources=META-INF/sparql/.* + -H:IncludeResources=beakgraph.png + -H:IncludeResources=beakgraph-version.properties -H:IncludeResources=log4j2.yml -H:IncludeResources=META-INF/services/.* -H:IncludeResourceBundles=org.apache.jena.ext.xerces.impl.msg.XMLSchemaMessages @@ -375,17 +386,19 @@ org.ejml ejml-simple + com.fasterxml.jackson.dataformat jackson-dataformat-yaml + true com.fasterxml.jackson.core jackson-databind - - - org.apache.logging.log4j - log4j-config-yaml + true me.tongfei @@ -421,10 +434,12 @@ org.apache.logging.log4j log4j-api + true org.apache.logging.log4j log4j-core + true org.slf4j @@ -433,6 +448,7 @@ org.apache.logging.log4j log4j-slf4j2-impl + true io.jhdf @@ -447,10 +463,12 @@ org.apache.logging.log4j log4j-layout-template-json + true org.apache.logging.log4j log4j-1.2-api + true com.github.davidmoten diff --git a/src/main/java/com/ebremer/beakgraph/BG.java b/src/main/java/com/ebremer/beakgraph/BG.java index 761ab2cb..274f1487 100644 --- a/src/main/java/com/ebremer/beakgraph/BG.java +++ b/src/main/java/com/ebremer/beakgraph/BG.java @@ -19,11 +19,17 @@ public static HDF5Writer.Builder getBGWriterBuilder() { public static BeakGraph getBeakGraph(File file) throws IOException { HDF5Reader reader = new HDF5Reader(file); - return new BeakGraph(reader); + try { + return new BeakGraph(reader); + } catch (RuntimeException | Error e) { + // The reader pins the mapped file; if BeakGraph construction fails it + // must be released here or nobody ever can. + try { reader.close(); } catch (Exception ignore) {} + throw e; + } } - + public static BeakGraph getBeakGraph(Path path) throws IOException { - HDF5Reader reader = new HDF5Reader(path); - return new BeakGraph(reader); + return getBeakGraph(path.toFile()); } } diff --git a/src/main/java/com/ebremer/beakgraph/cmdline/BeakGraphCLI.java b/src/main/java/com/ebremer/beakgraph/cmdline/BeakGraphCLI.java index fbac92b8..3f48763d 100644 --- a/src/main/java/com/ebremer/beakgraph/cmdline/BeakGraphCLI.java +++ b/src/main/java/com/ebremer/beakgraph/cmdline/BeakGraphCLI.java @@ -35,6 +35,11 @@ public class BeakGraphCLI { private final FileCounter fc; private Parameters params; + /** Conversion counters for this run (failed conversions drive the exit code). */ + public FileCounter getFileCounter() { + return fc; + } + public BeakGraphCLI(Parameters params) { JenaSystem.init(); this.params = params; @@ -58,6 +63,13 @@ public static void main(String[] args) throws FileNotFoundException, IOException if (args.length != 0) { try { jc.parse(args); + if (params.version) { + // Must be handled on the SUCCESS path: version was previously + // printed only inside the ParameterException catch, so a plain + // "-v" parsed fine, matched no branch, and printed nothing. + System.out.println("beakgraph - Version : " + Params.VERSION); + System.exit(0); + } if (params.help) { jc.usage(); System.exit(0); @@ -76,18 +88,34 @@ public static void main(String[] args) throws FileNotFoundException, IOException Thread.currentThread().interrupt(); } } else if (params.src != null && params.src.exists()) { + if (params.dest == null) { + // Without this guard every FileProcessor NPEs inside a + // discarded Future: nothing converts, nothing is logged, + // and the run exits 0 reporting success. + System.err.println("Error: -dest is required with -src"); + jc.usage(); + System.exit(1); + } JenaSystem.init(); BeakGraphCLI bg = new BeakGraphCLI(params); bg.traverse(); + if (bg.fc.getFailedConversionFileCount() > 0) { + System.exit(2); + } } else if (params.src != null) { - System.out.println("Source does not exist! " + params.src); + System.err.println("Error: -src does not exist: " + params.src); + System.exit(1); } } } catch (ParameterException ex) { if (params.version) { System.out.println("beakgraph - Version : " + Params.VERSION); } else { - System.out.println(ex.getMessage()); + // Bad arguments are an error: say so on stderr and exit non-zero + // (scripts used to see a successful exit 0 for a failed run). + System.err.println(ex.getMessage()); + jc.usage(); + System.exit(1); } } } @@ -130,6 +158,9 @@ public void traverse() { try { Thread.sleep(1000); } catch (InterruptedException ex) { + // Restore the flag and stop polling; the executor keeps draining. + Thread.currentThread().interrupt(); + break; } } } catch (IOException ex) { @@ -168,23 +199,26 @@ public FileProcessor(Path src, FileCounter fc) { @Override public Model call() { - Path dest = mapToDestinationWithNewExtension(src, params.src.toPath(), params.dest.toPath(), "h5"); - if (dest.toFile().exists() && dest.toFile().length() > 0) { - return null; - } - dest.getParent().toFile().mkdirs(); + // The Future from engine.submit() is never inspected, so anything + // escaping this method is swallowed silently by FutureTask and the + // file still counts as a success. EVERYTHING - including destination + // mapping - must be counted and logged inside this catch. try { + Path dest = mapToDestinationWithNewExtension(src, params.src.toPath(), params.dest.toPath(), "h5"); + if (dest.toFile().exists() && dest.toFile().length() > 0) { + return null; + } + dest.getParent().toFile().mkdirs(); HDF5Writer.Builder() .setSource(src.toFile()) .setDestination(dest.toFile()) .setSpatial(params.spatial) - .setFeatures(params.features) + .setFeatures(params.features) .build() .write(); } catch (Exception ex) { fc.incrementFailedConversionFileCount(); - logger.error("Failed to convert {} -> {}", src, dest, ex); - throw new RuntimeException("Failed to convert " + src + " -> " + dest, ex); + logger.error("Failed to convert {}", src, ex); } return null; } diff --git a/src/main/java/com/ebremer/beakgraph/cmdline/FileCounter.java b/src/main/java/com/ebremer/beakgraph/cmdline/FileCounter.java index 8418806d..140a9252 100644 --- a/src/main/java/com/ebremer/beakgraph/cmdline/FileCounter.java +++ b/src/main/java/com/ebremer/beakgraph/cmdline/FileCounter.java @@ -49,6 +49,16 @@ public long getFailedConversionFileCount() { return failedConversionFileCount.get(); } + /** + * RDF files that converted (or already had a non-empty destination). + * Zero-length files are NOT subtracted here: the traverse filter rejects + * them before they are ever counted as RDF files, so subtracting them + * again understated the summary and could drive it negative. + */ + public long getSuccessfulConversionCount() { + return getRDFFileCount() - getFailedConversionFileCount(); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); @@ -71,7 +81,7 @@ public String toString() { """, getZeroFileCount(), getFailedConversionFileCount(), - getRDFFileCount()-getZeroFileCount()-getFailedConversionFileCount() + getSuccessfulConversionCount() )); return sb.toString(); } diff --git a/src/main/java/com/ebremer/beakgraph/core/BGDatasetGraph.java b/src/main/java/com/ebremer/beakgraph/core/BGDatasetGraph.java index ad4d6b8d..11a7229e 100644 --- a/src/main/java/com/ebremer/beakgraph/core/BGDatasetGraph.java +++ b/src/main/java/com/ebremer/beakgraph/core/BGDatasetGraph.java @@ -2,42 +2,42 @@ import com.ebremer.beakgraph.hdf5.jena.BindingNodeId; import com.ebremer.beakgraph.hdf5.jena.OpExecutorBG; -import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; -import org.apache.commons.collections4.iterators.IteratorChain; import org.apache.jena.graph.Graph; import org.apache.jena.graph.Node; import org.apache.jena.graph.Triple; -import org.apache.jena.query.DatasetFactory; import org.apache.jena.query.ReadWrite; import org.apache.jena.query.TxnType; import org.apache.jena.riot.system.PrefixMap; +import org.apache.jena.riot.system.PrefixMapFactory; import org.apache.jena.sparql.core.DatasetGraphBase; import org.apache.jena.sparql.core.Quad; +import org.apache.jena.sparql.core.Transactional; +import org.apache.jena.sparql.core.TransactionalLock; import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.engine.main.QC; import org.apache.jena.sparql.pfunction.PropertyFunctionRegistry; import org.apache.jena.sparql.util.Context; import org.apache.jena.util.iterator.WrappedIterator; import org.apache.jena.vocabulary.RDFS; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * * @author erich */ public class BGDatasetGraph extends DatasetGraphBase { - private static final Logger logger = LoggerFactory.getLogger(BGDatasetGraph.class); private final BeakGraph bg; // Per-dataset execution wiring (the TDB pattern): the engine merges this context // over the global ARQ context when a query runs against this dataset, so BG's // OpExecutor and property-function scoping apply here and ONLY here - never to // other datasets in the JVM. private final Context context = Context.create(); + // Tracks per-thread read-transaction lifecycle (begin/commit/abort/end pairing); + // the store is immutable, so the lock only provides honest bookkeeping. + private final Transactional txn = TransactionalLock.createMRSW(); /** * The standard property-function registry minus rdfs:member. BG stores use @@ -85,13 +85,9 @@ public Graph getDefaultGraph() { } @Override - public Graph getGraph(Node node) { - try { - return new BeakGraph(node, bg.getReader()); - } catch (IOException ex) { - logger.error("Failed to open named graph {}", node, ex); - } - return Graph.emptyGraph; + public Graph getGraph(Node node) { + // A non-owning view over the shared reader (closing it is a no-op). + return new BeakGraph(node, bg.getReader()); } @Override @@ -143,12 +139,9 @@ public Iterator findNG(Node g, Node s, Node p, Node o) { return findInSpecificGraph(g, s, p, o); // read() handles the union semantics } if (g == null || Node.ANY.equals(g)) { - List> iterators = new ArrayList<>(); - Iterator graphs = listGraphNodes(); - while (graphs.hasNext()) { - iterators.add(findInSpecificGraph(graphs.next(), s, p, o)); - } - return new IteratorChain<>(iterators); + // Lazy per-graph chaining - see findInAnyGraph. + return org.apache.jena.atlas.iterator.Iter.flatMap(listGraphNodes(), + gn -> findInSpecificGraph(gn, s, p, o)); } if (Quad.isDefaultGraph(g)) { return Collections.emptyIterator(); @@ -182,28 +175,25 @@ private Iterator findInSpecificGraph(Node g, Node s, Node p, Node o) { } private Iterator findInAnyGraph(Node s, Node p, Node o) { - // 1. Default Graph - Iterator defaultGraphIter = findInSpecificGraph(Quad.defaultGraphIRI, s, p, o); - - // 2. All Named Graphs - Iterator graphs = listGraphNodes(); - List> iterators = new ArrayList<>(); - iterators.add(defaultGraphIter); - - while(graphs.hasNext()) { - Node graphNode = graphs.next(); - // Skip default if it appears in the list to avoid duplicates - if (!graphNode.equals(Quad.defaultGraphIRI)) { - iterators.add(findInSpecificGraph(graphNode, s, p, o)); - } - } - - return new IteratorChain<>(iterators); + // Lazily chain the default graph and every named graph: constructing + // each graph's iterator up front paid its index searches before the + // first quad came back, and spatial stores hold thousands of tile + // graphs. Skip default if it appears in the graph list (duplicates). + Iterator graphs = org.apache.jena.atlas.iterator.Iter.concat( + List.of(Quad.defaultGraphIRI).iterator(), + org.apache.jena.atlas.iterator.Iter.filter(listGraphNodes(), + gn -> !gn.equals(Quad.defaultGraphIRI))); + return org.apache.jena.atlas.iterator.Iter.flatMap(graphs, gn -> findInSpecificGraph(gn, s, p, o)); } + // One mutable prefix map per dataset: the old implementation built a whole + // fresh in-memory dataset on EVERY call and returned its (disconnected) + // prefixes, so registrations silently vanished between calls. + private final PrefixMap prefixMap = PrefixMapFactory.create(); + @Override public PrefixMap prefixes() { - return DatasetFactory.createGeneral().asDatasetGraph().prefixes(); + return prefixMap; } // --- Minimal Transaction Support (Read-Only) --- @@ -216,11 +206,13 @@ public boolean supportsTransactions() { @Override public void begin(TxnType type) { if (type == TxnType.WRITE) throw new UnsupportedOperationException("Write transactions not supported"); + txn.begin(type); } @Override public void begin(ReadWrite readWrite) { if (readWrite == ReadWrite.WRITE) throw new UnsupportedOperationException("Write transactions not supported"); + txn.begin(readWrite); } @Override @@ -230,32 +222,35 @@ public boolean promote(Promote mode) { @Override public void commit() { - // No-op for read-only + txn.commit(); } @Override public void abort() { - // No-op for read-only + txn.abort(); } @Override public void end() { - // No-op for read-only + txn.end(); } @Override public ReadWrite transactionMode() { - return ReadWrite.READ; + return txn.transactionMode(); } @Override public TxnType transactionType() { - return TxnType.READ; + return txn.transactionType(); } @Override public boolean isInTransaction() { - // Always behave as if in a transaction or allow access - return true; + // Real per-thread state, not an unconditional "true": lying that a + // transaction is always active masked mispaired begin/end in callers. + // The data itself is immutable, so reads need no lock protection - the + // delegate exists purely to track lifecycle honestly. + return txn.isInTransaction(); } } diff --git a/src/main/java/com/ebremer/beakgraph/core/BeakGraph.java b/src/main/java/com/ebremer/beakgraph/core/BeakGraph.java index 713e98fa..11b8aa12 100644 --- a/src/main/java/com/ebremer/beakgraph/core/BeakGraph.java +++ b/src/main/java/com/ebremer/beakgraph/core/BeakGraph.java @@ -3,7 +3,6 @@ import com.ebremer.beakgraph.hdf5.jena.BGReader; import com.ebremer.beakgraph.hdf5.jena.StageGeneratorDirectorBG; import com.ebremer.beakgraph.turbo.Spatial; -import java.io.IOException; import java.net.URI; import java.util.stream.Stream; import org.apache.jena.graph.Node; @@ -51,11 +50,11 @@ public class BeakGraph extends GraphBase implements AutoCloseable { Spatial.init(); } - public BeakGraph(BGReader reader, URI uri) throws IOException { + public BeakGraph(BGReader reader, URI uri) { this(reader, uri, uri); } - - public BeakGraph(BGReader reader, URI uri, URI base) throws IOException { + + public BeakGraph(BGReader reader, URI uri, URI base) { logger.trace("BeakGraph -> {}", uri.toString()); init(); this.uri = uri; @@ -64,7 +63,7 @@ public BeakGraph(BGReader reader, URI uri, URI base) throws IOException { this.ownsReader = true; } - public BeakGraph(BGReader reader) throws IOException { + public BeakGraph(BGReader reader) { this( reader, reader.getURI(), null); } @@ -72,7 +71,7 @@ public URI getURI() { return uri; } - public BeakGraph(Node namedgraph, BGReader reader) throws IOException { + public BeakGraph(Node namedgraph, BGReader reader) { logger.trace("Create a SubBeakGraph -> {}", namedgraph); init(); this.uri = reader.getURI(); @@ -89,7 +88,6 @@ private static void init() { if ( initialized ) { return ; } - initialized = true ; // The OpExecutor factory is wired per-dataset (BGDatasetGraph's own // context), NOT into the global ARQ context: a global factory would // change query execution for every other dataset in the JVM. Only the @@ -97,6 +95,9 @@ private static void init() { // because it dispatches on the active graph's type and delegates // everything that is not a BeakGraph. wireIntoExecution() ; + // Publish only after wiring succeeded, so a failure here is retried by + // the next caller instead of leaving the JVM half-wired forever. + initialized = true ; } } diff --git a/src/main/java/com/ebremer/beakgraph/core/EmptyDictionaryWriter.java b/src/main/java/com/ebremer/beakgraph/core/EmptyDictionaryWriter.java index 99ac1f7a..5bd28e0e 100644 --- a/src/main/java/com/ebremer/beakgraph/core/EmptyDictionaryWriter.java +++ b/src/main/java/com/ebremer/beakgraph/core/EmptyDictionaryWriter.java @@ -1,6 +1,5 @@ package com.ebremer.beakgraph.core; -import com.ebremer.beakgraph.core.AbstractDictionary; import io.jhdf.api.WritableGroup; import java.util.ArrayList; import java.util.List; @@ -8,6 +7,9 @@ import org.apache.jena.graph.Node; /** + * Null-object dictionary for a section with no entries (e.g. a source with no + * literals). Every operation answers honestly for an empty dictionary instead + * of throwing template "Not supported yet." exceptions. * * @author Erich Bremer */ @@ -33,16 +35,18 @@ public long locate(Node element) { @Override public Node extract(long id) { - throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + throw new IllegalArgumentException("id [" + id + "]: empty dictionary has no entries"); } @Override public Stream streamNodes() { - throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + return Stream.empty(); } @Override public long search(Node element) { - throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + // Nothing matches; the insertion point in an empty 1-based dictionary is 1, + // encoded -(insertion)-1 per the search contract. + return -2; } } diff --git a/src/main/java/com/ebremer/beakgraph/core/VoidStats.java b/src/main/java/com/ebremer/beakgraph/core/VoidStats.java index 1b688de8..395dc63e 100644 --- a/src/main/java/com/ebremer/beakgraph/core/VoidStats.java +++ b/src/main/java/com/ebremer/beakgraph/core/VoidStats.java @@ -81,7 +81,11 @@ static VoidStats load(BGReader reader) { for (Map.Entry e : partitionPredicate.entrySet()) { Long n = resourceTriples.get(e.getKey()); if (n != null) { - predicateCount.put(e.getValue(), n); + // One partition per (graph, predicate) pair: the same predicate can + // appear in several graph descriptions, so counts must SUM. A plain + // put kept whichever partition iteration visited last, feeding the + // reorder cost model a per-graph count against a dataset-wide total. + predicateCount.merge(e.getValue(), n, Long::sum); total += n; } } diff --git a/src/main/java/com/ebremer/beakgraph/core/fuseki/BGSparqlService.java b/src/main/java/com/ebremer/beakgraph/core/fuseki/BGSparqlService.java index 4dc2af51..9490fc28 100644 --- a/src/main/java/com/ebremer/beakgraph/core/fuseki/BGSparqlService.java +++ b/src/main/java/com/ebremer/beakgraph/core/fuseki/BGSparqlService.java @@ -1,11 +1,16 @@ package com.ebremer.beakgraph.core.fuseki; +import com.ebremer.beakgraph.core.BGDatasetGraph; +import com.ebremer.beakgraph.core.NodeTable; +import com.ebremer.beakgraph.hdf5.jena.NodeId; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; +import org.apache.jena.graph.Node; import org.apache.jena.query.Dataset; import org.apache.jena.query.Query; import org.apache.jena.query.QueryExecution; @@ -30,6 +35,8 @@ */ public final class BGSparqlService { + private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(BGSparqlService.class); + /** Maximum accepted SPARQL request body. Real queries are tiny; an unbounded * readAllBytes lets a single request allocate arbitrary heap. */ static final int MAX_QUERY_BODY_BYTES = 1 << 20; // 1 MiB @@ -44,6 +51,21 @@ public static final class QueryBodyTooLargeException extends IOException { } } + /** + * Thrown when execution failed AFTER the response was committed: a 200 and + * part of the body are already on the wire, so the only honest signal left + * is an aborted transfer. Callers must NOT touch the response again (a + * sendError would throw IllegalStateException) and should let this + * propagate so the container closes the connection without completing the + * response - a client then sees a truncated transfer instead of a + * complete-looking 200 with silently missing rows. + */ + public static final class QueryExecutionFailedException extends IOException { + QueryExecutionFailedException(String message, Throwable cause) { + super(message, cause); + } + } + private BGSparqlService() { } @@ -73,12 +95,36 @@ static String readBody(InputStream in, int max) throws IOException { return new String(body, StandardCharsets.UTF_8); } + /** + * Dictionary-membership probe backing the relativization rewrite decision. + * BG datasets answer from the node table (a binary search - deliberately + * NOT a find() over the dataset, which fans out across every named graph). + * Any other dataset has no relative-stored IRIs, so nothing is rewritten. + */ + private static Predicate storedTermProbe(Dataset ds) { + if (ds.asDatasetGraph() instanceof BGDatasetGraph bgd) { + NodeTable nodeTable = bgd.getBeakGraph().getReader().getNodeTable(); + return n -> { + NodeId id = nodeTable.getNodeIdForNode(n); + return id != null && !NodeId.isDoesNotExist(id); + }; + } + return n -> false; + } + /** * Execute {@code queryStr} against {@code ds} and serialize the result, * resolving relative IRIs against {@code baseURI} (the URL/URI the data is - * served from). On any failure an HTTP 400 is written. + * served from). Client-side problems (parse errors, unsupported query + * types) are answered with 400 and still return true - the reader is fine. + * + * @return true when the underlying reader behaved; false when execution + * failed (a 500 was written) - pooled callers should invalidate + * their instance rather than return it. + * @throws QueryExecutionFailedException when execution failed after the + * response was committed (see that exception's contract) */ - public static void execute(Dataset ds, String queryStr, String baseURI, + public static boolean execute(Dataset ds, String queryStr, String baseURI, String acceptHeader, HttpServletResponse resp) throws IOException { String accept = (acceptHeader == null) ? "" : acceptHeader.toLowerCase(); try { @@ -87,7 +133,7 @@ public static void execute(Dataset ds, String queryStr, String baseURI, // Relativize document IRIs the query names so they match the // dictionary. Skip the whole-query walk when there is no base. Query execQuery = resolver.isActive() - ? QueryTransformOps.transform(query, resolver.absoluteToStorage()) + ? QueryTransformOps.transform(query, resolver.absoluteToStorage(storedTermProbe(ds))) : query; try (QueryExecution qexec = QueryExecution.dataset(ds).query(execQuery) .timeout(QUERY_TIMEOUT_SECONDS, TimeUnit.SECONDS).build()) { @@ -124,8 +170,23 @@ public static void execute(Dataset ds, String queryStr, String baseURI, resp.sendError(400, "Unsupported SPARQL query type"); } } + return true; + } catch (org.apache.jena.query.QueryParseException ex) { + // The client's own query text is at fault; the parse message is theirs. + resp.sendError(400, "Query parse error: " + ex.getMessage()); + return true; } catch (Exception ex) { - resp.sendError(400, "Query error: " + ex.getMessage()); + // Internal failure: log the details server-side, but do not echo + // exception internals (paths, class names, state) back to the client. + logger.error("SPARQL query execution failed", ex); + if (resp.isCommitted()) { + // Partial 200 body already flushed: sendError would throw + // IllegalStateException. Rethrow so the container aborts the + // connection - the honest signal for a truncated result. + throw new QueryExecutionFailedException("Query failed after the response was committed", ex); + } + resp.sendError(500, "Query execution failed"); + return false; } } } diff --git a/src/main/java/com/ebremer/beakgraph/core/fuseki/BGVoIDSD.java b/src/main/java/com/ebremer/beakgraph/core/fuseki/BGVoIDSD.java index 55f569e3..9324adda 100644 --- a/src/main/java/com/ebremer/beakgraph/core/fuseki/BGVoIDSD.java +++ b/src/main/java/com/ebremer/beakgraph/core/fuseki/BGVoIDSD.java @@ -204,9 +204,9 @@ private String computeLongestCommonPrefix() { private String getNamespaceBase(String uri) { int idx = uri.lastIndexOf('#'); if (idx == -1) idx = uri.lastIndexOf('/'); - if (idx == -1) return uri + "#"; - String ns = uri.substring(0, idx + 1); - return (uri.charAt(idx) == '#') ? ns : ns; + if (idx == -1) return uri + "#"; + // The substring already ends with the separator ('#' or '/'). + return uri.substring(0, idx + 1); } } } diff --git a/src/main/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServlet.java b/src/main/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServlet.java index 03860d7d..a92d7125 100644 --- a/src/main/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServlet.java +++ b/src/main/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServlet.java @@ -79,16 +79,41 @@ private void handleSparqlQuery(HttpServletRequest req, HttpServletResponse resp, } URI fileUri = h5File.toUri(); BeakGraph bg = null; + boolean healthy = true; try { bg = BeakGraphPool.getPool().borrowObject(fileUri); // resolve document-relative IRIs against the URL this .h5 is served from - BGSparqlService.execute(bg.getDataset(), queryStr, + healthy = BGSparqlService.execute(bg.getDataset(), queryStr, req.getRequestURL().toString(), req.getHeader("Accept"), resp); + } catch (BGSparqlService.QueryExecutionFailedException ex) { + // Failure after the response committed: nothing may touch the response + // now. Rethrow (after the finally invalidates the reader) so the + // container aborts the connection instead of finishing a truncated + // 200 body as if it were complete. + healthy = false; + throw ex; } catch (Exception ex) { - resp.sendError(400, "Query error: " + ex.getMessage()); + // Reaching here means infrastructure failure (pool, file). Log it, + // don't echo internals to the client. + healthy = false; + logger.error("SPARQL query handling failed for {}", h5File, ex); + if (!resp.isCommitted()) { + resp.sendError(500, "Query execution failed"); + } } finally { if (bg != null) { - BeakGraphPool.getPool().returnObject(fileUri, bg); + if (healthy) { + BeakGraphPool.getPool().returnObject(fileUri, bg); + } else { + // Never re-issue an instance that just failed: with only + // returnObject here, a broken-but-open reader circulated + // forever, 500ing every request for its file. + try { + BeakGraphPool.getPool().invalidateObject(fileUri, bg); + } catch (Exception invalidateEx) { + logger.warn("Failed to invalidate pooled BeakGraph for {}", fileUri, invalidateEx); + } + } } } } @@ -116,7 +141,9 @@ private void serveLinkset(HttpServletResponse resp, String resourceURI) throws I String updated = r.hasProperty(AS_UPDATED) ? r.getProperty(AS_UPDATED).getString() : null; resp.setContentType("application/linkset+json"); resp.setCharacterEncoding("UTF-8"); - resp.getWriter().write(linksetJson(resourceURI, typeHref, up, media, size, updated)); + // anchor/up are advertised on the LIVE base, never the canonical one. + resp.getWriter().write(linksetJson(toLiveUri(resourceURI), typeHref, + up == null ? null : toLiveUri(up), media, size, updated)); } /** @@ -199,6 +226,60 @@ static String encodeHref(String path) { } } + /** + * Decode the raw request URI into the literal path the metadata model and the + * filesystem use. Servlet spec: {@code getRequestURI()} is UNDECODED, while the + * model holds raw filenames - comparing them directly made every resource whose + * name needs percent-encoding (spaces, '#', non-ASCII) permanently 404, including + * via this servlet's own encoded listing links. Returns null for a syntactically + * invalid URI (callers answer 400). + */ + static String decodePath(String rawRequestUri) { + try { + String p = new java.net.URI(rawRequestUri).getPath(); + return p == null ? "" : p; + } catch (java.net.URISyntaxException e) { + return null; + } + } + + /** + * Map a canonical-model URI (rooted at {@link LWSMetadataGenerator#CANONICAL_BASE}) + * onto the live serving base. {@code base} ends with '/' and the canonical + * remainder starts with '/', so naive concatenation minted double-slash URIs that + * 404 when dereferenced; the canonical host/port also leaked into Link headers and + * linksets whenever the server ran on a non-default port. + */ + static String toLiveUri(String canonicalUri, String base) { + String rest = canonicalUri.substring(HTTP_ROOT.length()); + while (rest.startsWith("/")) { + rest = rest.substring(1); + } + return base + rest; + } + + private String toLiveUri(String canonicalUri) { + return toLiveUri(canonicalUri, BASE); + } + + /** Container page URI on the live base; reqPath carries no leading slash and BASE ends with '/'. */ + private String pageUri(String reqPath, int page) { + return BASE + reqPath + "?page=" + page; + } + + /** + * Whether the (lower-cased) Accept header admits an HTML representation. + * RFC 9110: {@code *}{@code /*} and {@code text/*} match every/any text + * representation - curl's default {@code Accept: *}{@code /*} must get a + * page, not a 406. + */ + static boolean acceptsHtmlRepresentation(String lowerAccept) { + return lowerAccept.isEmpty() + || lowerAccept.contains("text/html") + || lowerAccept.contains("text/*") + || lowerAccept.contains("*/*"); + } + /** * Whether a statement object may be sent to clients. The metadata model links * every resource to its on-disk location via {@code owl:sameAs }; @@ -236,7 +317,8 @@ static Path resolveWithin(Path root, String reqPath) { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { // Stop browsers from MIME-sniffing served content into something executable. resp.setHeader("X-Content-Type-Options", "nosniff"); - String reqPath = req.getRequestURI(); + String reqPath = decodePath(req.getRequestURI()); + if (reqPath == null) { resp.sendError(400, "Malformed request URI"); return; } if (reqPath.startsWith("/")) reqPath = reqPath.substring(1); if (reqPath.endsWith("/")) reqPath = reqPath.substring(0, reqPath.length()-1); if (reqPath.endsWith(".meta")) { @@ -245,6 +327,15 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IO basePath = basePath.substring("HalcyonStorage".length()); if (basePath.startsWith("/")) basePath = basePath.substring(1); } + if (basePath.equals("description")) { + // The /description document advertises this linkset itself; it is + // not in the metadata model, so answer it directly instead of 404. + resp.setContentType("application/linkset+json"); + resp.setCharacterEncoding("UTF-8"); + resp.getWriter().write(linksetJson(BASE + "description", + LWS.MetadataResource.getURI(), BASE, null, null, null)); + return; + } String baseResourceURI = basePath.isEmpty() ? HTTP_ROOT : HTTP_ROOT + "/" + basePath; serveLinkset(resp, baseResourceURI); return; @@ -276,7 +367,7 @@ && isHDF5(h5Candidate) && isSparqlRequest(req)) { handleSparqlQuery(req, resp, h5Candidate); return; } - String linksetURI = getLinksetURI(resourceURI); + String linksetURI = getLinksetURI(toLiveUri(resourceURI)); resp.addHeader("Link", "<" + linksetURI + ">; rel=\"linkset\"; type=\"application/linkset+json\""); resp.setHeader("Vary", "Accept"); boolean isContainer = r.hasProperty(RDF.type, LWS_CONTAINER); @@ -284,7 +375,7 @@ && isHDF5(h5Candidate) && isSparqlRequest(req)) { String formatParam = req.getParameter("format"); boolean forceTurtle = "turtle".equalsIgnoreCase(formatParam); boolean forceJsonLd = "jsonld".equalsIgnoreCase(formatParam); - boolean wantHtml = (accept.contains("text/html") || accept.isEmpty()) && !forceTurtle && !forceJsonLd; + boolean wantHtml = acceptsHtmlRepresentation(accept) && !forceTurtle && !forceJsonLd; boolean wantTurtle = accept.contains("turtle") || forceTurtle; boolean wantJson = (accept.contains("ld+json") || accept.contains("json")) || forceJsonLd; if (isContainer && wantHtml) { @@ -324,8 +415,7 @@ && isHDF5(h5Candidate) && isSparqlRequest(req)) { RDFNode obj = s.getObject(); if (!exposableToClient(obj)) return; // never leak file:/// server paths if (obj.isResource() && obj.asResource().getURI() != null && obj.asResource().getURI().startsWith(HTTP_ROOT)) { - String newURI = BASE + obj.asResource().getURI().substring(HTTP_ROOT.length()); - httpR.addProperty(s.getPredicate(), out.createResource(newURI)); + httpR.addProperty(s.getPredicate(), out.createResource(toLiveUri(obj.asResource().getURI()))); } else { httpR.addProperty(s.getPredicate(), obj); } @@ -348,27 +438,29 @@ && isHDF5(h5Candidate) && isSparqlRequest(req)) { if (start >= total) { resp.sendError(404); return; } int startIdx = (int) start; List paged = items.subList(startIdx, Math.min(startIdx+size, total)); - Resource pageR = out.createResource(BASE + (reqPath.isEmpty() ? "" : reqPath) + (reqPath.isEmpty() ? "" : "/") + "?page=" + page); + // Self and first/last/prev/next all use the same URI shape, + // and the navigation links are RESOURCES (they are page URIs, + // and were emitted as plain literals with a divergent shape). + Resource pageR = out.createResource(pageUri(reqPath, page)); r.listProperties().forEachRemaining(s -> { if (!s.getPredicate().equals(LWS_ITEMS) && exposableToClient(s.getObject())) { pageR.addProperty(s.getPredicate(), s.getObject()); } }); pageR.addProperty(RDF.type, LWS.ContainerPage); - pageR.addProperty(ResourceFactory.createProperty("https://www.w3.org/ns/activitystreams#first"), BASE + (reqPath.isEmpty() ? "" : reqPath) + "?page=1"); + pageR.addProperty(ResourceFactory.createProperty("https://www.w3.org/ns/activitystreams#first"), out.createResource(pageUri(reqPath, 1))); int pages = (total + size - 1) / size; - pageR.addProperty(ResourceFactory.createProperty("https://www.w3.org/ns/activitystreams#last"), BASE + (reqPath.isEmpty() ? "" : reqPath) + "?page=" + pages); - if (page > 1) pageR.addProperty(ResourceFactory.createProperty("https://www.w3.org/ns/activitystreams#prev"), BASE + (reqPath.isEmpty() ? "" : reqPath) + "?page=" + (page-1)); - if (page < pages) pageR.addProperty(ResourceFactory.createProperty("https://www.w3.org/ns/activitystreams#next"), BASE + (reqPath.isEmpty() ? "" : reqPath) + "?page=" + (page+1)); + pageR.addProperty(ResourceFactory.createProperty("https://www.w3.org/ns/activitystreams#last"), out.createResource(pageUri(reqPath, pages))); + if (page > 1) pageR.addProperty(ResourceFactory.createProperty("https://www.w3.org/ns/activitystreams#prev"), out.createResource(pageUri(reqPath, page-1))); + if (page < pages) pageR.addProperty(ResourceFactory.createProperty("https://www.w3.org/ns/activitystreams#next"), out.createResource(pageUri(reqPath, page+1))); for (Resource it : paged) { - String itHttp = BASE + it.getURI().substring(HTTP_ROOT.length()); + String itHttp = toLiveUri(it.getURI()); pageR.addProperty(LWS_ITEMS, out.createResource(itHttp)); it.listProperties().forEachRemaining(st -> { RDFNode obj = st.getObject(); if (!exposableToClient(obj)) return; // never leak file:/// server paths if (obj.isResource() && obj.asResource().getURI() != null && obj.asResource().getURI().startsWith(HTTP_ROOT)) { - String newURI = BASE + obj.asResource().getURI().substring(HTTP_ROOT.length()); - out.getResource(itHttp).addProperty(st.getPredicate(), out.createResource(newURI)); + out.getResource(itHttp).addProperty(st.getPredicate(), out.createResource(toLiveUri(obj.asResource().getURI()))); } else { out.getResource(itHttp).addProperty(st.getPredicate(), obj); } @@ -376,13 +468,12 @@ && isHDF5(h5Candidate) && isSparqlRequest(req)) { } } else { for (Resource it : items) { - String itHttp = BASE + it.getURI().substring(HTTP_ROOT.length()); + String itHttp = toLiveUri(it.getURI()); it.listProperties().forEachRemaining(st -> { RDFNode obj = st.getObject(); if (!exposableToClient(obj)) return; // never leak file:/// server paths if (obj.isResource() && obj.asResource().getURI() != null && obj.asResource().getURI().startsWith(HTTP_ROOT)) { - String newURI = BASE + obj.asResource().getURI().substring(HTTP_ROOT.length()); - out.getResource(itHttp).addProperty(st.getPredicate(), out.createResource(newURI)); + out.getResource(itHttp).addProperty(st.getPredicate(), out.createResource(toLiveUri(obj.asResource().getURI()))); } else { out.getResource(itHttp).addProperty(st.getPredicate(), obj); } @@ -410,13 +501,30 @@ && isHDF5(h5Candidate) && isSparqlRequest(req)) { media = Files.probeContentType(localFile); if (media == null) media = "application/octet-stream"; } + // Conditional GET support: the store is read-only between writes, so + // size+mtime make a stable validator. + long size = Files.size(localFile); + long lastModified = Files.getLastModifiedTime(localFile).toMillis(); + String etag = "\"" + size + "-" + lastModified + "\""; + resp.setHeader("ETag", etag); + resp.setDateHeader("Last-Modified", lastModified); + String ifNoneMatch = req.getHeader("If-None-Match"); + long ifModifiedSince = req.getDateHeader("If-Modified-Since"); + if (etag.equals(ifNoneMatch) + || (ifNoneMatch == null && ifModifiedSince >= 0 && lastModified / 1000 <= ifModifiedSince / 1000)) { + resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); + return; + } resp.setContentType(media); // Stored bytes are served as a download: with nosniff above, this keeps an // HTML/SVG file someone placed under the root from rendering in this origin. String filename = localFile.getFileName().toString().replace("\"", ""); resp.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); - resp.setContentLengthLong(Files.size(localFile)); - Files.copy(localFile, resp.getOutputStream()); + resp.setContentLengthLong(size); + // HEAD gets the same headers without the body (and without the file copy). + if (!"HEAD".equals(req.getMethod())) { + Files.copy(localFile, resp.getOutputStream()); + } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { @@ -424,7 +532,8 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws I logger.info("LWS {} {} ct={} query-param={} bodyLen={}", req.getMethod(), req.getRequestURI(), req.getContentType(), req.getParameter("query") != null, req.getContentLengthLong()); - String reqPath = req.getRequestURI(); + String reqPath = decodePath(req.getRequestURI()); + if (reqPath == null) { resp.sendError(400, "Malformed request URI"); return; } if (reqPath.startsWith("/")) reqPath = reqPath.substring(1); if (reqPath.endsWith("/")) reqPath = reqPath.substring(0, reqPath.length()-1); if (reqPath.startsWith("HalcyonStorage")) { @@ -438,7 +547,9 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws I return; } boolean isContainer = r.hasProperty(RDF.type, LWS_CONTAINER); - if (isContainer) { resp.sendError(406); return; } + // 405, not 406: POST to a container is an unsupported METHOD, not a + // content-negotiation failure. + if (isContainer) { resp.sendError(405, "Method not allowed"); return; } if (STORAGE_ROOT == null) { resp.sendError(500); return; } Path localFile = resolveWithin(STORAGE_ROOT, reqPath); if (localFile == null) { resp.sendError(403, "Forbidden"); return; } @@ -451,6 +562,8 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws I } @Override protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws IOException { + // Same routing and headers as GET; the file-serving branch checks the + // method and skips the body copy for HEAD. doGet(req, resp); } } diff --git a/src/main/java/com/ebremer/beakgraph/core/fuseki/RelativeIRIResolver.java b/src/main/java/com/ebremer/beakgraph/core/fuseki/RelativeIRIResolver.java index b5fae13b..6722000f 100644 --- a/src/main/java/com/ebremer/beakgraph/core/fuseki/RelativeIRIResolver.java +++ b/src/main/java/com/ebremer/beakgraph/core/fuseki/RelativeIRIResolver.java @@ -3,6 +3,8 @@ import com.ebremer.beakgraph.utils.UTIL; import java.util.Iterator; import java.util.List; +import java.util.function.Predicate; +import org.apache.jena.graph.Node; import org.apache.jena.graph.NodeFactory; import org.apache.jena.graph.Triple; import org.apache.jena.irix.IRIx; @@ -28,8 +30,9 @@ * in at build time. This class converts between the stored "storage form" and * the absolute "result form" expected by SPARQL clients: *
      - *
    • {@link #absoluteToStorage()} - query input: an absolute IRI under the - * base is rewritten to the relative form held in the dictionary.
    • + *
    • {@link #absoluteToStorage(Predicate)} - query input: an absolute IRI + * under the base is rewritten to the relative form when the dictionary + * holds that relative form (and not the absolute one).
    • *
    • {@link #storageToAbsolute()} - query output: a relative IRI is resolved * against the base into an absolute IRI.
    • *
    @@ -60,19 +63,33 @@ public boolean isActive() { } /** - * Input transform: an absolute IRI that sits under the document base is - * rewritten to the relative form actually stored in the dictionary, so that - * queries naming a resource by its served URL still match. Every other node - * (variables, literals, blank nodes, unrelated IRIs) passes through. + * Input transform: an absolute IRI under the document base is rewritten to + * its relative form so that queries naming a resource by its served URL + * still match a relative-stored term. Every other node (variables, + * literals, blank nodes, unrelated IRIs) passes through. + *

    + * The rewrite fires only when {@code storedTerm} says the relative form IS + * in the store and the absolute form is NOT. The dictionary holds a term in + * exactly one of the two forms (relative only when the source document used + * a relative reference), so rewriting unconditionally turned every query + * naming an absolute-stored same-host IRI into a guaranteed miss - Jena's + * relativize also emits {@code /absolute/path} and {@code ../up} forms the + * writer never produces. When both forms are stored, the exact term the + * query named (the absolute one) wins. + * + * @param storedTerm whether a node exists in the store's dictionary */ - public NodeTransform absoluteToStorage() { + public NodeTransform absoluteToStorage(Predicate storedTerm) { return node -> { if (base != null && node != null && node.isURI() && !UTIL.isRelativeIRI(node.getURI())) { try { IRIx rel = base.relativize(IRIx.create(node.getURI())); if (rel != null && rel.isRelative()) { - return NodeFactory.createURI(rel.str()); + Node relNode = NodeFactory.createURI(rel.str()); + if (storedTerm.test(relNode) && !storedTerm.test(node)) { + return relNode; + } } } catch (RuntimeException ignore) { // leave the node unchanged on any IRI parsing failure diff --git a/src/main/java/com/ebremer/beakgraph/core/fuseki/SPARQLEndPoint.java b/src/main/java/com/ebremer/beakgraph/core/fuseki/SPARQLEndPoint.java index a83c6919..e5a3842a 100644 --- a/src/main/java/com/ebremer/beakgraph/core/fuseki/SPARQLEndPoint.java +++ b/src/main/java/com/ebremer/beakgraph/core/fuseki/SPARQLEndPoint.java @@ -35,6 +35,7 @@ public class SPARQLEndPoint { private Model lwsModel; private Path storageRoot = null; private BeakGraph singleFileGraph; + private final Dataset dataset; static { JenaSystem.init(); @@ -98,6 +99,7 @@ private SPARQLEndPoint(Parameters params) throws Exception { } if (lwsModel == null) lwsModel = ModelFactory.createDefaultModel(); } + this.dataset = ds; boolean singleFile = !Files.isDirectory(endpointPath); var serverBuilder = FusekiServer.create() @@ -130,8 +132,11 @@ private SPARQLEndPoint(Parameters params) throws Exception { // Serve /rdf ourselves so document-relative IRIs in the HDF5 file are // resolved (against the file's own URI) instead of leaking out raw, // matching the behaviour of the LWS .h5 SPARQL path. + // Resolution base is the SERVED URL, never the local file URI: resolving + // stored-relative IRIs against endpointPath.toUri() sent every client + // file:////... IRIs - full filesystem disclosure. ServletHolder rdfHolder = new ServletHolder("hdf5-sparql", - new HDF5SparqlServlet(ds, endpointPath.toUri().toString())); + new HDF5SparqlServlet(ds, BASE_URL + "rdf")); context.addServlet(rdfHolder, "/rdf"); context.addServlet(rdfHolder, "/rdf/*"); } @@ -152,7 +157,10 @@ public static synchronized SPARQLEndPoint getSPARQLEndPoint(Parameters params) t } public DatasetGraph getDataset() { - return server.getDataAccessPointRegistry().get("/rdf").getDataService().getDataset(); + // The dataset this endpoint serves, held directly: the Fuseki registry + // only knows "/rdf" in directory mode (single-file mode serves /rdf via + // its own servlet), so the old registry lookup NPE'd in single-file mode. + return dataset.asDatasetGraph(); } public void shutdown() { @@ -192,7 +200,25 @@ private static class SparqlWebPageServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { String pathInfo = req.getPathInfo(); - String resourcePath = (pathInfo == null || pathInfo.equals("/") || pathInfo.isEmpty()) ? "/META-INF/sparql/index.html" : "/META-INF/sparql" + pathInfo; + String resourcePath; + if (pathInfo == null || pathInfo.equals("/") || pathInfo.isEmpty()) { + resourcePath = "/META-INF/sparql/index.html"; + } else if (pathInfo.equals("/beakgraph.png")) { + // The logo ships exactly once, at the classpath root - an identical + // copy under META-INF/sparql used to double the jar by 1.6 MB. + resourcePath = "/beakgraph.png"; + } else { + // pathInfo is attacker-influenced and already URL-decoded: reject + // dot-segments (and backslashes) before splicing it into a classpath + // lookup, so an encoded "/../.." can never escape /META-INF/sparql - + // regardless of the container's URI-compliance mode or whether the + // classpath is a jar or exploded directories. + if (pathInfo.contains("..") || pathInfo.indexOf('\\') >= 0) { + resp.sendError(HttpServletResponse.SC_NOT_FOUND); + return; + } + resourcePath = "/META-INF/sparql" + pathInfo; + } InputStream is = getClass().getResourceAsStream(resourcePath); if (is == null) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); return; } resp.setContentType(getContentType(resourcePath)); @@ -207,6 +233,7 @@ private String getContentType(String path) { if (path.endsWith(".css")) return "text/css"; if (path.endsWith(".js")) return "application/javascript"; if (path.endsWith(".json")) return "application/json"; + if (path.endsWith(".png")) return "image/png"; return "application/octet-stream"; } } diff --git a/src/main/java/com/ebremer/beakgraph/core/lib/NodeComparator.java b/src/main/java/com/ebremer/beakgraph/core/lib/NodeComparator.java index babaf009..518e8705 100644 --- a/src/main/java/com/ebremer/beakgraph/core/lib/NodeComparator.java +++ b/src/main/java/com/ebremer/beakgraph/core/lib/NodeComparator.java @@ -1,6 +1,11 @@ package com.ebremer.beakgraph.core.lib; +import java.math.BigDecimal; +import java.math.BigInteger; import java.util.Comparator; +import javax.xml.datatype.DatatypeConstants; +import javax.xml.datatype.Duration; +import javax.xml.datatype.XMLGregorianCalendar; import org.apache.jena.graph.Node; import org.apache.jena.sparql.core.Quad; import org.apache.jena.sparql.expr.NodeValue; @@ -8,7 +13,7 @@ /** * Enforces a strict Total Ordering of RDF Nodes. - * CRITICAL for HDF5 Binary Search: + * CRITICAL for HDF5 Binary Search: * Ensures the sorting order perfectly matches the Monolithic Dictionary ID assignments: * 1. Default Graph * 2. Blank Nodes @@ -26,8 +31,18 @@ public int compare(Node n1, Node n2) { // 1. Handle the Default Graph first (Always ID 0 or implicitly lowest) boolean n1isDefault = isDefaultGraph(n1); boolean n2isDefault = isDefaultGraph(n2); - - if (n1isDefault && n2isDefault) return 0; + + if (n1isDefault && n2isDefault) { + // Both ARQ sentinels rank before everything else, but they are two + // DISTINCT RDF terms: returning 0 for the pair collapsed them onto + // one dictionary id when a source used urn:x-arq:DefaultGraphNode as + // a data term. Order by exact term (null ≡ the default graph IRI; + // "urn:x-arq:DefaultGraph" still sorts first, keeping the graph + // dictionary's lowest-id assumption). + Node t1 = (n1 == null) ? Quad.defaultGraphIRI : n1; + Node t2 = (n2 == null) ? Quad.defaultGraphIRI : n2; + return NodeCmp.compareRDFTerms(t1, t2); + } if (n1isDefault) return -1; if (n2isDefault) return 1; @@ -35,7 +50,7 @@ public int compare(Node n1, Node n2) { // This ensures the sorted array perfectly aligns with how IDs are chunked int type1 = getMacroType(n1); int type2 = getMacroType(n2); - + if (type1 != type2) { return Integer.compare(type1, type2); } @@ -47,8 +62,30 @@ public int compare(Node n1, Node n2) { NodeValue nv1 = NodeValue.makeNode(n1); NodeValue nv2 = NodeValue.makeNode(n2); + // Timezone-sensitive value spaces cannot go through compareAlways: + // it answers value order for XSD-determinate pairs but silently falls + // back to TERM order for indeterminate ones (a timezone-less dateTime + // vs a timezoned one within +/-14h; a month-based duration vs a + // day-based one). Mixing the two orders pairwise is not transitive - + // e.g. "2020-01-02T00:00:00" < "2020-01-02T08:00:00+14:00" < + // "2020-01-01T20:00:00Z" < the first - and a cyclic comparator breaks + // every sort and binary search in the store (locate() misses stored + // literals; builds fail with "Cannot resolve Object"). These spaces + // get a self-consistent total order below that agrees with XSD value + // order wherever XSD order is determinate, so the ValueCluster range + // pushdown stays over-inclusive and value-equal terms stay adjacent. + int group = temporalGroup(nv1); + if (group != 0 && group == temporalGroup(nv2)) { + return group == GROUP_DURATION + ? compareDurationTotal(nv1, nv2, n1, n2) + : compareTemporalTotal(nv1, nv2, n1, n2); + } + // compareAlways provides a strict SPARQL "ORDER BY" ordering by VALUE, - // handling mixed datatypes safely without throwing exceptions. + // handling mixed datatypes safely without throwing exceptions. Across + // distinct value spaces (number vs string vs dateTime vs date ...) it + // orders by a fixed value-space rank independent of the actual values, + // so it stays transitive there. int byValue = NodeValue.compareAlways(nv1, nv2); if (byValue != 0) { return byValue; @@ -69,6 +106,95 @@ public int compare(Node n1, Node n2) { return NodeCmp.compareRDFTerms(n1, n2); } + private static final int GROUP_DURATION = 9; + + /** + * Classifies a literal into one of the timezone-sensitive temporal value + * spaces (or 0 for everything else). The grouping mirrors Jena's own value + * spaces - dateTime and dateTimeStamp share one space, date/time/g* each + * have their own - so the special-cased ordering below applies exactly where + * compareAlways would have compared by value-or-term, and never across two + * spaces that compareAlways ranks by value space. Ill-formed literals answer + * false to all predicates and stay on the compareAlways path. + */ + private static int temporalGroup(NodeValue nv) { + if (nv.isDateTime()) return 1; + if (nv.isDate()) return 2; + if (nv.isTime()) return 3; + if (nv.isGYear()) return 4; + if (nv.isGYearMonth()) return 5; + if (nv.isGMonth()) return 6; + if (nv.isGMonthDay()) return 7; + if (nv.isGDay()) return 8; + if (nv.isDuration()) return GROUP_DURATION; + return 0; + } + + /** + * Total order for two temporal values of the same value space: a missing + * timezone is pinned to UTC, which makes the XSD ordering total (both + * operands become determinate instants) while agreeing with it on every + * pair that was already determinate (UTC lies inside the +/-14h window XSD + * uses for timezone-less values). Instant-equal values (same point on the + * timeline, e.g. "...Z" vs "...+00:00") fall through to the exact-term + * tie-break, exactly as value-equal literals do on the compareAlways path. + */ + private static int compareTemporalTotal(NodeValue nv1, NodeValue nv2, Node n1, Node n2) { + XMLGregorianCalendar a = (XMLGregorianCalendar) nv1.getDateTime().clone(); + XMLGregorianCalendar b = (XMLGregorianCalendar) nv2.getDateTime().clone(); + if (a.getTimezone() == DatatypeConstants.FIELD_UNDEFINED) a.setTimezone(0); + if (b.getTimezone() == DatatypeConstants.FIELD_UNDEFINED) b.setTimezone(0); + int r = a.compare(b); + if (r == DatatypeConstants.LESSER) return -1; + if (r == DatatypeConstants.GREATER) return 1; + return NodeCmp.compareRDFTerms(n1, n2); + } + + /** + * Total order for durations: by total months, then by total seconds, then + * by exact term. XSD duration equality is exactly (months, seconds) + * equality, so value-equal durations ("P1D" vs "PT24H") stay adjacent for + * ValueCluster; and within each XSD-comparable kind (month-based with + * month-based, day/time-based with day/time-based) the order equals XSD + * value order. Cross-kind pairs - which SPARQL comparison rejects and + * compareAlways used to term-order pairwise-inconsistently - get the fixed + * months-first rank. + */ + private static int compareDurationTotal(NodeValue nv1, NodeValue nv2, Node n1, Node n2) { + Duration d1 = nv1.getDuration(); + Duration d2 = nv2.getDuration(); + int c = totalMonths(d1).compareTo(totalMonths(d2)); + if (c != 0) return c; + c = totalSeconds(d1).compareTo(totalSeconds(d2)); + if (c != 0) return c; + return NodeCmp.compareRDFTerms(n1, n2); + } + + private static BigInteger totalMonths(Duration d) { + BigInteger years = fieldInt(d, DatatypeConstants.YEARS); + BigInteger months = fieldInt(d, DatatypeConstants.MONTHS); + BigInteger total = years.multiply(BigInteger.valueOf(12)).add(months); + return d.getSign() < 0 ? total.negate() : total; + } + + private static BigDecimal totalSeconds(Duration d) { + BigDecimal seconds = new BigDecimal(fieldInt(d, DatatypeConstants.DAYS)).multiply(BigDecimal.valueOf(86400)) + .add(new BigDecimal(fieldInt(d, DatatypeConstants.HOURS)).multiply(BigDecimal.valueOf(3600))) + .add(new BigDecimal(fieldInt(d, DatatypeConstants.MINUTES)).multiply(BigDecimal.valueOf(60))) + .add(fieldDec(d, DatatypeConstants.SECONDS)); + return d.getSign() < 0 ? seconds.negate() : seconds; + } + + private static BigInteger fieldInt(Duration d, DatatypeConstants.Field f) { + Number n = d.getField(f); + return n == null ? BigInteger.ZERO : (BigInteger) n; + } + + private static BigDecimal fieldDec(Duration d, DatatypeConstants.Field f) { + Number n = d.getField(f); + return n == null ? BigDecimal.ZERO : (BigDecimal) n; + } + /** * Maps a Node to an integer rank to enforce BNode < URI < Literal. */ @@ -77,7 +203,7 @@ private int getMacroType(Node n) { if (n.isURI()) return 2; if (n.isLiteral()) return 3; // Should never happen in valid RDF, but safe fallback - return 4; + return 4; } private boolean isDefaultGraph(Node n) { diff --git a/src/main/java/com/ebremer/beakgraph/core/lib/Stats.java b/src/main/java/com/ebremer/beakgraph/core/lib/Stats.java index a00d1f54..21f68652 100644 --- a/src/main/java/com/ebremer/beakgraph/core/lib/Stats.java +++ b/src/main/java/com/ebremer/beakgraph/core/lib/Stats.java @@ -21,10 +21,13 @@ public class Stats { public int maxInteger = Integer.MIN_VALUE; public int minInteger = Integer.MAX_VALUE; public long numInteger = 0; - public float maxFloat = Float.MIN_VALUE; + // Seeds for running max must be the most NEGATIVE value: Float.MIN_VALUE / + // Double.MIN_VALUE are the smallest POSITIVE values, which made the reported + // max wrong for all-negative data. + public float maxFloat = -Float.MAX_VALUE; public float minFloat = Float.MAX_VALUE; - public long numFloat = 0; - public double maxDouble = Double.MIN_VALUE; + public long numFloat = 0; + public double maxDouble = -Double.MAX_VALUE; public double minDouble = Double.MAX_VALUE; public long numDouble = 0; diff --git a/src/main/java/com/ebremer/beakgraph/core/lib/VByte.java b/src/main/java/com/ebremer/beakgraph/core/lib/VByte.java index 97ab9486..d65fb031 100644 --- a/src/main/java/com/ebremer/beakgraph/core/lib/VByte.java +++ b/src/main/java/com/ebremer/beakgraph/core/lib/VByte.java @@ -1,12 +1,15 @@ package com.ebremer.beakgraph.core.lib; -import java.io.InputStream; -import java.io.OutputStream; import java.io.IOException; +import java.io.OutputStream; import java.nio.ByteBuffer; /** - * Variable-byte (VByte) encoding with signed and unsigned support. + * Variable-byte (VByte) encoding, trimmed to the two operations the + * front-coded dictionaries actually use: streaming encode at write time and + * position-independent decode at read time. The signed (zig-zag), byte-array + * and position-mutating ByteBuffer variants that accumulated here had no + * callers and were removed in the dead-code sweep. */ public class VByte { @@ -14,7 +17,7 @@ public class VByte { * Encode an unsigned long to an OutputStream using VByte. * @param out * @param value non-negative - * @return + * @return number of bytes written * @throws IOException */ public static int encode(OutputStream out, long value) throws IOException { @@ -31,146 +34,6 @@ public static int encode(OutputStream out, long value) throws IOException { return c; } - /** - * Decode an unsigned long from an InputStream using VByte. - * @param in - * @return decoded value - * @throws IOException - */ - public static long decode(InputStream in) throws IOException { - long result = 0; - int shift = 0, b; - do { - if (shift >= 64) - throw new IOException("VByte sequence too long"); - b = in.read(); - if (b < 0) - throw new IOException("Unexpected end of stream"); - result |= (long)(b & 0x7F) << shift; - shift += 7; - } while ((b & 0x80) == 0); - return result; - } - - /** - * Encode a signed long with zig-zag transform. - * @param out - * @param value - * @throws java.io.IOException - */ - public static void encodeSigned(OutputStream out, long value) throws IOException { - // canonical zig-zag: interleave sign bit - long zig = (value << 1) ^ (value >> 63); - encode(out, zig); - } - - /** - * Decode a signed long with zig-zag transform. - * @param in - * @return - * @throws java.io.IOException - */ - public static long decodeSigned(InputStream in) throws IOException { - long zig = decode(in); - // reverse zig-zag - return (zig >>> 1) ^ -(zig & 1); - } - - /** - * Encode an unsigned long into a byte array at offset. - * @param array - * @param offset - * @param value - * @return new offset - */ - public static int encode(byte[] array, int offset, long value) { - if (value < 0) - throw new IllegalArgumentException("Value must be non-negative: " + value); - while (value > 0x7F) { - array[offset++] = (byte)(value & 0x7F); - value >>>= 7; - } - array[offset++] = (byte)(value | 0x80); - return offset; - } - - /** - * Decode an unsigned long from a byte array starting at offset. - * @param array - * @param offset - * @return DecodeResult.value and nextOffset in the array - */ - public static DecodeResult decode(byte[] array, int offset) { - long result = 0; - int shift = 0; - byte b; - do { - if (shift >= 64) - throw new IllegalArgumentException("VByte sequence too long"); - b = array[offset++]; - result |= (long)(b & 0x7F) << shift; - shift += 7; - } while ((b & 0x80) == 0); - return new DecodeResult(result, offset); - } - - /** - * Encode an unsigned long into a ByteBuffer. - * @param buffer - * @param value - * @return number of bytes written - */ - public static int encode(ByteBuffer buffer, long value) { - int start = buffer.position(); - if (value < 0) - throw new IllegalArgumentException("Value must be non-negative: " + value); - while (value > 0x7F) { - buffer.put((byte)(value & 0x7F)); - value >>>= 7; - } - buffer.put((byte)(value | 0x80)); - return buffer.position() - start; - } - - /** - * Decode an unsigned long from a ByteBuffer. - * @param buffer - * @return DecodeResult.value and bytesConsumed - */ - public static DecodeResult decode(ByteBuffer buffer) { - int start = buffer.position(); - long result = 0; - int shift = 0; - byte b; - do { - if (shift >= 64) - throw new IllegalArgumentException("VByte sequence too long"); - b = buffer.get(); - result |= (long)(b & 0x7F) << shift; - shift += 7; - } while ((b & 0x80) == 0); - int consumed = buffer.position() - start; - return new DecodeResult(result, consumed); - } - - /** - * Decode an unsigned long from a ByteBuffer. - * @param buffer - * @return DecodeResult.value and bytesConsumed - */ - public static long decodeSingle(ByteBuffer buffer) { - long result = 0; - int shift = 0; - byte b; - do { - if (shift >= 64) throw new IllegalArgumentException("VByte sequence too long "+shift); - b = buffer.get(); - result |= (long)(b & 0x7F) << shift; - shift += 7; - } while ((b & 0x80) == 0); - return result; - } - /** * Decode an unsigned long from a ByteBuffer at an absolute offset, WITHOUT moving the * buffer's position. This lets a single buffer be read by concurrent threads safely. @@ -193,7 +56,7 @@ public static DecodeResult decodeAt(ByteBuffer buffer, int offset) { } /** - * Holder for decoded value and next offset/bytesConsumed. + * Holder for decoded value and next offset. */ public static class DecodeResult { public final long value; @@ -204,5 +67,4 @@ public DecodeResult(long value, int nextOffset) { this.nextOffset = nextOffset; } } - } diff --git a/src/main/java/com/ebremer/beakgraph/features/MajorMinor.java b/src/main/java/com/ebremer/beakgraph/features/MajorMinor.java index 8ffd2b7e..3176dc4f 100644 --- a/src/main/java/com/ebremer/beakgraph/features/MajorMinor.java +++ b/src/main/java/com/ebremer/beakgraph/features/MajorMinor.java @@ -3,121 +3,153 @@ import com.ebremer.ns.HAL; import java.util.ArrayList; import java.util.Locale; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.apache.jena.datatypes.RDFDatatype; import org.apache.jena.graph.Node; import org.apache.jena.graph.NodeFactory; import org.apache.jena.rdf.model.Resource; import org.apache.jena.sparql.core.Quad; -import org.ejml.simple.SimpleEVD; -import org.ejml.simple.SimpleMatrix; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Polygon; import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.WKTReader; /** - * Adds centroid, major axis and minor axis as WKT literals to a geo:Feature + * Adds centroid, major axis and minor axis as WKT literals to a geo:Feature. + *

    + * All values come from the polygon's exact AREA moments (Green's theorem over + * the rings, shell positive and holes negative), not from a vertex point + * cloud: the vertex PCA double-weighted ring-closure vertices on holed + * polygons and measured boundary spread rather than the region, so the drawn + * axis disagreed with {@code PYR.MajorAxisLength} (raster-region based) for + * the same geometry. Axis length is the pyradiomics convention, 4*sqrt(λ) of + * the region's covariance - identical in definition to the raster feature. */ public class MajorMinor { + private static final Logger logger = LoggerFactory.getLogger(MajorMinor.class); + public static void add(Resource f, String wkt) { try { - WKTReader reader = new WKTReader(); - Geometry geom = reader.read(wkt); - if (!(geom instanceof Polygon)) return; - Polygon poly = (Polygon) geom; - Coordinate[] coords = poly.getCoordinates(); - // build point cloud - int n = coords.length - 1; // close ring - SimpleMatrix m = new SimpleMatrix(n, 2); - for (int i = 0; i < n; i++) { - m.set(i, 0, coords[i].x); - m.set(i, 1, coords[i].y); + Geometry geom = new WKTReader().read(wkt); + if (!(geom instanceof Polygon poly)) return; + double[] g = axes(poly); + if (g == null) { + logger.warn("Skipping centroid/axis features for {}: zero-area geometry", f); + return; } - // centroid - double mx = m.extractVector(false, 0).elementSum() / n; - double my = m.extractVector(false, 1).elementSum() / n; - // PCA - SimpleMatrix ones = SimpleMatrix.ones(n, 1); - SimpleMatrix meanVec = new SimpleMatrix(1, 2, true, mx, my); - SimpleMatrix centered = m.minus(ones.mult(meanVec)); - SimpleMatrix cov = centered.transpose().mult(centered).divide(n - 1.0); - SimpleEVD evd = cov.eig(); - double lambda0 = evd.getEigenvalue(0).getReal(); - double lambda1 = evd.getEigenvalue(1).getReal(); - SimpleMatrix v0 = (SimpleMatrix) evd.getEigenVector(0).copy(); - SimpleMatrix v1 = (SimpleMatrix) evd.getEigenVector(1).copy(); - if (lambda0 < lambda1) { - double t = lambda0; lambda0 = lambda1; lambda1 = t; - SimpleMatrix tv = v0; v0 = v1; v1 = tv; - } - if (v0.get(0) < 0) v0 = v0.scale(-1.0); - if (v1.get(0) < 0) v1 = v1.scale(-1.0); - double majorlen = 2 * Math.sqrt(lambda0); - double minorlen = 2 * Math.sqrt(lambda1); - // half-axis vectors - double ax = majorlen / 2 * v0.get(0); - double ay = majorlen / 2 * v0.get(1); - double bx = minorlen / 2 * v1.get(0); - double by = minorlen / 2 * v1.get(1); // WKT strings: Locale.ROOT so the decimal separator is always '.', // not the default locale's (e.g. ',' on de_DE, which is invalid WKT). - String centroidWKT = String.format(Locale.ROOT, "POINT(%.4f %.4f)", mx, my); - String majorWKT = String.format(Locale.ROOT, "LINESTRING(%.4f %.4f, %.4f %.4f)", - mx - ax, my - ay, mx + ax, my + ay); - String minorWKT = String.format(Locale.ROOT, "LINESTRING(%.4f %.4f, %.4f %.4f)", - mx - bx, my - by, mx + bx, my + by); - // add to the feature - f.addProperty(HAL.centroid, f.getModel().createTypedLiteral(centroidWKT, GEO.wktLiteral.getURI())); - f.addProperty(HAL.majorAxis, f.getModel().createTypedLiteral(majorWKT, GEO.wktLiteral.getURI())); - f.addProperty(HAL.minorAxis, f.getModel().createTypedLiteral(minorWKT, GEO.wktLiteral.getURI())); - } catch (ParseException ignored) {} + f.addProperty(HAL.centroid, f.getModel().createTypedLiteral(centroidWkt(g), GEO.wktLiteral.getURI())); + f.addProperty(HAL.majorAxis, f.getModel().createTypedLiteral(majorWkt(g), GEO.wktLiteral.getURI())); + f.addProperty(HAL.minorAxis, f.getModel().createTypedLiteral(minorWkt(g), GEO.wktLiteral.getURI())); + } catch (ParseException | RuntimeException e) { + // JTS throws IllegalArgumentException - not just ParseException - for + // structurally invalid geometry (e.g. a two-point ring). One bad + // geometry skips ITS features with a warning; it must never escape + // into the spatial task and abort the whole build. + logger.warn("Skipping centroid/axis features for {}: {}", f, e.toString()); + } } - + public static void add(ArrayList quads, Node f, String wkt) { try { - WKTReader reader = new WKTReader(); - Geometry geom = reader.read(wkt); - if (!(geom instanceof Polygon)) return; - Polygon poly = (Polygon) geom; - Coordinate[] coords = poly.getCoordinates(); - int n = coords.length - 1; - SimpleMatrix m = new SimpleMatrix(n, 2); - for (int i = 0; i < n; i++) { - m.set(i, 0, coords[i].x); - m.set(i, 1, coords[i].y); - } - double mx = m.extractVector(false, 0).elementSum() / n; - double my = m.extractVector(false, 1).elementSum() / n; - SimpleMatrix ones = SimpleMatrix.ones(n, 1); - SimpleMatrix meanVec = new SimpleMatrix(1, 2, true, mx, my); - SimpleMatrix centered = m.minus(ones.mult(meanVec)); - SimpleMatrix cov = centered.transpose().mult(centered).divide(n - 1.0); - SimpleEVD evd = cov.eig(); - double lambda0 = evd.getEigenvalue(0).getReal(); - double lambda1 = evd.getEigenvalue(1).getReal(); - SimpleMatrix v0 = (SimpleMatrix) evd.getEigenVector(0).copy(); - SimpleMatrix v1 = (SimpleMatrix) evd.getEigenVector(1).copy(); - if (lambda0 < lambda1) { - double t = lambda0; lambda0 = lambda1; lambda1 = t; - SimpleMatrix tv = v0; v0 = v1; v1 = tv; + Geometry geom = new WKTReader().read(wkt); + if (!(geom instanceof Polygon poly)) return; + double[] g = axes(poly); + if (g == null) { + logger.warn("Skipping centroid/axis features for {}: zero-area geometry", f); + return; } - if (v0.get(0) < 0) v0 = v0.scale(-1.0); - if (v1.get(0) < 0) v1 = v1.scale(-1.0); - double majorlen = 2 * Math.sqrt(lambda0); - double minorlen = 2 * Math.sqrt(lambda1); - double ax = majorlen / 2 * v0.get(0); - double ay = majorlen / 2 * v0.get(1); - double bx = minorlen / 2 * v1.get(0); - double by = minorlen / 2 * v1.get(1); - // Locale.ROOT: see the WKT note in the Resource overload above. - String centroidWKT = String.format(Locale.ROOT, "POINT(%.4f %.4f)", mx, my); - String majorWKT = String.format(Locale.ROOT, "LINESTRING(%.4f %.4f, %.4f %.4f)", mx - ax, my - ay, mx + ax, my + ay); - String minorWKT = String.format(Locale.ROOT, "LINESTRING(%.4f %.4f, %.4f %.4f)", mx - bx, my - by, mx + bx, my + by); Node graph = Quad.defaultGraphIRI; RDFDatatype wktDT = NodeFactory.getType(GEO.wktLiteral.getURI()); - quads.add(Quad.create(graph, f, HAL.centroid.asNode(), NodeFactory.createLiteralDT(centroidWKT, wktDT))); - quads.add(Quad.create(graph, f, HAL.majorAxis.asNode(), NodeFactory.createLiteralDT(majorWKT, wktDT))); - quads.add(Quad.create(graph, f, HAL.minorAxis.asNode(), NodeFactory.createLiteralDT(minorWKT, wktDT))); - } catch (ParseException ignored) {} + quads.add(Quad.create(graph, f, HAL.centroid.asNode(), NodeFactory.createLiteralDT(centroidWkt(g), wktDT))); + quads.add(Quad.create(graph, f, HAL.majorAxis.asNode(), NodeFactory.createLiteralDT(majorWkt(g), wktDT))); + quads.add(Quad.create(graph, f, HAL.minorAxis.asNode(), NodeFactory.createLiteralDT(minorWkt(g), wktDT))); + } catch (ParseException | RuntimeException e) { + // See the Resource overload: skip-with-warning, never abort the build. + logger.warn("Skipping centroid/axis features for {}: {}", f, e.toString()); + } + } + + private static String centroidWkt(double[] g) { + return String.format(Locale.ROOT, "POINT(%.4f %.4f)", g[0], g[1]); + } + + private static String majorWkt(double[] g) { + return String.format(Locale.ROOT, "LINESTRING(%.4f %.4f, %.4f %.4f)", + g[0] - g[2], g[1] - g[3], g[0] + g[2], g[1] + g[3]); + } + + private static String minorWkt(double[] g) { + return String.format(Locale.ROOT, "LINESTRING(%.4f %.4f, %.4f %.4f)", + g[0] - g[4], g[1] - g[5], g[0] + g[4], g[1] + g[5]); + } + + /** + * {cx, cy, ax, ay, bx, by}: area centroid and the major/minor HALF-axis + * vectors, or null when the net area is zero/degenerate. Exact closed-form + * moments over each ring's edges; ring contributions are sign-normalized so + * the shell adds and every hole subtracts regardless of winding order in + * the source WKT. + */ + private static double[] axes(Polygon poly) { + double area = 0, sumX = 0, sumY = 0, sumX2 = 0, sumY2 = 0, sumXY = 0; + for (int r = -1; r < poly.getNumInteriorRing(); r++) { + Coordinate[] ring = (r < 0 ? poly.getExteriorRing() : poly.getInteriorRingN(r)).getCoordinates(); + double a = 0, sx = 0, sy = 0, x2 = 0, y2 = 0, xy = 0; + for (int i = 0; i < ring.length - 1; i++) { + double x0 = ring[i].x, y0 = ring[i].y; + double x1 = ring[i + 1].x, y1 = ring[i + 1].y; + double cross = x0 * y1 - x1 * y0; + a += cross; + sx += (x0 + x1) * cross; + sy += (y0 + y1) * cross; + x2 += (x0 * x0 + x0 * x1 + x1 * x1) * cross; + y2 += (y0 * y0 + y0 * y1 + y1 * y1) * cross; + xy += (x0 * y1 + 2 * x0 * y0 + 2 * x1 * y1 + x1 * y0) * cross; + } + double sign = ((r < 0) == (a >= 0)) ? 1 : -1; + area += sign * a / 2; + sumX += sign * sx / 6; + sumY += sign * sy / 6; + sumX2 += sign * x2 / 12; + sumY2 += sign * y2 / 12; + sumXY += sign * xy / 24; + } + if (!(area > 0) || !Double.isFinite(area)) { + return null; + } + double cx = sumX / area; + double cy = sumY / area; + // Central second moments per unit area: the region's covariance matrix. + double varX = sumX2 / area - cx * cx; + double varY = sumY2 / area - cy * cy; + double cov = sumXY / area - cx * cy; + double trace = varX + varY; + double det = varX * varY - cov * cov; + double disc = Math.sqrt(Math.max(0, trace * trace - 4 * det)); + double l0 = Math.max(0, (trace + disc) / 2); + double l1 = Math.max(0, (trace - disc) / 2); + double v0x, v0y, v1x, v1y; + if (Math.abs(cov) < 1e-12) { + if (varX >= varY) { v0x = 1; v0y = 0; v1x = 0; v1y = 1; } + else { v0x = 0; v0y = 1; v1x = 1; v1y = 0; } + } else { + v0x = cov; v0y = l0 - varX; + double n0 = Math.hypot(v0x, v0y); + v0x /= n0; v0y /= n0; + v1x = cov; v1y = l1 - varX; + double n1 = Math.hypot(v1x, v1y); + v1x /= n1; v1y /= n1; + } + if (v0x < 0) { v0x = -v0x; v0y = -v0y; } + if (v1x < 0) { v1x = -v1x; v1y = -v1y; } + // Half-axis = (4*sqrt(λ)) / 2, the pyradiomics full axis length halved. + double ax = 2 * Math.sqrt(l0) * v0x; + double ay = 2 * Math.sqrt(l0) * v0y; + double bx = 2 * Math.sqrt(l1) * v1x; + double by = 2 * Math.sqrt(l1) * v1y; + return new double[]{cx, cy, ax, ay, bx, by}; } } diff --git a/src/main/java/com/ebremer/beakgraph/features/ShapeAnalysis.java b/src/main/java/com/ebremer/beakgraph/features/ShapeAnalysis.java index baab355e..a054afef 100644 --- a/src/main/java/com/ebremer/beakgraph/features/ShapeAnalysis.java +++ b/src/main/java/com/ebremer/beakgraph/features/ShapeAnalysis.java @@ -49,14 +49,20 @@ public static int Area(BufferedImage bi) { public static boolean isEdge(BufferedImage bi, int a, int b) { int c = bi.getRGB(a, b) & 0xFF; if (c>0) { - c = ((bi.getRGB(a+1, b) & 0xFF)>0)?1:0; - c = c + (((bi.getRGB(a-1, b) & 0xFF)>0)?1:0); - c = c + (((bi.getRGB(a, b+1) & 0xFF)>0)?1:0); - c = c + (((bi.getRGB(a, b-1) & 0xFF)>0)?1:0); - return (c!=4); + // Out-of-bounds neighbours count as background, so a filled pixel on + // the image border is an edge instead of an ArrayIndexOutOfBounds. + int n = filled(bi, a+1, b) + filled(bi, a-1, b) + filled(bi, a, b+1) + filled(bi, a, b-1); + return (n!=4); } return false; } + + private static int filled(BufferedImage bi, int x, int y) { + if (x < 0 || y < 0 || x >= bi.getWidth() || y >= bi.getHeight()) { + return 0; + } + return ((bi.getRGB(x, y) & 0xFF) > 0) ? 1 : 0; + } public static int Circumference(BufferedImage bi) { int count = 0; @@ -223,12 +229,17 @@ public static double[] getPrincipalAxes(SimpleMatrix points, double refX, double } public static BufferedImage getBufferedImage(Polygon p) { - Geometry bb = p.getEnvelope(); - Coordinate[] c = bb.getCoordinates(); - int width = (int) Math.round(c[2].x-c[0].x); - int height = (int) Math.round(c[2].y - c[0].y); + // Dimensions come from the Envelope, not getEnvelope()'s coordinate array: + // a degenerate (point/line) envelope has fewer than 3 coordinates (the old + // c[2] access threw), and a valid polygon thinner than ~0.5 units rounded + // to a 0-sized image (BufferedImage rejects it) - either way ALL features + // were skipped, including the purely polygon-based ones. Clamping to 1px + // keeps the raster features defined and the polygon features exact. + org.locationtech.jts.geom.Envelope env = p.getEnvelopeInternal(); + int width = Math.max(1, (int) Math.round(env.getWidth())); + int height = Math.max(1, (int) Math.round(env.getHeight())); AffineTransformation af = new AffineTransformation(); - af.setToTranslation(-c[0].x, -c[0].y); + af.setToTranslation(-env.getMinX(), -env.getMinY()); // transform() returns a translated copy (it does not mutate p, which the caller // still uses for its other feature calcs). Draw that copy, shifted so the polygon's // bounding-box corner sits at (0,0) and lands inside the width x height image - diff --git a/src/main/java/com/ebremer/beakgraph/features/pyradiomics/Gen2DFeatures.java b/src/main/java/com/ebremer/beakgraph/features/pyradiomics/Gen2DFeatures.java index a8f6befd..57f787cc 100644 --- a/src/main/java/com/ebremer/beakgraph/features/pyradiomics/Gen2DFeatures.java +++ b/src/main/java/com/ebremer/beakgraph/features/pyradiomics/Gen2DFeatures.java @@ -9,27 +9,34 @@ import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Polygon; import org.locationtech.jts.io.WKTReader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class Gen2DFeatures { + private static final Logger logger = LoggerFactory.getLogger(Gen2DFeatures.class); public static void generate(Resource geo, String wktPolygon) { try { GeometryFactory gf = new GeometryFactory(); Polygon p = (Polygon) new WKTReader(gf).read(wktPolygon); java.awt.image.BufferedImage bi = ShapeAnalysis.getBufferedImage(p); org.ejml.simple.SimpleMatrix pts = ShapeAnalysis.BufferedImage2INDArray(bi); - geo.addProperty(PYR.MeshSurface, ResourceFactory.createTypedLiteral(ShapeAnalysis.getMeshSurfaceFeatureValue(p))); - geo.addProperty(PYR.PixelSurface, ResourceFactory.createTypedLiteral(ShapeAnalysis.getPixelSurfaceFeatureValue(bi))); - geo.addProperty(PYR.Perimeter, ResourceFactory.createTypedLiteral(ShapeAnalysis.getPerimeter(p))); - geo.addProperty(PYR.PerimeterSurfaceRatio, ResourceFactory.createTypedLiteral(ShapeAnalysis.getPerimeterSurfaceRatioFeatureValue(p))); - geo.addProperty(PYR.Sphericity, ResourceFactory.createTypedLiteral(ShapeAnalysis.getSphericityFeatureValue(p))); - geo.addProperty(PYR.SphericalDisproportion, ResourceFactory.createTypedLiteral(ShapeAnalysis.getSphericalDisproportionFeatureValue(p))); - geo.addProperty(PYR.Maximum2DDiameter, ResourceFactory.createTypedLiteral(ShapeAnalysis.getMaximum2DDiameterFeatureValue(p))); - geo.addProperty(PYR.MajorAxisLength, ResourceFactory.createTypedLiteral(ShapeAnalysis.getMajorAxisLengthFeatureValue(pts))); - geo.addProperty(PYR.MinorAxisLength, ResourceFactory.createTypedLiteral(ShapeAnalysis.getMinorAxisLengthFeatureValue(pts))); - geo.addProperty(PYR.Elongation, ResourceFactory.createTypedLiteral(ShapeAnalysis.getElongationFeatureValue(pts))); - } catch (Exception e) {} + addFinite(geo, PYR.MeshSurface, ShapeAnalysis.getMeshSurfaceFeatureValue(p)); + addFinite(geo, PYR.PixelSurface, ShapeAnalysis.getPixelSurfaceFeatureValue(bi)); + addFinite(geo, PYR.Perimeter, ShapeAnalysis.getPerimeter(p)); + addFinite(geo, PYR.PerimeterSurfaceRatio, ShapeAnalysis.getPerimeterSurfaceRatioFeatureValue(p)); + addFinite(geo, PYR.Sphericity, ShapeAnalysis.getSphericityFeatureValue(p)); + addFinite(geo, PYR.SphericalDisproportion, ShapeAnalysis.getSphericalDisproportionFeatureValue(p)); + addFinite(geo, PYR.Maximum2DDiameter, ShapeAnalysis.getMaximum2DDiameterFeatureValue(p)); + addFinite(geo, PYR.MajorAxisLength, ShapeAnalysis.getMajorAxisLengthFeatureValue(pts)); + addFinite(geo, PYR.MinorAxisLength, ShapeAnalysis.getMinorAxisLengthFeatureValue(pts)); + addFinite(geo, PYR.Elongation, ShapeAnalysis.getElongationFeatureValue(pts)); + } catch (Exception e) { + // A geometry whose features cannot be computed is skipped - but never + // silently: silently-missing features read as "no data" downstream. + logger.warn("Failed to generate 2D shape features for {}: {}", geo, e.toString()); + } } - + public static void generate(ArrayList quads, Node geo, String wkt) { try { GeometryFactory gf = new GeometryFactory(); @@ -37,16 +44,41 @@ public static void generate(ArrayList quads, Node geo, String wkt) { java.awt.image.BufferedImage bi = ShapeAnalysis.getBufferedImage(p); org.ejml.simple.SimpleMatrix pts = ShapeAnalysis.BufferedImage2INDArray(bi); Node graph = Quad.defaultGraphIRI; - quads.add(Quad.create(graph, geo, PYR.MeshSurface.asNode(), ResourceFactory.createTypedLiteral(ShapeAnalysis.getMeshSurfaceFeatureValue(p)).asNode())); - quads.add(Quad.create(graph, geo, PYR.PixelSurface.asNode(), ResourceFactory.createTypedLiteral(ShapeAnalysis.getPixelSurfaceFeatureValue(bi)).asNode())); - quads.add(Quad.create(graph, geo, PYR.Perimeter.asNode(), ResourceFactory.createTypedLiteral(ShapeAnalysis.getPerimeter(p)).asNode())); - quads.add(Quad.create(graph, geo, PYR.PerimeterSurfaceRatio.asNode(), ResourceFactory.createTypedLiteral(ShapeAnalysis.getPerimeterSurfaceRatioFeatureValue(p)).asNode())); - quads.add(Quad.create(graph, geo, PYR.Sphericity.asNode(), ResourceFactory.createTypedLiteral(ShapeAnalysis.getSphericityFeatureValue(p)).asNode())); - quads.add(Quad.create(graph, geo, PYR.SphericalDisproportion.asNode(), ResourceFactory.createTypedLiteral(ShapeAnalysis.getSphericalDisproportionFeatureValue(p)).asNode())); - quads.add(Quad.create(graph, geo, PYR.Maximum2DDiameter.asNode(), ResourceFactory.createTypedLiteral(ShapeAnalysis.getMaximum2DDiameterFeatureValue(p)).asNode())); - quads.add(Quad.create(graph, geo, PYR.MajorAxisLength.asNode(), ResourceFactory.createTypedLiteral(ShapeAnalysis.getMajorAxisLengthFeatureValue(pts)).asNode())); - quads.add(Quad.create(graph, geo, PYR.MinorAxisLength.asNode(), ResourceFactory.createTypedLiteral(ShapeAnalysis.getMinorAxisLengthFeatureValue(pts)).asNode())); - quads.add(Quad.create(graph, geo, PYR.Elongation.asNode(), ResourceFactory.createTypedLiteral(ShapeAnalysis.getElongationFeatureValue(pts)).asNode())); - } catch (Exception e) {} + addFinite(quads, graph, geo, PYR.MeshSurface.asNode(), ShapeAnalysis.getMeshSurfaceFeatureValue(p)); + addFinite(quads, graph, geo, PYR.PixelSurface.asNode(), ShapeAnalysis.getPixelSurfaceFeatureValue(bi)); + addFinite(quads, graph, geo, PYR.Perimeter.asNode(), ShapeAnalysis.getPerimeter(p)); + addFinite(quads, graph, geo, PYR.PerimeterSurfaceRatio.asNode(), ShapeAnalysis.getPerimeterSurfaceRatioFeatureValue(p)); + addFinite(quads, graph, geo, PYR.Sphericity.asNode(), ShapeAnalysis.getSphericityFeatureValue(p)); + addFinite(quads, graph, geo, PYR.SphericalDisproportion.asNode(), ShapeAnalysis.getSphericalDisproportionFeatureValue(p)); + addFinite(quads, graph, geo, PYR.Maximum2DDiameter.asNode(), ShapeAnalysis.getMaximum2DDiameterFeatureValue(p)); + addFinite(quads, graph, geo, PYR.MajorAxisLength.asNode(), ShapeAnalysis.getMajorAxisLengthFeatureValue(pts)); + addFinite(quads, graph, geo, PYR.MinorAxisLength.asNode(), ShapeAnalysis.getMinorAxisLengthFeatureValue(pts)); + addFinite(quads, graph, geo, PYR.Elongation.asNode(), ShapeAnalysis.getElongationFeatureValue(pts)); + } catch (Exception e) { + logger.warn("Failed to generate 2D shape features for {}: {}", geo, e.toString()); + } + } + + /** + * Emit a feature only when its value is a real number. Degenerate geometry + * (a zero-area bowtie, say) drives the ratio features to Infinity/NaN, and + * an "INF"^^xsd:double literal stored as a real feature value poisons every + * numeric consumer downstream; the finite features of the same geometry are + * still emitted. + */ + private static void addFinite(Resource geo, org.apache.jena.rdf.model.Property feature, double value) { + if (Double.isFinite(value)) { + geo.addProperty(feature, ResourceFactory.createTypedLiteral(value)); + } else { + logger.warn("Skipping non-finite feature {} for {}", feature.getLocalName(), geo); + } + } + + private static void addFinite(ArrayList quads, Node graph, Node geo, Node feature, double value) { + if (Double.isFinite(value)) { + quads.add(Quad.create(graph, geo, feature, ResourceFactory.createTypedLiteral(value).asNode())); + } else { + logger.warn("Skipping non-finite feature {} for {}", feature, geo); + } } } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/BitPackedUnSignedLongBuffer.java b/src/main/java/com/ebremer/beakgraph/hdf5/BitPackedUnSignedLongBuffer.java index 18e5510b..0267c3c9 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/BitPackedUnSignedLongBuffer.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/BitPackedUnSignedLongBuffer.java @@ -1,5 +1,6 @@ package com.ebremer.beakgraph.hdf5; +import com.ebremer.beakgraph.utils.UTIL; import io.jhdf.api.WritableDataset; import io.jhdf.api.WritableGroup; import java.io.ByteArrayOutputStream; @@ -117,70 +118,35 @@ public long select1(long rank) { } /** - * Finds the index (0-63) of the k-th set bit in a 64-bit word using Broadword Selection. - * This is strictly O(1) -- exactly 6 checks, no loops. - * * @param word The 64-bit word (Big Endian context). - * @param k The rank to find (1-based). - * @return The 0-based index of the k-th set bit (from MSB). + * Finds the index (0-63, from the MSB) of the k-th set bit in a word. + * Delegates to the shared broadword implementation so this linear select1 + * and HDTBitmapDirectory's accelerated select1 can never disagree. */ private int selectInWordSafe(long word, long k) { - int result = 0; - int cnt; - // Check top 32 bits - // shift right to isolate the top 32 bits. - cnt = Long.bitCount(word >>> 32); - if (k > cnt) { - // The target is NOT in the top 32. It's in the lower 32. - // Move the lower 32 bits up, add 32 to our result index, and subtract the count we skipped. - word <<= 32; - result += 32; - k -= cnt; - } - // Check top 16 bits (of the remaining word) - cnt = Long.bitCount(word >>> 48); - if (k > cnt) { - word <<= 16; - result += 16; - k -= cnt; - } - // Check top 8 bits - cnt = Long.bitCount(word >>> 56); - if (k > cnt) { - word <<= 8; - result += 8; - k -= cnt; - } - // Check top 4 bits - cnt = Long.bitCount(word >>> 60); - if (k > cnt) { - word <<= 4; - result += 4; - k -= cnt; - } - // Check top 2 bits - cnt = Long.bitCount(word >>> 62); - if (k > cnt) { - word <<= 2; - result += 2; - k -= cnt; - } - // Check top 1 bit - // If k > cnt (where cnt is 0 or 1), it means the target is the 2nd bit of this pair. - cnt = Long.bitCount(word >>> 63); - if (k > cnt) { - result += 1; - } - return result; + return UTIL.selectInWord(word, k); } // --- WRITE METHODS --- public void writeInteger(int value) { + // Reject values whose bit pattern would not survive the width mask - silent + // truncation here corrupts the dictionary far from the cause. Widths 32 and + // 64 are exempt for negatives: the full two's-complement pattern round-trips + // (the reader casts back to int/long). + if (bitWidth != 32 && bitWidth != 64 && (value < 0 || value > ((1L << bitWidth) - 1))) { + throw new IllegalArgumentException( + "Value " + value + " does not fit in " + bitWidth + " bits"); + } putValue(value & ((bitWidth == 64) ? -1L : (1L << bitWidth) - 1)); numEntries++; } public void writeLong(long value) { + // See writeInteger: only width 64 carries a negative long's full pattern. + if (bitWidth != 64 && (value < 0 || value > ((1L << bitWidth) - 1))) { + throw new IllegalArgumentException( + "Value " + value + " does not fit in " + bitWidth + " bits"); + } putValue(value & ((bitWidth == 64) ? -1L : (1L << bitWidth) - 1)); numEntries++; } @@ -351,14 +317,18 @@ public void add(WritableGroup group) { } public long binarySearch(long start, long end, long value) { - long low = start; + long low = start; long high = end; while (low <= high) { long mid = (low + high) >>> 1; long midVal = get(mid); // Internal get is bit-unpacked - if (midVal < value) { + // Unsigned comparison, matching lowerBound/upperBound: the stored + // values are unsigned bit patterns, and mixing signed search with + // unsigned bounds on the same buffer invites subtle disagreement. + int cmp = Long.compareUnsigned(midVal, value); + if (cmp < 0) { low = mid + 1; - } else if (midVal > value) { + } else if (cmp > 0) { high = mid - 1; } else { return mid; // Value found @@ -465,8 +435,11 @@ public boolean tryAdvance(java.util.function.LongConsumer action) { while (accCount < bitWidth) { if (!localBuf.hasRemaining()) { - // This handles potential padding/truncation issues - break; + // A buffer too short for its declared entry count is corrupt. + // Fail loudly like the sequential reader does - the old break + // left accCount < bitWidth, making the shift below negative + // (mod-64) and emitting silent garbage values. + throw new BufferUnderflowException(); } acc = (acc << 8) | (localBuf.get() & 0xFFL); accCount += 8; diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/Buffer.java b/src/main/java/com/ebremer/beakgraph/hdf5/Buffer.java deleted file mode 100644 index cc291a92..00000000 --- a/src/main/java/com/ebremer/beakgraph/hdf5/Buffer.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.ebremer.beakgraph.hdf5; - -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; - -public class Buffer { - private ByteArrayOutputStream mainbuffer; - private List entries; - - public Buffer() { - mainbuffer = new ByteArrayOutputStream(); - entries = new ArrayList<>(); - } - - public void add(String element) { - int startPosition = mainbuffer.size(); - byte[] bytes = element.getBytes(StandardCharsets.UTF_8); - mainbuffer.write(bytes, 0, bytes.length); - entries.add(new EntryMetadata(startPosition, DataType.STRING)); - } - - public void add(float f) { - int startPosition = mainbuffer.size(); - ByteBuffer buffer = ByteBuffer.allocate(Float.BYTES); - buffer.putFloat(f); - mainbuffer.write(buffer.array(), 0, Float.BYTES); - entries.add(new EntryMetadata(startPosition, DataType.FLOAT)); - } - - public void add(double d) { - int startPosition = mainbuffer.size(); - ByteBuffer buffer = ByteBuffer.allocate(Double.BYTES); - buffer.putDouble(d); - mainbuffer.write(buffer.array(), 0, Double.BYTES); - entries.add(new EntryMetadata(startPosition, DataType.DOUBLE)); - } - - public void add(int n) { - int startPosition = mainbuffer.size(); - ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES); - buffer.putInt(n); - mainbuffer.write(buffer.array(), 0, Integer.BYTES); - entries.add(new EntryMetadata(startPosition, DataType.INTEGER)); - } - - public void add(long n) { - int startPosition = mainbuffer.size(); - ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); - buffer.putLong(n); - mainbuffer.write(buffer.array(), 0, Long.BYTES); - entries.add(new EntryMetadata(startPosition, DataType.LONG)); - } - - public int size() { - return mainbuffer.size(); - } - - private enum DataType { - STRING, - FLOAT, - DOUBLE, - INTEGER, - LONG - } - - private record EntryMetadata(int startPosition, DataType type) {} -} \ No newline at end of file diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/Index.java b/src/main/java/com/ebremer/beakgraph/hdf5/Index.java index fba2a4d5..67f5631d 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/Index.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/Index.java @@ -4,8 +4,14 @@ import org.apache.jena.sparql.core.Quad; import java.util.Comparator; +/** + * The quad orderings BeakGraph materializes. Exactly these two are written and + * read (HDF5Writer / BGIteratorMaster); the other 22 permutations that used to + * be enumerated here were never constructed and were removed in the dead-code + * sweep - add a constant back only together with a writer and an access path + * that use it. + */ public enum Index { - // === G Indexes (Graph first) === GSPO { // Graph, Subject, Predicate, Object @Override public Comparator getComparator() { @@ -16,16 +22,6 @@ public Comparator getComparator() { .thenComparing(Quad::getObject, NodeComparator.INSTANCE); } }, - GPSO { // Graph, Predicate, Subject, Object - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE); - } - }, GPOS { // Graph, Predicate, Object, Subject @Override public Comparator getComparator() { @@ -35,223 +31,7 @@ public Comparator getComparator() { .thenComparing(Quad::getObject, NodeComparator.INSTANCE) .thenComparing(Quad::getSubject, NodeComparator.INSTANCE); } - }, - GOSP { // Graph, Object, Subject, Predicate - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE); - } - }, - GSOE { // Graph, Subject, Object, Predicate - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE); - } - }, - GOPS { // Graph, Object, Predicate, Subject - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE); - } - }, - - // === S Indexes (Subject first) === - SGPO { // Subject, Graph, Predicate, Object - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE); - } - }, - SGOP { // Subject, Graph, Object, Predicate - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE); - } - }, - SPGO { // Subject, Predicate, Graph, Object - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE); - } - }, - SPOG { // Subject, Predicate, Object, Graph - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE); - } - }, - SOGP { // Subject, Object, Graph, Predicate - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE); - } - }, - SOPG { // Subject, Object, Predicate, Graph - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE); - } - }, - - // === P Indexes (Predicate first) === - PSGO { // Predicate, Subject, Graph, Object - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE); - } - }, - PSOG { // Predicate, Subject, Object, Graph - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE); - } - }, - PGSO { // Predicate, Graph, Subject, Object - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE); - } - }, - PGOS { // Predicate, Graph, Object, Subject - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE); - } - }, - POSG { // Predicate, Object, Subject, Graph - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE); - } - }, - POGS { // Predicate, Object, Graph, Subject - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE); - } - }, - - // === O Indexes (Object first) === - OPSG { // Object, Predicate, Subject, Graph - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE); - } - }, - OGSP { // Object, Graph, Subject, Predicate - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE); - } - }, - OGPS { // Object, Graph, Predicate, Subject - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE); - } - }, - OSGP { // Object, Subject, Graph, Predicate - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE); - } - }, - OSPG { // Object, Subject, Predicate, Graph - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE); - } - }, - OPGS { // Object, Predicate, Graph, Subject - @Override - public Comparator getComparator() { - return Comparator - .comparing(Quad::getObject, NodeComparator.INSTANCE) - .thenComparing(Quad::getPredicate, NodeComparator.INSTANCE) - .thenComparing(Quad::getGraph, NodeComparator.INSTANCE) - .thenComparing(Quad::getSubject, NodeComparator.INSTANCE); - } }; public abstract Comparator getComparator(); -} \ No newline at end of file +} diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorMaster.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorMaster.java index a42a7de4..52b4ef2f 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorMaster.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorMaster.java @@ -63,21 +63,41 @@ public BGIteratorMaster(HDF5Reader reader, PositionalDictionaryReader dict, Bind } } else { // G is an unbound variable. Scan only the actual graphs (the columnar - // `graphs` list), not every entity: getGraphs().streamNodes() would also - // yield every URI/BNode in S/O positions, creating one (almost always empty) - // sub-iterator per entity. Bind the graph variable to each graph too, since - // each per-graph sub-iterator only ever sees a concrete graph. + // `graphs` list), not every entity - and LAZILY: constructing every + // graph's sub-iterator up front paid each one's index binary searches + // before the first row came back (spatial stores hold thousands of + // tile graphs). The graph id is taken straight from the columnar list + // (no extract() -> locate() round trip) and pre-bound in a child + // binding: every concrete iterator resolves a pre-bound graph var, + // the binding rides into every result row, and a pattern that also + // uses the var (GRAPH ?g { ?g ?p ?o }) is constrained through the + // ordinary bound-variable substitution instead of a post-filter. Var gVar = Var.alloc(quad.getGraph()); - dict.streamGraphs().forEach(n -> { - Iterator sub = new BGIteratorMaster(reader, dict, bnid, - new Quad(n, quad.getSubject(), quad.getPredicate(), quad.getObject()), filter, nodeTable); - NodeId gId = new NodeId(dict.getGraphs().locate(n), NodeType.GRAPH); - // The graph variable may also occur inside the pattern (e.g. - // GRAPH ?g { ?g ?p ?o }); a row whose pattern binding conflicts - // with this graph must be dropped, not silently kept. - its.add(Iter.removeNulls(Iter.map(sub, - b -> b.putCompatible(gVar, gId, nodeTable) ? b : null))); - }); + // GRAPH/SUBJECT/OBJECT share the universal entity id-space, so a + // pre-bound graph id is valid in those positions - but PREDICATE ids + // live in an isolated dictionary. If the graph var also occupies the + // predicate position, fall back to concrete-graph substitution with + // the cross-space compatibility filter. + boolean gVarInPredicate = quad.getPredicate().isVariable() + && quad.getPredicate().getName().equals(gVar.getName()); + if (gVarInPredicate) { + Iterator graphNodes = dict.streamGraphs().iterator(); + its.add(Iter.flatMap(graphNodes, n -> { + NodeId gId = new NodeId(dict.getGraphs().locate(n), NodeType.GRAPH); + Iterator sub = new BGIteratorMaster(reader, dict, bnid, + new Quad(n, quad.getSubject(), quad.getPredicate(), quad.getObject()), filter, nodeTable); + return Iter.removeNulls(Iter.map(sub, + b -> b.putCompatible(gVar, gId, nodeTable) ? b : null)); + })); + } else { + Iterator graphIds = dict.streamGraphIds() + .mapToObj(gid -> new NodeId(gid, NodeType.GRAPH)).iterator(); + its.add(Iter.flatMap(graphIds, gId -> { + BindingNodeId child = new BindingNodeId(bnid); + child.put(gVar, gId); + return new BGIteratorMaster(reader, dict, child, quad, filter, nodeTable); + })); + } } chain = new IteratorChain<>(its); } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorOS.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorOS.java index c19483ec..b03e6ba4 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorOS.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorOS.java @@ -119,15 +119,19 @@ public BGIteratorOS(PositionalDictionaryReader dict, IndexReader reader, Binding // F. Initialize if (specificSubId > 0) { - boolean found = false; - for (long k = i; k < j; k++) { - if (Ss.get(k) == specificSubId) { - i = k; - found = true; - break; - } + // The subject list under one (G,P,O) group is sorted ascending (GPOS + // ordering), so binary-search it instead of the previous linear scan. + long lo = i, hi = j - 1, found = -1; + while (lo <= hi) { + long mid = (lo + hi) >>> 1; + long v = Ss.get(mid); + if (v == specificSubId) { found = mid; break; } + if (v < specificSubId) lo = mid + 1; else hi = mid - 1; + } + if (found >= 0) { + i = found; + hasNext = true; } - hasNext = found; } else { advanceToNextValid(); } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorSPO_All.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorSPO_All.java index 73287347..1a956bea 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorSPO_All.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGIteratorSPO_All.java @@ -59,7 +59,18 @@ public BGIteratorSPO_All(PositionalDictionaryReader dict, IndexReader reader, Bi analyzeFilters(filter, dict, quad); } - gi = dict.getGraphs().locate(quad.getGraph()); + // Resolve the graph the same way the other three iterators behind + // BGIteratorMaster do: the dispatcher also routes here when the graph + // VARIABLE is pre-bound in the BindingNodeId, and locate() on the raw + // variable node returns -1 - silently yielding nothing for a graph + // that exists. + if (quad.getGraph().isVariable()) { + gi = (bnid != null && bnid.containsKey(Var.alloc(quad.getGraph()))) + ? bnid.get(Var.alloc(quad.getGraph())).getId() + : -1; + } else { + gi = dict.getGraphs().locate(quad.getGraph()); + } if (gi < 1) return; // Honour concrete subject / object terms named directly in the triple diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGReader.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGReader.java index ef5a4c07..9c65b011 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGReader.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BGReader.java @@ -4,25 +4,24 @@ import com.ebremer.beakgraph.core.GSPODictionary; import java.net.URI; import java.util.Iterator; -import java.util.stream.Stream; import org.apache.jena.graph.Node; import org.apache.jena.graph.Triple; -import org.apache.jena.sparql.core.Quad; import org.apache.jena.sparql.expr.ExprList; import org.apache.jena.util.iterator.ExtendedIterator; /** + * Read-side storage contract. (Two former members - getNumberOfTriples and + * streamQuads - were stubs that answered 0 / empty and had no callers; they + * were removed rather than left to mislead.) * * @author Erich Bremer */ public interface BGReader extends AutoCloseable { public GSPODictionary getDictionary(); - public int getNumberOfTriples(String ng); public NodeTable getNodeTable(); public Iterator read(Node ng, BindingNodeId bnid, Triple triple, ExprList filter, NodeTable nodeTable); public ExtendedIterator graphBaseFind(Node graph, Triple tp); public Iterator listGraphNodes(); - public Stream streamQuads(); public boolean containsGraph(Node graphNode); public URI getURI(); diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingBG.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingBG.java index 472e7c2c..cd7d5e31 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingBG.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingBG.java @@ -2,6 +2,7 @@ import com.ebremer.beakgraph.core.BeakGraph; import java.util.Iterator; +import org.apache.jena.atlas.iterator.Iter; import org.apache.jena.graph.Node; import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.engine.binding.Binding; @@ -14,28 +15,45 @@ * * @author erich */ -public class BindingBG extends BindingBase { +public class BindingBG extends BindingBase { private final BeakGraph bGraph; private final BindingNodeId idBinding; + private final Binding parent; private static final Logger logger = LoggerFactory.getLogger(BindingBG.class); - + public BindingBG(BindingNodeId idBinding, BeakGraph bGraph) { super(idBinding.getParentBinding()); this.idBinding = idBinding; + this.parent = idBinding.getParentBinding(); this.bGraph = bGraph; } - + public BindingNodeId getBindingId() { return idBinding ; } - + + /** + * Whether this level of the binding exposes {@code var}. BindingBase's + * contract is that a child never re-binds a parent var - size() is + * size1() + parent.size() and vars() concatenates both levels - but the + * id-map deliberately COPIES every parent var (SolverLibBeak.convert) so + * the solvers can substitute at the id level. Exposing those copies here + * as well double-counted every input var: size() lied, vars() yielded + * duplicates, and DISTINCT could not merge a row of this shape with an + * equal-valued row of normal shape. Parent vars therefore resolve through + * the parent, which carries the identical term the ids were derived from - + * including terms not in this store at all (the "does not exist" ids). + */ + private boolean ownVar(Var var) { + return idBinding.containsKey(var) && (parent == null || !parent.contains(var)); + } + @Override protected Node get1(Var var) { - if (idBinding.containsKey(var)) { + if (ownVar(var)) { NodeId id = idBinding.get(var); - // A var bound to "does not exist" (e.g. a VALUES/BIND term not in this store) - // has no node here; return null so BindingBase falls back to the parent binding, - // which still carries the original term. + // A var bound to "does not exist" has no node here; return null so + // BindingBase falls back to the parent binding. if (NodeId.isDoesNotExist(id)) { return null; } @@ -46,22 +64,29 @@ protected Node get1(Var var) { @Override protected Iterator vars1() { - return idBinding.iterator(); + return Iter.filter(idBinding.iterator(), this::ownVar); } @Override protected int size1() { - return idBinding.size(); + int n = 0; + Iterator it = idBinding.iterator(); + while (it.hasNext()) { + if (ownVar(it.next())) { + n++; + } + } + return n; } @Override protected boolean isEmpty1() { - return idBinding.isEmpty(); + return size1() == 0; } @Override protected boolean contains1(Var var) { - return idBinding.containsKey(var); + return ownVar(var); } /** diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingNodeId.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingNodeId.java index ebd74bbf..3c29e5d5 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingNodeId.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/BindingNodeId.java @@ -2,22 +2,13 @@ import com.ebremer.beakgraph.core.NodeTable; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; -import java.util.Set; import org.apache.jena.atlas.lib.Map2; import org.apache.jena.graph.Node; import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.engine.binding.Binding; public class BindingNodeId extends Map2 { - public static BindingNodeId root = new BindingNodeId(null, null, null) { - @Override - public String toString() { - return ""; - } - }; - // This is the parent binding - which may be several steps up the chain. // This just carried around for later use when we go BindingNodeId back to Binding. private final Binding parentBinding; @@ -106,32 +97,6 @@ private static boolean sameTerm(NodeId a, NodeId b, NodeTable nodeTable) { return na != null && na.equals(nb); } - public void putAll(BindingNodeId other) { - Iterator vIter = other.iterator(); - for (; vIter.hasNext() ; ) { - Var v = vIter.next(); - if ( v == null ) - throw new IllegalArgumentException("Null key"); - NodeId n = other.get(v); - if ( n == null ) - throw new IllegalArgumentException("("+v+","+n+")"); - super.put(v, n); - } - } - - /** - * Returns a Set of entries representing all bindings (local + parent). - * Added to support iteration in BGIterator classes. - * @return - */ - public Set> entrySet() { - Map allEntries = new HashMap<>(); - for (Var v : this) { - allEntries.put(v, get(v)); - } - return allEntries.entrySet(); - } - @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/HilbertPolygon.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/HilbertPolygon.java index 812e04cc..76da9c6a 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/HilbertPolygon.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/HilbertPolygon.java @@ -9,7 +9,6 @@ import org.locationtech.jts.geom.Envelope; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Polygon; -import org.locationtech.jts.geom.Coordinate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,11 +37,12 @@ public static ArrayList Polygon2Hilbert(Polygon poly) { public static ArrayList Polygon2Hilbert(Polygon poly, int scale) { Envelope env = poly.getEnvelopeInternal(); - // 1. Calculate scaled integer bounds - long minX = (long) Math.floor(env.getMinX()) >> scale; - long maxX = (long) Math.floor(env.getMaxX()) >> scale; - long minY = (long) Math.floor(env.getMinY()) >> scale; - long maxY = (long) Math.floor(env.getMaxY()) >> scale; + // 1. Calculate scaled integer bounds, clamped into the curve's domain + // (negative or >= 2^31 coordinates would otherwise alias via bit masking). + long minX = HilbertSpace.clampToDomain((long) Math.floor(env.getMinX())) >> scale; + long maxX = HilbertSpace.clampToDomain((long) Math.floor(env.getMaxX())) >> scale; + long minY = HilbertSpace.clampToDomain((long) Math.floor(env.getMinY())) >> scale; + long maxY = HilbertSpace.clampToDomain((long) Math.floor(env.getMaxY())) >> scale; // 2. Execute query. We use .stream() to get the ranges. // This is the most common API for davidmoten's hilbert-curve query builder. @@ -61,16 +61,33 @@ public static ArrayList Polygon2Hilbert(Polygon poly, int scale) { return compact(filteredRanges); } + /** Cap on per-range cell tests; longer ranges are kept outright (superset-safe). */ + private static final int MAX_RELEVANCE_CELLS = 64; + + /** + * Whether any WHOLE CELL of the range intersects the polygon. The old test + * asked whether the polygon covers the range's two endpoint cell-corner + * POINTS, which dropped ranges the geometry genuinely intersects - any + * polygon smaller than a cell returned an EMPTY cover, and diagonal strips + * lost their interior cells: silent false negatives for every consumer of + * this Polygon-to-Hilbert API. Keeping a range can only add false + * positives, never lose a match, so ranges longer than the cap are kept + * without examination. + */ private static boolean isRangeRelevant(Range range, Polygon poly, int scale) { - // Check the start point of the range - long[] startCoord = hc.point(range.low()); - if (poly.covers(gf.createPoint(new Coordinate(startCoord[0] << scale, startCoord[1] << scale)))) { + if (range.high() - range.low() + 1 > MAX_RELEVANCE_CELLS) { return true; } - - // Check the end point of the range - long[] endCoord = hc.point(range.high()); - return poly.covers(gf.createPoint(new Coordinate(endCoord[0] << scale, endCoord[1] << scale))); + double cellSize = (double) (1L << scale); + for (long d = range.low(); d <= range.high(); d++) { + long[] p = hc.point(d); + double x = (double) (p[0] << scale); + double y = (double) (p[1] << scale); + if (poly.intersects(gf.toGeometry(new Envelope(x, x + cellSize, y, y + cellSize)))) { + return true; + } + } + return false; } /** diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/NumScale.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/NumScale.java deleted file mode 100644 index 12742e05..00000000 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/NumScale.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.ebremer.beakgraph.hdf5.jena; - -/** - * Utility class to calculate image scaling requirements. - */ -public class NumScale { - - /** - * Calculates reduction steps using a loop (Iterative approach). - * This is generally preferred for this use case because it avoids floating-point - * precision errors entirely and N is very small (rarely > 10). - * @param width - */ - public static int calculateScaleSteps(int width, int height, int boxSize) { - if (width <= 0 || height <= 0 || boxSize <= 0) { - System.err.println("Error: Dimensions must be greater than 0."); - return -1; - } - - int steps = 0; - double currentMaxDimension = Math.max(width, height); - - while (currentMaxDimension > boxSize) { - currentMaxDimension = currentMaxDimension / 2.0; - steps++; - } - - return steps; - } - - /** - * Calculates reduction steps using Logarithms (Mathematical approach). - * Formula: steps = ceil( log2(maxDimension / boxSize) ) - * * Note: This requires careful handling of floating point precision (epsilon) - * to avoid off-by-one errors when the result is extremely close to an integer. - */ - public static int calculateScaleStepsLog(int width, int height, int boxSize) { - if (width <= 0 || height <= 0 || boxSize <= 0) return -1; - - int maxDim = Math.max(width, height); - - // If it already fits, 0 steps - if (maxDim <= boxSize) return 0; - - // Calculate the ratio (e.g., 1024 / 256 = 4.0) - double ratio = (double) maxDim / boxSize; - - // log2(x) = ln(x) / ln(2) - double stepsExact = Math.log(ratio) / Math.log(2); - - // We subtract a tiny epsilon before ceiling to handle cases where - // floating point noise makes an exact integer result slightly higher. - // e.g., if result is 3.00000000000004, ceil would return 4 without this. - double epsilon = 1e-10; - - return (int) Math.ceil(stepsExact - epsilon); - } -} \ No newline at end of file diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/PatternMatchBG.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/PatternMatchBG.java index fdc4c013..4ada20d2 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/PatternMatchBG.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/PatternMatchBG.java @@ -34,32 +34,24 @@ public static QueryIterator execute(BeakGraph bGraph, BasicPattern bgp, QueryIte List killList = new ArrayList<>(); Iterator chain = Iter.map(input, SolverLibBeak.convFromBinding(bGraph)); - // Check for spatial filter optimization opportunity + // Spatial index acceleration: seed the chain with recall-safe candidates + // for the geometry's subject. The sfIntersects filter itself STAYS in the + // plan (the OpFilter wrapper produced by TransformFilterPlacement) - it is + // the verification stage that removes the candidates' false positives with + // real JTS geometry. The old code removed it, which made the lossy index + // pre-filter the final answer. SpatialContext spatialCtx = getSpatialContext(filter); - ExprList modifiedFilter = filter; - Triple triggerTriple = null; - if (spatialCtx != null) { - triggerTriple = findTriggerTriple(triples, spatialCtx.geometryVar); - + Triple triggerTriple = findTriggerTriple(triples, spatialCtx.geometryVar); if (triggerTriple != null) { - Var varToBind = spatialCtx.geometryVar; - if (triggerTriple.getObject().isVariable() && - triggerTriple.getObject().equals(spatialCtx.geometryVar)) { - if (triggerTriple.getSubject().isVariable()) { - varToBind = (Var) triggerTriple.getSubject(); - } - } - - chain = new SpatialIndexIterator(chain, bGraph, varToBind, spatialCtx); - modifiedFilter = removeSpatialFilter(filter); + chain = new SpatialIndexIterator(chain, bGraph, (Var) triggerTriple.getSubject(), spatialCtx); } } - - // Execute all triple patterns + + // Execute all triple patterns (the ExprList is range-pushdown hints only; + // full filter semantics are enforced by the surrounding OpFilter). for (Triple triple : triples) { - ExprList filterToUse = (triggerTriple != null && triple.equals(triggerTriple)) ? null : modifiedFilter; - chain = solve(bGraph, triple, filterToUse, chain, execCxt); + chain = solve(bGraph, triple, filter, chain, execCxt); chain = makeAbortable(chain, killList); } @@ -171,48 +163,31 @@ private static Integer extractScale(Expr expr) { return null; } - private static ExprList removeSpatialFilter(ExprList filters) { - if (filters == null || filters.isEmpty()) { - return null; - } - - ExprList newFilters = new ExprList(); - - for (Expr e : filters) { - if (e.isFunction()) { - ExprFunction func = e.getFunction(); - if (func instanceof E_Function) { - if (func.getFunctionIRI().equals(SF_INTERSECTS)) { - continue; - } - } - } - newFilters.add(e); - } - - return newFilters.isEmpty() ? null : newFilters; - } - + /** + * The triple whose VARIABLE subject the spatial index can seed. The + * candidates are geometry SUBJECT ids (the writer indexes the subject of + * every quad with a wktLiteral object, so any row that survives the + * sfIntersects verification has its subject in the candidate set - the + * seeding stays recall-safe for any predicate). The geometry variable must + * sit in the OBJECT position: it binds WKT literals, and seeding it - or + * any other position - injects subject ids into a literal slot, so every + * candidate row fails the triple pattern and the query silently returns + * nothing (the old behavior whenever the subject was concrete). With no + * variable subject there is nothing to seed: return null and leave the + * work to the sfIntersects OpFilter, which always stays in the plan - + * skipping the index costs speed, never rows. + */ private static Triple findTriggerTriple(List triples, Var targetVar) { String targetName = targetVar.getName(); - + for (Triple t : triples) { - if (t.getObject().isVariable() && - t.getObject().getName().equals(targetName)) { - return t; - } - - if (t.getSubject().isVariable() && - t.getSubject().getName().equals(targetName)) { - return t; - } - - if (t.getPredicate().isVariable() && - t.getPredicate().getName().equals(targetName)) { + if (t.getObject().isVariable() + && t.getObject().getName().equals(targetName) + && t.getSubject().isVariable()) { return t; } } - + return null; } } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/QueryEngineBeak.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/QueryEngineBeak.java deleted file mode 100644 index fabf614f..00000000 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/QueryEngineBeak.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.ebremer.beakgraph.hdf5.jena; - -import org.apache.jena.query.Query; -import org.apache.jena.sparql.ARQInternalErrorException; -import org.apache.jena.sparql.algebra.Op; -import org.apache.jena.sparql.core.DatasetGraph; -import org.apache.jena.sparql.engine.Plan; -import org.apache.jena.sparql.engine.QueryEngineFactory; -import org.apache.jena.sparql.engine.QueryEngineRegistry; -import org.apache.jena.sparql.engine.binding.Binding; -import org.apache.jena.sparql.engine.main.QueryEngineMain; -import org.apache.jena.sparql.util.Context; - -/** - * - * @author erich - */ -public class QueryEngineBeak extends QueryEngineMain { - protected static final QueryEngineFactory factory = new TQueryEngineFactory() ; - static public QueryEngineFactory getFactory() { return factory; } - static public void register(){ QueryEngineRegistry.addFactory(factory); } - static public void unregister(){ QueryEngineRegistry.removeFactory(factory); } - - public QueryEngineBeak(Query query, DatasetGraph dataset, Binding input, Context context) { - super(query, dataset, input, context); - } - - public QueryEngineBeak(Op op, DatasetGraph dataset, Binding input, Context context) { - super(op, dataset, input, context); - } - - protected static class TQueryEngineFactory implements QueryEngineFactory { - - private static boolean isHandledByBG(DatasetGraph dataset) { - return false ; - } - - @Override - public boolean accept(Query query, DatasetGraph dataset, Context context) { - return isHandledByBG(dataset); - } - - @Override - public boolean accept(Op op, DatasetGraph dataset, Context context) { - return isHandledByBG(dataset); - } - - @Override - public Plan create(Query query, DatasetGraph dataset, Binding initial, Context context) { - QueryEngineBeak engine = new QueryEngineBeak(query, dataset, initial, context); - return engine.getPlan(); - } - - @Override - public Plan create(Op op, DatasetGraph dataset, Binding inputBinding, Context context) { - throw new ARQInternalErrorException("TQueryEngine: factory called directly with an algebra expression"); - } - } -} diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/SimpleNodeTable.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/SimpleNodeTable.java index f854d7a0..e96e6376 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/SimpleNodeTable.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/SimpleNodeTable.java @@ -5,8 +5,11 @@ import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import org.apache.jena.graph.Node; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class SimpleNodeTable implements NodeTable { + private static final Logger logger = LoggerFactory.getLogger(SimpleNodeTable.class); private final PositionalDictionaryReader dict; @@ -85,11 +88,15 @@ public NodeId getNodeIdForNode(Node n) { } NodeId nid = findInDictionaries(n); - + if (nid != NodeId.NodeDoesNotExist) { nodeId2nodemap.put(nid, n); - node2nodeIdmap.put(n, nid); // authoritative, deterministic Node -> NodeId mapping } + // Cache misses too: the store is immutable, so absence is permanent, and + // an uncached miss re-ran up to two dictionary binary searches on every + // lookup of the same foreign term (VALUES/BIND-heavy queries). The shared + // does-not-exist sentinel is deliberately NOT seeded into nodeId2nodemap. + node2nodeIdmap.put(n, nid); // authoritative, deterministic Node -> NodeId mapping return nid; } @@ -128,8 +135,8 @@ public Node getNodeForNodeId(NodeId id) { public void status() { // Caffeine evaluates size concurrently, so we use estimatedSize() - IO.println(String.format("nodeId2nodemap size: %d, node2nodeIdmap size: %d", - nodeId2nodemap.estimatedSize(), node2nodeIdmap.estimatedSize())); + logger.debug("nodeId2nodemap size: {}, node2nodeIdmap size: {}", + nodeId2nodemap.estimatedSize(), node2nodeIdmap.estimatedSize()); } @Override diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/jena/SpatialIndexIterator.java b/src/main/java/com/ebremer/beakgraph/hdf5/jena/SpatialIndexIterator.java index eb20c56b..e01b4b89 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/jena/SpatialIndexIterator.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/jena/SpatialIndexIterator.java @@ -3,140 +3,179 @@ import com.ebremer.beakgraph.Params; import com.ebremer.beakgraph.core.BeakGraph; import com.ebremer.beakgraph.core.NodeTable; +import com.ebremer.beakgraph.hdf5.Index; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.readers.IndexReader; +import com.ebremer.beakgraph.hdf5.readers.PositionalDictionaryReader; +import static com.ebremer.beakgraph.hdf5.writers.PositionalDictionaryWriterBuilder.HILBERT_CELL_NS; +import static com.ebremer.beakgraph.hdf5.writers.PositionalDictionaryWriterBuilder.MAX_INDEX_SCALE; +import com.ebremer.beakgraph.utils.ImageTools; +import com.ebremer.halcyon.hilbert.HilbertSpace; +import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; -import java.util.NoSuchElementException; import org.apache.jena.atlas.iterator.Iter; import org.apache.jena.graph.Node; -import org.apache.jena.query.Dataset; -import org.apache.jena.query.ParameterizedSparqlString; -import org.apache.jena.query.QueryExecution; -import org.apache.jena.query.QueryExecutionFactory; -import org.apache.jena.query.ResultSet; +import org.apache.jena.graph.NodeFactory; +import org.apache.jena.sparql.core.Quad; import org.apache.jena.sparql.core.Var; +import org.apache.jena.sparql.expr.E_GreaterThanOrEqual; +import org.apache.jena.sparql.expr.E_LessThanOrEqual; +import org.apache.jena.sparql.expr.ExprList; +import org.apache.jena.sparql.expr.ExprVar; +import org.apache.jena.sparql.expr.NodeValue; import org.davidmoten.hilbert.Range; +import org.locationtech.jts.geom.Envelope; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.io.WKTReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Optimized SpatialIndexIterator using lazy flatMapping and efficient pool management. - * @author erich + * Recall-safe spatial candidate generator. The writer stores, per geometry + * part, the Hilbert indices of the whole cells covering its bbox at the + * coarsest scale where that cover is small (hal:hilbertCell{scale}). This + * iterator covers the QUERY region's bbox with Hilbert ranges at every scale - + * with the same floor snapping the writer uses - and collects every subject + * whose stored cell falls inside a range, by scanning the GPOS index directly + * with value-range pushdown (no SPARQL sub-execution, no leaked executions). + *

    + * Two bboxes that overlap share at least one whole cell at any scale, so a + * stored geometry overlapping the query region is ALWAYS produced: candidates + * are a superset (bbox-cover overlap), never a miss. Both sides clamp their + * bbox into the non-negative Hilbert domain with the same monotone projection, + * which preserves that overlap for coordinates in negative space too (they + * cluster on the axis cells - coarse, but recall-safe). The geof:sfIntersects + * filter stays in the plan and removes the false positives with real JTS + * geometry. Candidates are deduplicated across scales and ranges, so one + * geometry yields one row. */ public class SpatialIndexIterator implements Iterator { private static final Logger logger = LoggerFactory.getLogger(SpatialIndexIterator.class); + /** Cap on query-side range fragmentation; merging beyond the cap only widens the superset. */ + private static final int MAX_QUERY_RANGES = 256; + private final Iterator outputIterator; - private int scale = 0; public SpatialIndexIterator(Iterator input, BeakGraph bGraph, Var targetVar, PatternMatchBG.SpatialContext context) { - logger.trace("SpatialIndexIterator: {} at scale {}", context.searchRegionWKT, context.scale); - List ranges = HilbertPolygon.Polygon2Hilbert(context.searchRegionWKT, 0); - logger.trace("# of ranges : {}", ranges.size()); - NodeTable currentTable = bGraph.getReader().getNodeTable(); - this.outputIterator = Iter.flatMap(input, parent -> { - Iterator lazyCandidateNodes = new LazyCandidateIterator(ranges, bGraph, context.scale); - - // The target variable may already be bound in the parent row; a - // candidate that conflicts with that binding must be dropped, not - // silently overridden by the parent value. - return Iter.removeNulls(Iter.map(lazyCandidateNodes, node -> { - NodeId nodeId = currentTable.getNodeIdForNode(node); + NodeTable nodeTable = bGraph.getReader().getNodeTable(); + // The candidate set depends only on the (constant) query region, so it is + // computed once and reused for every incoming row - the previous version + // re-ran every range sub-query per parent binding. + final List candidates; + Envelope env = queryEnvelope(context.searchRegionWKT); + if (env != null && bGraph.getReader() instanceof HDF5Reader hdf5) { + candidates = collectCandidates(hdf5, env); + } else { + candidates = List.of(); + } + logger.trace("sfIntersects region {} -> {} candidate geometries", context.searchRegionWKT, candidates.size()); + this.outputIterator = Iter.flatMap(input, parent -> + Iter.removeNulls(Iter.map(candidates.iterator(), id -> { BindingNodeId child = new BindingNodeId(parent); - return child.putCompatible(targetVar, nodeId, currentTable) ? child : null; - })); - }); + // A conflicting pre-existing binding for the target var drops the row. + return child.putCompatible(targetVar, new NodeId(id, NodeType.SUBJECT), nodeTable) ? child : null; + }))); } - @Override - public boolean hasNext() { - return outputIterator.hasNext(); - } - - @Override - public BindingNodeId next() { - return outputIterator.next(); + private static Envelope queryEnvelope(String wkt) { + try { + Geometry g = new WKTReader().read(ImageTools.stripCrs(wkt)); + return g.isEmpty() ? null : g.getEnvelopeInternal(); + } catch (Exception e) { + logger.warn("Unparseable sfIntersects search region; no index candidates: {}", e.getMessage()); + return null; + } } - private static ParameterizedSparqlString buildRangeQuery(Range range, int scale) { - ParameterizedSparqlString pss = new ParameterizedSparqlString( - """ - SELECT DISTINCT ?geo - WHERE { - GRAPH ?spatial { - ?geo hal:hilbertCorner?scale ?index . - FILTER (?index >= ?low && ?index <= ?high) + /** Distinct entity ids of subjects whose stored bbox cells overlap the region's cover. */ + private static List collectCandidates(HDF5Reader reader, Envelope env) { + LinkedHashSet out = new LinkedHashSet<>(); + PositionalDictionaryReader dict = (PositionalDictionaryReader) reader.getDictionary(); + IndexReader gpos = reader.getIndexReader(Index.GPOS); + if (gpos == null) { + return List.of(); + } + NodeTable nodeTable = reader.getNodeTable(); + // Clamp into the [0, 2^31) Hilbert domain with the SAME monotone + // projection the writer applies to geometry bboxes: two boxes that + // overlap still overlap after clamping, so a query region in negative + // (or beyond-2^31) space finds the equally clamped geometries there via + // the domain-edge cells instead of silently returning nothing. False + // positives are removed by the sfIntersects verification stage. + long minX = HilbertSpace.clampToDomain((long) Math.floor(env.getMinX())); + long maxX = HilbertSpace.clampToDomain((long) Math.floor(env.getMaxX())); + long minY = HilbertSpace.clampToDomain((long) Math.floor(env.getMinY())); + long maxY = HilbertSpace.clampToDomain((long) Math.floor(env.getMaxY())); + Var sVar = Var.alloc("hilbertCellSubject"); + Var oVar = Var.alloc("hilbertCellValue"); + for (int s = 0; s <= MAX_INDEX_SCALE; s++) { + Node pred = NodeFactory.createURI(HILBERT_CELL_NS + s); + if (dict.getPredicates().locate(pred) < 1) { + continue; // no geometry stored at this scale + } + long cell = 1L << s; + long[] lo = {Math.floorDiv(minX, cell), Math.floorDiv(minY, cell)}; + long[] hi = {Math.floorDiv(maxX, cell), Math.floorDiv(maxY, cell)}; + for (Range r : coverRanges(lo, hi)) { + ExprList bounds = new ExprList(); + bounds.add(new E_GreaterThanOrEqual(new ExprVar(oVar), + NodeValue.makeNode(NodeFactory.createLiteralByValue(r.low())))); + bounds.add(new E_LessThanOrEqual(new ExprVar(oVar), + NodeValue.makeNode(NodeFactory.createLiteralByValue(r.high())))); + Quad pattern = new Quad(Params.SPATIAL, sVar, pred, oVar); + BGIteratorPOS it = new BGIteratorPOS(dict, gpos, new BindingNodeId(), pattern, bounds, nodeTable); + while (it.hasNext()) { + NodeId sid = it.next().get(sVar); + if (sid != null) { + out.add(sid.getId()); + } } } - """ - ); - pss.setNsPrefix("hal", "https://halcyon.is/ns/"); - pss.setIri("spatial", Params.SPATIALSTRING); - pss.setLiteral("scale", scale); - pss.setLiteral("low", range.low()); - pss.setLiteral("high", range.high()); - return pss; + } + return new ArrayList<>(out); } - private static class LazyCandidateIterator implements Iterator, AutoCloseable { - private final Iterator rangeIterator; - private final BeakGraph bGraph; - private final int scale; - - private QueryExecution currentQexec = null; - private ResultSet currentResultSet = null; - private Node nextNode = null; - - public LazyCandidateIterator(Iterable ranges, BeakGraph bGraph, int scale) { - this.rangeIterator = ranges.iterator(); - this.bGraph = bGraph; - this.scale = scale; - advance(); + /** Hilbert range cover of the cell box [lo, hi], merged and capped (superset-safe). */ + private static List coverRanges(long[] lo, long[] hi) { + ArrayList ranges = new ArrayList<>(); + for (Range r : HilbertSpace.hc.query(lo, hi)) { + ranges.add(r); } - - private void advance() { - nextNode = null; - while (true) { - if (currentResultSet != null && currentResultSet.hasNext()) { - nextNode = currentResultSet.next().get("geo").asNode(); - return; + ranges.sort((a, b) -> Long.compare(a.low(), b.low())); + ArrayList merged = new ArrayList<>(); + Range last = null; + for (Range r : ranges) { + if (last != null && r.low() <= last.high() + 1) { + last = new Range(last.low(), Math.max(last.high(), r.high())); + } else { + if (last != null) { + merged.add(last); } - if (currentQexec != null) { - currentQexec.close(); - currentQexec = null; - currentResultSet = null; - } - if (!rangeIterator.hasNext()) { - return; - } - Range range = rangeIterator.next(); - Dataset ds = bGraph.getDataset(); - ParameterizedSparqlString pss = buildRangeQuery(range, scale); - currentQexec = QueryExecutionFactory.create(pss.asQuery(), ds); - currentResultSet = currentQexec.execSelect(); + last = r; } } - - @Override - public boolean hasNext() { - return nextNode != null; + if (last != null) { + merged.add(last); } - - @Override - public Node next() { - if (nextNode == null) { - throw new NoSuchElementException(); - } - Node current = nextNode; - advance(); - return current; + if (merged.size() > MAX_QUERY_RANGES) { + // Collapse to one spanning range: a wider superset costs extra candidate + // scanning, never recall. + Range one = new Range(merged.get(0).low(), merged.get(merged.size() - 1).high()); + merged = new ArrayList<>(Collections.singletonList(one)); } + return merged; + } - @Override - public void close() { - if (currentQexec != null) { - currentQexec.close(); - currentQexec = null; - currentResultSet = null; - } - } + @Override + public boolean hasNext() { + return outputIterator.hasNext(); + } + + @Override + public BindingNodeId next() { + return outputIterator.next(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/readers/FCDReader.java b/src/main/java/com/ebremer/beakgraph/hdf5/readers/FCDReader.java index 04089d15..447946b5 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/readers/FCDReader.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/readers/FCDReader.java @@ -84,38 +84,10 @@ public String get(long n) { return current; } - public long locate(String x) { - if (numEntries == 0) return -1; - // Binary search for the correct block. - long low = 0; - long high = numBlocks - 1; - while (low <= high) { - long mid = low + (high - low) / 2; - String midHeader = get(mid * blockSize); - int cmp = x.compareTo(midHeader); - if (cmp < 0) high = mid - 1; - else if (cmp > 0) low = mid + 1; - else return mid * blockSize; - } - long candidateBlock = high; - if (candidateBlock < 0) return -1; - // Linear search inside the block. - long blockStart = candidateBlock * blockSize; - long blockEnd = Math.min(blockStart + blockSize, numEntries); - int pos = (int) offsets.getLong((int) candidateBlock * 8); - Fragment frag = readFragment(pos, (int) blockStart); - String current = frag.value(); - pos = frag.nextPos(); - if (current.equals(x)) return blockStart; - for (long i = blockStart + 1; i < blockEnd; i++) { - VByte.DecodeResult pl = VByte.decodeAt(buffer, pos); - int prefixLen = (int) pl.value; - pos = pl.nextOffset; - Fragment suffix = readFragment(pos, (int) i); - current = current.substring(0, prefixLen) + suffix.value(); - pos = suffix.nextPos(); - if (current.equals(x)) return i; - } - return -1; - } + // NOTE: an unused locate(String) lived here that binary-searched blocks by + // String.compareTo. It was removed in the dead-code sweep - and must not be + // reintroduced as-was: the value-ordered dictionaries (strings holding typed + // literals) are NOT ordered by raw string comparison, so its block search was + // wrong for them. Term lookup goes through MultiTypeDictionaryReader.search, + // which compares with the same NodeComparator the writer sorted with. } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/readers/HDF5Reader.java b/src/main/java/com/ebremer/beakgraph/hdf5/readers/HDF5Reader.java index cb37fd11..0fb8ab05 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/readers/HDF5Reader.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/readers/HDF5Reader.java @@ -24,8 +24,6 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Stream; -import org.apache.commons.collections4.iterators.IteratorChain; import org.apache.jena.atlas.iterator.Iter; import org.apache.jena.graph.Node; import org.apache.jena.graph.Triple; @@ -159,19 +157,26 @@ private Iterator readUnion(BindingNodeId bnid, Triple triple, Exp for (Node n : new Node[]{triple.getSubject(), triple.getPredicate(), triple.getObject()}) { if (n.isVariable()) vars.add(Var.alloc(n)); } - List> its = new ArrayList<>(); - dict.streamGraphs() + // Lazy per-graph chaining: constructing every graph's iterator up front + // paid each one's index binary searches before the first row came back + // (spatial stores hold thousands of tile graphs). + Iterator graphs = dict.streamGraphs() .filter(n -> !(n.equals(Quad.defaultGraphIRI) || n.equals(Quad.defaultGraphNodeGenerated))) - .forEach(gn -> its.add(read(gn, bnid, triple, filter, nodeTable))); - Iterator chain = new IteratorChain<>(its); - Set> seen = new HashSet<>(); + .iterator(); + Iterator chain = Iter.flatMap(graphs, gn -> read(gn, bnid, triple, filter, nodeTable)); + // The dedup set is inherent to union set-semantics (rows arrive per + // graph, not globally sorted); the key is a record of three primitive + // longs rather than a boxed List, cutting the per-row footprint + // of a large union scan several-fold. + record RowKey(long a, long b, long c) {} + Set seen = new HashSet<>(); return Iter.filter(chain, b -> { - List key = new ArrayList<>(vars.size()); - for (Var v : vars) { - NodeId id = b.get(v); - key.add(id == null ? Long.MIN_VALUE : id.getId()); + long[] k = {Long.MIN_VALUE, Long.MIN_VALUE, Long.MIN_VALUE}; + for (int i = 0; i < vars.size(); i++) { + NodeId id = b.get(vars.get(i)); + if (id != null) k[i] = id.getId(); } - return seen.add(key); + return seen.add(new RowKey(k[0], k[1], k[2])); }); } @@ -253,8 +258,6 @@ public void close() { public boolean isOpen() { return open; } @Override public GSPODictionary getDictionary() { return dict; } - @Override public int getNumberOfTriples(String ng) { return 0; } - @Override public Stream streamQuads() { return Stream.empty(); } @Override public Iterator listGraphNodes() { diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/readers/MultiTypeDictionaryReader.java b/src/main/java/com/ebremer/beakgraph/hdf5/readers/MultiTypeDictionaryReader.java index d8fd003c..7ede81f8 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/readers/MultiTypeDictionaryReader.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/readers/MultiTypeDictionaryReader.java @@ -38,9 +38,15 @@ public class MultiTypeDictionaryReader extends AbstractDictionary { private final long numEntries; private final String name; - // Tiered Index Storage - private long[] tieredIds; - private Node[] tieredNodes; + // Tiered index, built LAZILY on first search: building it in the + // constructor performed numEntries/TIER_SPACING full extracts at every + // file-open, paying for a search accelerator the caller might never use. + // Volatile publication keeps concurrent first-searchers safe; the benign + // race builds identical content over immutable data. + private volatile TieredIndex tiered; + + private record TieredIndex(long[] ids, Node[] nodes) {} + private static final TieredIndex EMPTY_TIER = new TieredIndex(new long[0], new Node[0]); public MultiTypeDictionaryReader(Group d) { this.name = d.getName(); @@ -76,21 +82,34 @@ public MultiTypeDictionaryReader(Group d) { this.langs = (langsG != null) ? new FCDReader(langsG) : null; ContiguousDataset langTagsDS = (ContiguousDataset) d.getChild("langTags"); this.langTags = (langTagsDS != null) ? new BitPackedUnSignedLongBuffer(null, langTagsDS.getBuffer(), (Long) langTagsDS.getAttribute("numEntries").getData(), (Integer) langTagsDS.getAttribute("width").getData()) : null; + } - buildTieredIndex(); + private TieredIndex tieredIndex() { + TieredIndex t = tiered; + if (t == null) { + synchronized (this) { + t = tiered; + if (t == null) { + t = buildTieredIndex(); + tiered = t; + } + } + } + return t; } - private void buildTieredIndex() { - if (numEntries <= TIER_SPACING) return; + private TieredIndex buildTieredIndex() { + if (numEntries <= TIER_SPACING) return EMPTY_TIER; int tierSize = (int) (numEntries / TIER_SPACING); - tieredIds = new long[tierSize]; - tieredNodes = new Node[tierSize]; - + long[] ids = new long[tierSize]; + Node[] nodes = new Node[tierSize]; + for (int i = 0; i < tierSize; i++) { long id = (long) i * TIER_SPACING + 1; - tieredIds[i] = id; - tieredNodes[i] = extract(id); + ids[i] = id; + nodes[i] = extract(id); } + return new TieredIndex(ids, nodes); } private Optional getDataSet(Group g, String name) { @@ -151,19 +170,20 @@ private long searchFAST(Node element) { long high = numEntries; // 1. Tiered Index Lookup to narrow the range - // This is safe because tieredNodes are actual Node objects compared using your specific Comparator - if (tieredNodes != null && tieredNodes.length > 0) { - int tierIdx = Arrays.binarySearch(tieredNodes, element, NodeComparator.INSTANCE); - if (tierIdx >= 0) return tieredIds[tierIdx]; + // This is safe because the tier nodes are actual Node objects compared using your specific Comparator + TieredIndex tier = tieredIndex(); + if (tier.nodes().length > 0) { + int tierIdx = Arrays.binarySearch(tier.nodes(), element, NodeComparator.INSTANCE); + if (tierIdx >= 0) return tier.ids()[tierIdx]; int insertionPoint = -(tierIdx + 1); if (insertionPoint > 0) { - // The element at tieredIds[insertionPoint-1] already compared < element, + // The element at ids[insertionPoint-1] already compared < element, // so the real match (if any) starts strictly after it. - low = tieredIds[insertionPoint - 1] + 1; + low = tier.ids()[insertionPoint - 1] + 1; } - if (insertionPoint < tieredIds.length) { - high = tieredIds[insertionPoint] - 1; + if (insertionPoint < tier.ids().length) { + high = tier.ids()[insertionPoint] - 1; } } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/readers/PositionalDictionaryReader.java b/src/main/java/com/ebremer/beakgraph/hdf5/readers/PositionalDictionaryReader.java index 246c6324..21fc6a30 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/readers/PositionalDictionaryReader.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/readers/PositionalDictionaryReader.java @@ -124,13 +124,32 @@ public long getNumberOfNodes() { }; } + // Lazily materialized set of the graph ids: isGraph() used to decode the + // whole columnar list per call - O(numGraphs) for every containsGraph, and + // spatial stores carry thousands of tile graphs. Benign publication race: + // both builders produce identical content over immutable data. + private volatile java.util.Set graphIdSet; + /** * True when {@code entityId} appears in the columnar list of actual graphs. * Graphs share the universal entity ID space, so a bare dictionary lookup * cannot distinguish a graph from any other entity - this can. */ public boolean isGraph(long entityId) { - return graphs != null && graphs.stream().anyMatch(id -> id == entityId); + if (graphs == null) { + return false; + } + java.util.Set s = graphIdSet; + if (s == null) { + s = graphs.stream().boxed().collect(java.util.stream.Collectors.toUnmodifiableSet()); + graphIdSet = s; + } + return s.contains(entityId); + } + + /** Raw ids of the actual graphs (the columnar list), in stored order. */ + public java.util.stream.LongStream streamGraphIds() { + return (graphs == null) ? java.util.stream.LongStream.empty() : graphs.stream(); } @Override diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/writers/BGIndex.java b/src/main/java/com/ebremer/beakgraph/hdf5/writers/BGIndex.java index 4b911192..1a62e3f9 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/writers/BGIndex.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/writers/BGIndex.java @@ -10,8 +10,11 @@ import java.util.Arrays; import org.apache.jena.graph.Node; import org.apache.jena.sparql.core.Quad; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class BGIndex { + private static final Logger logger = LoggerFactory.getLogger(BGIndex.class); private final BitPackedUnSignedLongBuffer B1, B2, B3; private final BitPackedUnSignedLongBuffer S1, S2, S3; @@ -81,7 +84,7 @@ private class LevelState { } public BGIndex(HDF5Writer.Builder builder, PositionalDictionaryWriter dictWriter, Index type, Quad[] allQuads) { - System.out.println("Creating Index " + type); + logger.info("Creating index {}", type); this.type = type; String indexName = type.name(); @@ -144,9 +147,11 @@ private long computeMaxL0Id(PositionalDictionaryWriter w) { } private void processQuads(PositionalDictionaryWriter w, Quad[] allQuads) { - System.out.print("Sorting quads for " + type.name() + "... "); + // INFO bracketing: sorting millions of quads takes minutes with no other output. + logger.info("Sorting {} quads for {}...", allQuads.length, type.name()); + long sortStart = System.nanoTime(); Arrays.parallelSort(allQuads, type.getComparator()); - System.out.println("done"); + logger.info("Sorted {} in {} s", type.name(), (System.nanoTime() - sortStart) / 1_000_000_000L); LevelState l1 = new LevelState(), l2 = new LevelState(), l3 = new LevelState(); Quad lastUnique = null; @@ -160,7 +165,7 @@ private void processQuads(PositionalDictionaryWriter w, Quad[] allQuads) { for (Quad curr : allQuads) { if (++count % 1_000_000 == 0) { - System.out.println(" " + type.name() + " processed " + count + " / " + totalQuads + " quads..."); + logger.info("{} processed {} / {} quads...", type.name(), count, totalQuads); } // 1. Duplicate Check if (lastUnique != null && diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/writers/FCDWriter.java b/src/main/java/com/ebremer/beakgraph/hdf5/writers/FCDWriter.java index f0eed63f..2876448c 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/writers/FCDWriter.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/writers/FCDWriter.java @@ -12,7 +12,6 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Path; -import java.util.UUID; public class FCDWriter implements HDF5Buffer, AutoCloseable { private final int blockSize; @@ -24,16 +23,21 @@ public class FCDWriter implements HDF5Buffer, AutoCloseable { private long numEntries = 0; private long position = 0; private final DataOutputBuffer offsets; - public final String ID = UUID.randomUUID().toString(); private final BitPackedUnSignedLongBuffer compressed = new BitPackedUnSignedLongBuffer(Path.of("compressed"), null, 0, 1); private final StringUtils su = new StringUtils(); public FCDWriter(Path path, int blockSize) throws FileNotFoundException { + if (blockSize < 2) { + // With blockSize 1 the add() block-head branch never closes a block: + // the offsets dataset would hold one entry total and FCDReader.get() + // for any later block reads past it. Fail construction loudly rather + // than write an unreadable dictionary. + throw new IllegalArgumentException("FCD blockSize must be >= 2, got " + blockSize); + } this.path = path; this.blockSize = blockSize; this.baos = new ByteArrayOutputStream(); this.offsets = new DataOutputBuffer(Path.of("offsets")); - IO.println(path+" "+ID); } private void writeFragment(byte[] data) throws IOException { diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/writers/HDF5Writer.java b/src/main/java/com/ebremer/beakgraph/hdf5/writers/HDF5Writer.java index 87e8725f..2e4380ce 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/writers/HDF5Writer.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/writers/HDF5Writer.java @@ -8,6 +8,10 @@ import io.jhdf.WritableHdfFile; import io.jhdf.api.WritableGroup; import java.io.IOException; +import java.nio.file.AtomicMoveNotSupportedException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import org.apache.jena.sparql.core.Quad; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,30 +30,52 @@ private HDF5Writer(Builder builder) { @Override public void write() throws IOException { - IO.println("Writing..."); - PositionalDictionaryWriterBuilder db = new PositionalDictionaryWriterBuilder(); - try (PositionalDictionaryWriter w = db - .setSource(builder.getSource()) - .setDestination(builder.getDestination()) - .setName("dictionary") - .setSpatial(builder.getSpatial()) - .setFeatures(builder.getFeatures()) - .build()) { - Quad[] allQuads = w.getQuads(); - BGIndex gspo = new BGIndex(builder, w, Index.GSPO, allQuads); - BGIndex gpos = new BGIndex(builder, w, Index.GPOS, allQuads); + logger.info("Writing BeakGraph to {}", builder.getDestination()); + Path dest = builder.getDestination().toPath(); + // Build into a sibling temp file and swap it in only on success: a failed + // rebuild must never destroy a previous good artifact at dest (the old + // cleanup deleted dest even when the failure - a parse error, say - + // happened before a single byte was written), and readers never observe + // a half-written file at the published path. + Path tmp = dest.resolveSibling(dest.getFileName() + ".tmp"); + try { + PositionalDictionaryWriterBuilder db = new PositionalDictionaryWriterBuilder(); + try (PositionalDictionaryWriter w = db + .setSource(builder.getSource()) + .setDestination(builder.getDestination()) + .setName(Params.DICTIONARY) + .setSpatial(builder.getSpatial()) + .setFeatures(builder.getFeatures()) + .build()) { + Quad[] allQuads = w.getQuads(); + BGIndex gspo = new BGIndex(builder, w, Index.GSPO, allQuads); + BGIndex gpos = new BGIndex(builder, w, Index.GPOS, allQuads); - IO.print("Creating HDF5 File..." + builder.getDestination() + "..."); - try (WritableHdfFile hdfFile = HdfFile.write(builder.getDestination().toPath())) { - final WritableGroup hdt = hdfFile.putGroup(builder.getName()); - hdt.putAttribute("numQuads", w.getNumberOfQuads()); - hdt.putAttribute("formatVersion", Params.FORMAT_VERSION); - w.add(hdt); - gspo.add(hdt); - gpos.add(hdt); + logger.info("Creating HDF5 file {}", builder.getDestination()); + try (WritableHdfFile hdfFile = HdfFile.write(tmp)) { + final WritableGroup hdt = hdfFile.putGroup(builder.getName()); + hdt.putAttribute("numQuads", w.getNumberOfQuads()); + hdt.putAttribute("formatVersion", Params.FORMAT_VERSION); + w.add(hdt); + gspo.add(hdt); + gpos.add(hdt); + } } + try { + Files.move(tmp, dest, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); + } catch (AtomicMoveNotSupportedException e) { + Files.move(tmp, dest, StandardCopyOption.REPLACE_EXISTING); + } + } catch (IOException | RuntimeException ex) { + // Only the temp file is ever cleaned up; dest is untouched on failure. + try { + Files.deleteIfExists(tmp); + } catch (IOException cleanup) { + logger.warn("Failed to remove temp output {}", tmp, cleanup); + } + throw ex; } - IO.println("Done."); + logger.info("Write complete: {}", builder.getDestination()); } public static class Builder extends AbstractGraphBuilder { diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/writers/MultiTypeDictionaryWriter.java b/src/main/java/com/ebremer/beakgraph/hdf5/writers/MultiTypeDictionaryWriter.java index 768b4950..8962e022 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/writers/MultiTypeDictionaryWriter.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/writers/MultiTypeDictionaryWriter.java @@ -14,6 +14,7 @@ import io.jhdf.api.WritableGroup; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.UncheckedIOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; @@ -22,9 +23,9 @@ import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; -import java.util.logging.Level; -import java.util.logging.Logger; import java.util.stream.Stream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static com.ebremer.beakgraph.utils.UTIL.isRelativeIRI; import org.apache.jena.graph.Node; import org.apache.jena.vocabulary.XSD; @@ -35,7 +36,7 @@ * * @author erbre */ public class MultiTypeDictionaryWriter implements DictionaryWriter, Dictionary, AutoCloseable { - private static final Logger logger = Logger.getLogger(MultiTypeDictionaryWriter.class.getName()); + private static final Logger logger = LoggerFactory.getLogger(MultiTypeDictionaryWriter.class); private final BitPackedUnSignedLongBuffer offsets; private final BitPackedUnSignedLongBuffer typedLiterals; @@ -64,16 +65,18 @@ public class MultiTypeDictionaryWriter implements DictionaryWriter, Dictionary, protected MultiTypeDictionaryWriter(Builder builder) throws FileNotFoundException, IOException { this.name = builder.getName(); - IO.println("Building Dictionary: " + name); - IO.println("Total Nodes : " + builder.getNodes().size()); + logger.info("Building dictionary '{}' ({} nodes)", name, builder.getNodes().size()); Stats stats = builder.getStats(); this.et = builder.getEnabledTypes(); // --- STEP 1: Strict Total Ordering --- - System.out.print("Sorting nodes..."); + // INFO bracketing: sorting tens of millions of nodes takes minutes with no + // other output - this is the writer's longest silent phase. + logger.info("Sorting {} nodes for dictionary '{}'...", builder.getNodes().size(), name); + long sortStart = System.nanoTime(); sorted = NodeSorter.parallelSort(builder.getNodes()); - System.out.println("Done."); + logger.info("Sorted dictionary '{}' in {} s", name, (System.nanoTime() - sortStart) / 1_000_000_000L); // --- STEP 2: Initialize Buffers --- // BitPackedUnSignedLongBuffer constructors do not throw; assign finals directly. @@ -117,7 +120,8 @@ protected MultiTypeDictionaryWriter(Builder builder) throws FileNotFoundExceptio fcdTLD.add(s); dataTypesLookUp.put(s, fcdTLD.getNumEntries()); } catch (IOException ex) { - logger.log(Level.SEVERE, "Failed to add datatype to dictionary", ex); + // A missing datatype entry shifts every later datatype id. + throw new UncheckedIOException("Failed to add datatype to dictionary: " + s, ex); } }); } @@ -171,7 +175,9 @@ protected MultiTypeDictionaryWriter(Builder builder) throws FileNotFoundExceptio try { close(); } catch (Exception ex) { - logger.log(Level.SEVERE, "Error during dictionary buffer finalization", ex); + // A failed finalization means incomplete buffers; writing them out + // would produce a corrupt dictionary. Abort the build instead. + throw new IllegalStateException("Dictionary buffer finalization failed for '" + name + "'", ex); } } @@ -198,7 +204,10 @@ else if (node.isURI()) { if (literalsPresent) typedLiterals.writeLong(0); if (langTags != null) langTags.writeLong(0); } catch (IOException ex) { - logger.log(Level.SEVERE, null, ex); + // Continuing after a failed iri.add() would leave the offsets and + // datatypes buffers one entry ahead of the IRI dictionary, silently + // corrupting every node after this one. Abort the build instead. + throw new UncheckedIOException("Failed to add IRI to dictionary: " + node, ex); } } else if (node.isLiteral()) { @@ -209,36 +218,46 @@ else if (node.isLiteral()) { String lang = node.getLiteralLanguage(); langTags.writeLong((lang == null || lang.isEmpty()) ? 0L : langLookUp.getOrDefault(lang, 0L)); } - Object val = node.getLiteralValue(); - if (dt.equals(XSD.xlong.getURI()) && longs != null) { + // An ill-typed literal ("abc"^^xsd:int) has no parseable value but is a + // valid RDF term: route it to the strings branch below (term-exact, with + // its datatype IRI) instead of aborting the build here. ProcessQuad + // counts those same terms toward numStrings, so the buffer exists. + Object val; + try { + val = node.getLiteralValue(); + } catch (RuntimeException ex) { + val = null; + } + if (dt.equals(XSD.xlong.getURI()) && longs != null && val instanceof Number num) { offsets.writeLong(longs.getNumEntries()); nativedatatypes.writeInteger(DataType.LONG.ordinal()); - long l = (val instanceof Number n) ? n.longValue() : Long.parseLong(node.getLiteralLexicalForm()); - longs.writeLong(l); + longs.writeLong(num.longValue()); } - else if (dt.equals(XSD.xint.getURI()) && integers != null) { + else if (dt.equals(XSD.xint.getURI()) && integers != null && val instanceof Number num) { // Only xsd:int is bit-packed (32-bit). xsd:integer is unbounded and is // stored via the strings branch below so its value and datatype survive. offsets.writeLong(integers.getNumEntries()); nativedatatypes.writeInteger(DataType.INTEGER.ordinal()); - int i = (val instanceof Number n) ? n.intValue() : Integer.parseInt(node.getLiteralLexicalForm()); - integers.writeInteger(i); + integers.writeInteger(num.intValue()); } - else if (dt.equals(XSD.xdouble.getURI()) && doubles != null) { + else if (dt.equals(XSD.xdouble.getURI()) && doubles != null && val instanceof Number num) { offsets.writeLong(doubles.getNumEntries()); nativedatatypes.writeInteger(DataType.DOUBLE.ordinal()); try { - double d = (val instanceof Number n) ? n.doubleValue() : Double.parseDouble(node.getLiteralLexicalForm()); - doubles.writeDouble(d); - } catch (IOException ex) { logger.log(Level.SEVERE, null, ex); } + doubles.writeDouble(num.doubleValue()); + } catch (IOException ex) { + // See the IRI case: a skipped value desynchronises the dictionary. + throw new UncheckedIOException("Failed to add double literal to dictionary", ex); + } } - else if (dt.equals(XSD.xfloat.getURI()) && floats != null) { + else if (dt.equals(XSD.xfloat.getURI()) && floats != null && val instanceof Number num) { offsets.writeLong(floats.getNumEntries()); nativedatatypes.writeInteger(DataType.FLOAT.ordinal()); try { - float f = (val instanceof Number n) ? n.floatValue() : Float.parseFloat(node.getLiteralLexicalForm()); - floats.writeFloat(f); - } catch (IOException ex) { logger.log(Level.SEVERE, null, ex); } + floats.writeFloat(num.floatValue()); + } catch (IOException ex) { + throw new UncheckedIOException("Failed to add float literal to dictionary", ex); + } } else if (strings != null) { // Fallback for strings, booleans, dates, and custom types @@ -247,7 +266,9 @@ else if (strings != null) { nativedatatypes.writeInteger(DataType.STRING.ordinal()); try { strings.add(lex); - } catch (IOException ex) { logger.log(Level.SEVERE, null, ex); } + } catch (IOException ex) { + throw new UncheckedIOException("Failed to add string literal to dictionary", ex); + } } else { // Unreachable in normal operation: every string-stored datatype is @@ -261,7 +282,17 @@ else if (strings != null) { + "refusing to write a misaligned dictionary entry."); } } - cc.incrementAndGet(); + else { + // A node that is neither blank, URI nor literal (e.g. an RDF-star triple + // term) would write NO buffer entries at all, leaving offsets/datatypes + // one entry short of the sorted node list - every id after it silently + // shifts. Fail the build loudly instead. + throw new IllegalStateException("Unsupported node kind in dictionary '" + name + "': " + node); + } + long c = cc.incrementAndGet(); + if (c % 1_000_000 == 0) { + logger.info("Dictionary '{}': encoded {} / {} nodes", name, c, sorted.size()); + } } @Override diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/writers/PositionalDictionaryWriter.java b/src/main/java/com/ebremer/beakgraph/hdf5/writers/PositionalDictionaryWriter.java index b34b033e..79f4e2d0 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/writers/PositionalDictionaryWriter.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/writers/PositionalDictionaryWriter.java @@ -19,12 +19,15 @@ import java.util.stream.Stream; import org.apache.jena.graph.Node; import org.apache.jena.sparql.core.Quad; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Monolithic Entity Dictionary with Columnar ID lists for Graphs, Subjects, and Objects. * @author Erich Bremer */ public class PositionalDictionaryWriter implements GSPODictionary, AutoCloseable, DictionaryWriter { + private static final Logger logger = LoggerFactory.getLogger(PositionalDictionaryWriter.class); private final DictionaryWriter entitiesdict; private final DictionaryWriter predicatesdict; private final DictionaryWriter literalsdict; @@ -44,7 +47,7 @@ public PositionalDictionaryWriter(PositionalDictionaryWriterBuilder builder) thr this.quads = builder.getQuads(); Stats stats = builder.getStats(); - IO.println(stats); + logger.debug("{}", stats); // 1. Build the Monolithic Entity Dictionary (G, S, O URIs + BNodes) entitiesdict = new MultiTypeDictionaryWriter.Builder() @@ -85,7 +88,7 @@ public PositionalDictionaryWriter(PositionalDictionaryWriterBuilder builder) thr this.objects = new BitPackedUnSignedLongBuffer(Path.of("objects"), null, 0, oBits); // 5. Populate ID lists from the unique sets collected by the Builder - System.out.println("Populating columnar ID lists with unique entities..."); + logger.info("Populating columnar ID lists..."); ArrayList src = parallelSort(builder.getUniqueGraphs()); for (Node n : src) { graphs.writeLong(locateGraph(n)); @@ -103,6 +106,7 @@ public PositionalDictionaryWriter(PositionalDictionaryWriterBuilder builder) thr graphs.prepareForReading(); subjects.prepareForReading(); objects.prepareForReading(); + logger.info("Columnar ID lists populated"); } private static ArrayList parallelSort(Set nodes) { @@ -179,8 +183,12 @@ public void add(WritableGroup group) { if (predicatesdict.getNumberOfNodes() > 0) predicatesdict.add(dictionary); if (literalsdict.getNumberOfNodes() > 0) literalsdict.add(dictionary); - // Add columnar ID lists - if (numQuads > 0) { + // Add columnar ID lists whenever any quads are stored. Gating on the + // SOURCE quad count (numQuads) left an empty-source file internally + // inconsistent: the always-written VoID metadata graph was present in the + // indexes, but with no graphs list, containsGraph answered false and ARQ + // refused to execute GRAPH queries against rows that are demonstrably there. + if (graphs.getNumEntries() > 0) { graphs.add(dictionary); subjects.add(dictionary); objects.add(dictionary); diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/writers/PositionalDictionaryWriterBuilder.java b/src/main/java/com/ebremer/beakgraph/hdf5/writers/PositionalDictionaryWriterBuilder.java index 6e99fc3b..48b1986a 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/writers/PositionalDictionaryWriterBuilder.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/writers/PositionalDictionaryWriterBuilder.java @@ -29,6 +29,7 @@ import org.apache.jena.irix.IRIx; import org.apache.jena.rdf.model.Model; import org.apache.jena.riot.Lang; +import org.apache.jena.riot.RDFLanguages; import org.apache.jena.riot.lang.LabelToNode; import org.apache.jena.riot.system.AsyncParser; import org.apache.jena.riot.system.AsyncParserBuilder; @@ -38,6 +39,7 @@ import org.locationtech.jts.geom.Envelope; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Polygon; +import org.locationtech.jts.geom.Polygonal; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static com.ebremer.beakgraph.Params.BGVOID; @@ -122,17 +124,21 @@ public class PositionalDictionaryWriterBuilder { NodeFactory.createURI("https://halcyon.is/ns/asWKT12"), NodeFactory.createURI("https://halcyon.is/ns/asWKT13"), NodeFactory.createURI("https://halcyon.is/ns/asWKT14") }; - private static final Node[] hilbertCorner = { - NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner0"), NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner1"), - NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner2"), NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner3"), - NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner4"), NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner5"), - NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner6"), NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner7"), - NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner8"), NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner9"), - NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner10"), NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner11"), - NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner12"), NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner13"), - NodeFactory.createURI("https://halcyon.is/ns/hilbertCorner14") - }; - + /** + * Spatial index entry parameters. Each geometry part's bbox is covered by + * whole Hilbert cells at the coarsest scale where the cover holds at most + * {@link #MAX_INDEX_CELLS} cells, stored as hal:hilbertCell{scale} values. + * The query side covers ITS bbox with ranges at every scale using the same + * floor snapping (see SpatialIndexIterator), so any bbox overlap shares a + * cell at the stored scale: candidates have no false negatives, and the + * sfIntersects filter - which the rewrite no longer removes from the plan - + * eliminates the false positives with real JTS geometry. + */ + public static final String HILBERT_CELL_NS = "https://halcyon.is/ns/hilbertCell"; + public static final int MAX_INDEX_CELLS = 16; + public static final int MAX_INDEX_SCALE = 30; + + private BGVoIDSD xvoid = new BGVoIDSD("https://ebremer.com/void/"); public File getDestination() { return dest; } @@ -206,68 +212,137 @@ private List generateGridURNs(Polygon polygon, int resolutionLevel) { return intersectingURNs; } - private boolean isDegeneratePolygon(String wkt) { - try { - Geometry g = new WKTReader().read(wkt); - if (!(g instanceof Polygon p)) return false; - return p.getExteriorRing().getNumPoints() < 4; - } catch (Exception e) { - return true; - } - } - private ArrayList addSpatial(Quad quad) { final ArrayList qqq = new ArrayList<>(); // The GeoSPARQL-standard " WKT" form must be indexed too: strip the - // prefix once here so the degeneracy check and the scaler both see plain WKT + // prefix once here so the parser and the scaler both see plain WKT // (previously such geometries failed the parse and were silently dropped). String wkt = ImageTools.stripCrs(quad.getObject().getLiteralLexicalForm()); - if (isDegeneratePolygon(wkt)) { - IO.println("Degenerate Polygon : "+wkt); - return qqq; - } - final Polygon[] scales; - scales = PolygonScaler.toPolygons(wkt); if (features) { - addFeatures(qqq, quad); + // Same containment as the geometry block below: feature generation runs + // inside the spatial task, so anything escaping here feeds Future.get() + // and fails the whole write over one bad geometry. + try { + addFeatures(qqq, quad, wkt); + } catch (Exception ex) { + logger.warn("Failed to generate features for {}: {}", quad.getSubject(), ex.toString()); + } } + // Everything geometry-related sits inside the catch-all below: a single bad + // geometry must never abort the build (these tasks feed Future.get(), whose + // ExecutionException would otherwise fail the whole write). try { - if (scales == null) { + // Index EVERY polygonal part: MULTIPOLYGON members each get their own + // pyramid and corner entries (indexing only the first part made the + // others unfindable). Non-areal members (POINT, LINESTRING) are indexed + // via their expanded envelopes - PER MEMBER, not only as a fallback + // when no polygon exists: in a mixed GEOMETRYCOLLECTION the point/line + // members next to a polygon member were silently unindexed, invisible + // to every spatial query. + Geometry g = new WKTReader().read(wkt); + if (g.isEmpty()) { return qqq; } - final String[] wktScales = PolygonScaler.toWKT(scales); - for (int s=0; s tiles = generateGridURNs(scales[s],s); - try { - for (int ii=0; ii parts = new ArrayList<>(ImageTools.wktToPolygons(wkt)); + GeometryFactory gf = new GeometryFactory(); + for (int i = 0; i < g.getNumGeometries(); i++) { + Geometry member = g.getGeometryN(i); + if (!(member instanceof Polygonal) && !member.isEmpty()) { + Envelope env = member.getEnvelopeInternal(); + env.expandBy(0.5); // a point/degenerate envelope still needs area + parts.add((Polygon) gf.toGeometry(env)); } } + for (Polygon part : parts) { + addSpatialIndexCells(qqq, quad, part); + addSpatialScales(qqq, quad, wkt, PolygonScaler.toPolygons(part)); + } } catch (Exception ex) { - logger.error("Failed to add spatial data for {}", wkt, ex); + // Expected data condition (pathology exports contain degenerate + // geometries such as two-point rings): one line per skip, no stack - + // a slide can contain thousands of these. + logger.warn("Skipping spatial indexing for {}: {} ({})", + quad.getSubject(), ex.toString(), abbrevWkt(wkt)); } return qqq; } + + private void addSpatialScales(ArrayList qqq, Quad quad, String wkt, Polygon[] scales) { + if (scales == null) { + return; + } + final String[] wktScales = PolygonScaler.toWKT(scales); + for (int s=0; s tiles = generateGridURNs(scales[s],s); + try { + for (int ii=0; ii qqq, Quad quad, Polygon part) { + Envelope env = part.getEnvelopeInternal(); + // The Hilbert domain is [0, 2^31), so bboxes are CLAMPED into it - never + // skipped, never allowed to alias (the curve masks out-of-range bits). + // Clamping is a monotone projection applied identically on the query + // side, so overlapping boxes still overlap after it and recall is + // preserved; out-of-domain geometry just indexes coarsely at the domain + // edge cells (false positives there are killed by the sfIntersects + // verification on the exact original WKT). Skipping fully-negative + // geometry instead made it unfindable by ANY query. + long minX = HilbertSpace.clampToDomain((long) Math.floor(env.getMinX())); + long maxX = HilbertSpace.clampToDomain((long) Math.floor(env.getMaxX())); + long minY = HilbertSpace.clampToDomain((long) Math.floor(env.getMinY())); + long maxY = HilbertSpace.clampToDomain((long) Math.floor(env.getMaxY())); + int s = 0; + while (s < MAX_INDEX_SCALE && cellCount(minX, maxX, minY, maxY, s) > MAX_INDEX_CELLS) { + s++; + } + long cell = 1L << s; + Node pred = NodeFactory.createURI(HILBERT_CELL_NS + s); + HashSet cells = new HashSet<>(); + for (long x = Math.floorDiv(minX, cell); x <= Math.floorDiv(maxX, cell); x++) { + for (long y = Math.floorDiv(minY, cell); y <= Math.floorDiv(maxY, cell); y++) { + cells.add(HilbertSpace.hc.index(new long[]{x, y})); + } + } + for (Long c : cells) { + qqq.add(Quad.create(Params.SPATIAL, quad.getSubject(), pred, NodeFactory.createLiteralByValue((long) c))); + } + } + + private static long cellCount(long minX, long maxX, long minY, long maxY, int s) { + long cell = 1L << s; + long nx = Math.floorDiv(maxX, cell) - Math.floorDiv(minX, cell) + 1; + long ny = Math.floorDiv(maxY, cell) - Math.floorDiv(minY, cell) + 1; + return nx * ny; + } + + private static String abbrevWkt(String wkt) { + return (wkt != null && wkt.length() > 200) ? wkt.substring(0, 200) + "..." : wkt; + } - private void addFeatures(ArrayList qqq, Quad quad) { + // Takes the CRS-stripped WKT computed once in addSpatial: re-reading the raw + // lexical form here made JTS throw on every " WKT"-form literal, so + // CRS-prefixed geometries silently got no derived features while identical + // unprefixed ones did. + private void addFeatures(ArrayList qqq, Quad quad, String wkt) { Node geo = quad.getSubject(); - String wkt = quad.getObject().getLiteralLexicalForm(); Gen2DFeatures.generate(qqq, geo, wkt); MajorMinor.add(qqq, geo, wkt); } @@ -390,6 +465,26 @@ private Quad canonicalizeNumericObject(Quad quad) { } } + /** + * getLiteralValue(), or null for an ill-typed literal ("abc"^^xsd:int). RDF + * permits such terms and parsers accept them with a warning; they are counted + * toward (and stored via) the lexical strings path instead of aborting the + * whole build on a DatatypeFormatException. + */ + private static Object literalValueOrNull(Node o) { + try { + return o.getLiteralValue(); + } catch (RuntimeException e) { + return null; + } + } + + private void countStringStored(String lex) { + this.stats.longestStringLength = Math.max(this.stats.longestStringLength, lex.length()); + this.stats.shortestStringLength = Math.min(this.stats.shortestStringLength, lex.length()); + this.stats.numStrings++; + } + private void ProcessQuad(Quad quad) { Node g = quad.getGraph(); Node s = quad.getSubject(); @@ -413,6 +508,11 @@ private void ProcessQuad(Quad quad) { stats.numBlankNodes++; } else if (s.isURI()) { stats.numIRI++; + } else { + // Same guard as the graph and object positions: any other node kind + // (e.g. a triple term) writes no dictionary entry and silently + // desynchronizes every id after it. Fail the build loudly instead. + throw new IllegalStateException("Unexpected subject node type (not URI or blank): " + s); } entities.add(s); } @@ -425,43 +525,49 @@ private void ProcessQuad(Quad quad) { String dt = o.getLiteralDatatypeURI(); dataTypes.add(dt); if (dt.equals(XSD.xlong.getURI())) { - Number n = (Number) o.getLiteralValue(); - this.stats.maxLong = Math.max(this.stats.maxLong, n.longValue()); - this.stats.minLong = Math.min(this.stats.minLong, n.longValue()); - this.stats.numLong++; + if (literalValueOrNull(o) instanceof Number n) { + this.stats.maxLong = Math.max(this.stats.maxLong, n.longValue()); + this.stats.minLong = Math.min(this.stats.minLong, n.longValue()); + this.stats.numLong++; + } else { + countStringStored(o.getLiteralLexicalForm()); // ill-typed: strings path + } } else if (dt.equals(XSD.xint.getURI())) { // Only xsd:int (32-bit bounded) is bit-packed here. xsd:integer is // unbounded, so it is handled by the string fallback below instead; // bit-packing it would truncate large values and change the datatype // to xsd:int on read-back. - Number n = (Number) o.getLiteralValue(); - this.stats.maxInteger = Math.max(this.stats.maxInteger, n.intValue()); - this.stats.minInteger = Math.min(this.stats.minInteger, n.intValue()); - this.stats.numInteger++; + if (literalValueOrNull(o) instanceof Number n) { + this.stats.maxInteger = Math.max(this.stats.maxInteger, n.intValue()); + this.stats.minInteger = Math.min(this.stats.minInteger, n.intValue()); + this.stats.numInteger++; + } else { + countStringStored(o.getLiteralLexicalForm()); // ill-typed: strings path + } } else if (dt.equals(XSD.xfloat.getURI())) { - Number n = (Number) o.getLiteralValue(); - this.stats.maxFloat = Math.max(this.stats.maxFloat, n.floatValue()); - this.stats.minFloat = Math.min(this.stats.minFloat, n.floatValue()); - this.stats.numFloat++; + if (literalValueOrNull(o) instanceof Number n) { + this.stats.maxFloat = Math.max(this.stats.maxFloat, n.floatValue()); + this.stats.minFloat = Math.min(this.stats.minFloat, n.floatValue()); + this.stats.numFloat++; + } else { + countStringStored(o.getLiteralLexicalForm()); // ill-typed: strings path + } } else if (dt.equals(XSD.xdouble.getURI())) { - Number n = (Number) o.getLiteralValue(); - this.stats.maxDouble = Math.max(this.stats.maxDouble, n.doubleValue()); - this.stats.minDouble = Math.min(this.stats.minDouble, n.doubleValue()); - this.stats.numDouble++; + if (literalValueOrNull(o) instanceof Number n) { + this.stats.maxDouble = Math.max(this.stats.maxDouble, n.doubleValue()); + this.stats.minDouble = Math.min(this.stats.minDouble, n.doubleValue()); + this.stats.numDouble++; + } else { + countStringStored(o.getLiteralLexicalForm()); // ill-typed: strings path + } } else if (dt.equals(XSD.xstring.getURI()) || dt.equals(GEO.wktLiteral.getURI()) || dt.equals(XSD.xboolean.getURI()) || dt.equals(RDF.langString.getURI())) { // rdf:langString shares the strings buffer; its language tag is // stored separately by MultiTypeDictionaryWriter (langs/langTags). - String wow = (String) o.getLiteralLexicalForm(); - this.stats.longestStringLength = Math.max(this.stats.longestStringLength, wow.length()); - this.stats.shortestStringLength = Math.min(this.stats.shortestStringLength, wow.length()); - this.stats.numStrings++; + countStringStored(o.getLiteralLexicalForm()); } else if (dt.equals(XSD.dateTime.getURI())) { - String lex = o.getLiteralLexicalForm(); + String lex = o.getLiteralLexicalForm(); int t = lex.indexOf('T'); - String wow = (t > 0) ? lex.substring(0, t) : lex; - this.stats.longestStringLength = Math.max(this.stats.longestStringLength, wow.length()); - this.stats.shortestStringLength = Math.min(this.stats.shortestStringLength, wow.length()); - this.stats.numStrings++; + countStringStored((t > 0) ? lex.substring(0, t) : lex); } else { // Any other datatype (xsd:integer, xsd:decimal, xsd:date, custom // datatypes, ...) is stored verbatim in the strings buffer by @@ -469,13 +575,10 @@ private void ProcessQuad(Quad quad) { // toward numStrings so that buffer is always allocated; otherwise the // writer would have nowhere to put it and would drop the node, // desynchronising the offset/datatype buffers and corrupting the dictionary. - String wow = o.getLiteralLexicalForm(); - this.stats.longestStringLength = Math.max(this.stats.longestStringLength, wow.length()); - this.stats.shortestStringLength = Math.min(this.stats.shortestStringLength, wow.length()); - this.stats.numStrings++; + countStringStored(o.getLiteralLexicalForm()); } literals.add(o); - } + } } else { if (!entities.contains(o)) { if (o.isBlank()) { @@ -496,12 +599,21 @@ public PositionalDictionaryWriter build() throws IOException { try (InputStream xis = src.toString().endsWith(".gz") ? new GZIPInputStream(new FileInputStream(src)) : new FileInputStream(src)) { + // Detect the syntax from the file name (TriG, N-Quads, N-Triples, + // Turtle, ...; .gz handled) instead of hardcoding Turtle: this is a + // quad store, and named graphs can only arrive through a quad-capable + // syntax. + String fname = src.getName(); + if (fname.endsWith(".gz")) { + fname = fname.substring(0, fname.length() - 3); + } + Lang lang = RDFLanguages.filenameToLang(fname, Lang.TURTLE); // Parse relative references against a stable sentinel base so they // resolve deterministically (not against the process working // directory). The relativize() step below strips the sentinel back // off; the relative form is resolved at query time against the URL // the .h5 file is served from. - AsyncParserBuilder parserBuilder = AsyncParser.of(xis, Lang.TURTLE, REL_BASE); + AsyncParserBuilder parserBuilder = AsyncParser.of(xis, lang, REL_BASE); parserBuilder.mutateSources(rdfBuilder -> rdfBuilder.labelToNode(LabelToNode.createUseLabelAsGiven())); final List>> spatialTasks = new ArrayList<>(); @@ -520,7 +632,7 @@ public PositionalDictionaryWriter build() throws IOException { .forEach(quad -> { quadcount.incrementAndGet(); if (quadcount.get() % 100_000 == 0) { - System.out.println("Loaded " + quadcount.get() + " quads..."); + logger.info("Loaded {} quads...", quadcount.get()); } quadslist.add(quad); // Let an invalid quad abort the write rather than silently skipping @@ -583,7 +695,7 @@ public PositionalDictionaryWriter build() throws IOException { this.numQuads = quadcount.get(); this.quads = quadslist.toArray(Quad[]::new); quadslist.clear(); - System.out.println("Dictionary created. Total Quads: " + this.numQuads); + logger.info("Dictionary created. Total quads: {}", this.numQuads); return new PositionalDictionaryWriter(this); } diff --git a/src/main/java/com/ebremer/beakgraph/lws/LWSMetadataGenerator.java b/src/main/java/com/ebremer/beakgraph/lws/LWSMetadataGenerator.java index d7e25810..e135be2a 100644 --- a/src/main/java/com/ebremer/beakgraph/lws/LWSMetadataGenerator.java +++ b/src/main/java/com/ebremer/beakgraph/lws/LWSMetadataGenerator.java @@ -43,7 +43,8 @@ public static void main(String[] args) { writeModelToGZ(model, outputPath); System.out.println("Metadata successfully written to " + outputPath.toAbsolutePath()); } catch (IOException e) { - e.printStackTrace(); + System.err.println("Failed to generate LWS metadata: " + e.getMessage()); + System.exit(1); } } @@ -71,6 +72,13 @@ public static Model generateLWSModel(Path rootPath) throws IOException { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { + // Never index the metadata cache itself: on regeneration the previous + // beakgraph.ttl.gz would become a listed DataResource, making the raw + // model - including the owl:sameAs file:/// server paths the servlet + // exists to withhold - downloadable by any client. + if (CACHE_FILE_NAME.equals(file.getFileName().toString())) { + return FileVisitResult.CONTINUE; + } String httpUri = toHttpUri(rootPath, file); processResource(model, httpUri, file, attrs, dataType, mediaType, size, modified); linkToParent(model, rootPath, file, items, totalItems); diff --git a/src/main/java/com/ebremer/beakgraph/pool/BeakGraphKeyedPool.java b/src/main/java/com/ebremer/beakgraph/pool/BeakGraphKeyedPool.java index 1872d5b9..9f0df5bc 100644 --- a/src/main/java/com/ebremer/beakgraph/pool/BeakGraphKeyedPool.java +++ b/src/main/java/com/ebremer/beakgraph/pool/BeakGraphKeyedPool.java @@ -19,13 +19,18 @@ public BeakGraphKeyedPool(BeakGraphPoolFactory factory, BeakGraphKeyedPoolConfig @Override public BeakGraph borrowObject(final URI key) throws Exception { - logger.trace("borrowObject {}\n{}", key, getStatus()); + // getStatus() takes five pool-lock metrics; only pay for it when TRACE is on. + if (logger.isTraceEnabled()) { + logger.trace("borrowObject {}\n{}", key, getStatus()); + } return super.borrowObject(key); } - + @Override public void returnObject(final URI key, final BeakGraph reader) { - logger.trace("returnObject {}\n{}", key, getStatus()); + if (logger.isTraceEnabled()) { + logger.trace("returnObject {}\n{}", key, getStatus()); + } super.returnObject(key, reader); } diff --git a/src/main/java/com/ebremer/beakgraph/pool/BeakGraphPool.java b/src/main/java/com/ebremer/beakgraph/pool/BeakGraphPool.java index e37a6e03..97b6242e 100644 --- a/src/main/java/com/ebremer/beakgraph/pool/BeakGraphPool.java +++ b/src/main/java/com/ebremer/beakgraph/pool/BeakGraphPool.java @@ -15,8 +15,12 @@ private static class Holder { private static final BeakGraphKeyedPool INSTANCE; static { BeakGraphKeyedPoolConfig config = new BeakGraphKeyedPoolConfig<>(); - config.setMaxTotalPerKey(100); - config.setMaxTotal(200); + // A reader is safe for concurrent use (absolute buffer reads throughout), + // so extra instances per file mostly multiply memory: each holds mapped + // buffers, a tiered node index and two 1M-entry caches. Two per key + // covers validation-replacement; the old 100/key invited OOM. + config.setMaxTotalPerKey(2); + config.setMaxTotal(64); config.setMinIdlePerKey(0); config.setTestOnBorrow(true); config.setMaxWait(Duration.ofMillis(60000)); diff --git a/src/main/java/com/ebremer/beakgraph/pool/BeakGraphPoolFactory.java b/src/main/java/com/ebremer/beakgraph/pool/BeakGraphPoolFactory.java index 05e73473..59449432 100644 --- a/src/main/java/com/ebremer/beakgraph/pool/BeakGraphPoolFactory.java +++ b/src/main/java/com/ebremer/beakgraph/pool/BeakGraphPoolFactory.java @@ -24,7 +24,13 @@ public BeakGraphPoolFactory() {} public BeakGraph create(URI uri) throws Exception { logger.trace("Creating BeakGraph {}", uri); HDF5Reader reader = new HDF5Reader(new File(uri)); - return new BeakGraph(reader, uri, null); + try { + return new BeakGraph(reader, uri, null); + } catch (RuntimeException | Error e) { + // Release the mapped file if wrapping fails - a leaked reader pins it. + try { reader.close(); } catch (Exception ignore) {} + throw e; + } } @Override @@ -36,10 +42,27 @@ public PooledObject wrap(BeakGraph value) { * Without this override, BaseKeyedPooledObjectFactory.validateObject always * returns true and setTestOnBorrow(true) validates nothing - an instance whose * reader was closed (poisoned) would be re-issued and fail on first use. + * The probe additionally touches REAL mapped data, not just the open flag: + * a reader whose backing file was replaced or truncated underneath stays + * "open" but throws on access, and an isOpen-only check re-issued it to + * every borrower forever. */ @Override public boolean validateObject(URI uri, PooledObject p) { - return p.getObject().getReader().isOpen(); + BeakGraph bg = p.getObject(); + if (!bg.getReader().isOpen()) { + return false; + } + try { + var predicates = bg.getReader().getDictionary().getPredicates(); + if (predicates.getNumberOfNodes() > 0) { + predicates.extract(1); + } + return true; + } catch (RuntimeException | Error e) { + logger.warn("Pooled BeakGraph for {} failed data-access validation; discarding", uri, e); + return false; + } } @Override diff --git a/src/main/java/com/ebremer/beakgraph/turbo/Intersects.java b/src/main/java/com/ebremer/beakgraph/turbo/Intersects.java index a5a3c59b..e86d30cc 100644 --- a/src/main/java/com/ebremer/beakgraph/turbo/Intersects.java +++ b/src/main/java/com/ebremer/beakgraph/turbo/Intersects.java @@ -9,6 +9,7 @@ import org.apache.jena.sparql.expr.NodeValue; import org.apache.jena.sparql.function.FunctionBase; import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.geom.util.GeometryFixer; import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.WKTReader; @@ -69,15 +70,25 @@ private boolean performSpatialCheck(String wkt1, String wkt2) throws ParseExcept // JTS only accepts "POINT(1 1)", so we must strip the URI prefix. String cleanWkt1 = extractWkt(wkt1); String cleanWkt2 = extractWkt(wkt2); - Geometry g1 = reader.read(cleanWkt1); - Geometry g2 = reader.read(cleanWkt2); - if (!g1.isValid() || !g2.isValid()) { - throw new ParseException("Encountered invalid geometry topology."); - } + Geometry g1 = repaired(reader.read(cleanWkt1)); + Geometry g2 = repaired(reader.read(cleanWkt2)); return g1.intersects(g2); } + /** + * Topologically invalid geometry (self-intersecting rings - a data reality + * in pathology exports) must not make this function error out: the build + * deliberately indexes such geometries, and throwing here made Jena drop + * the row for every candidate whose stored WKT is invalid - an indexed + * geometry that no sfIntersects query could ever return. GeometryFixer + * preserves the point set (a bowtie becomes its two triangles), unlike + * buffer(0), which discards zero-area parts and lines/points. + */ + private static Geometry repaired(Geometry g) { + return g.isValid() ? g : GeometryFixer.fix(g); + } + /** * Helper to strip the CRS/SRS URI from a GeoSPARQL string. * Input: " POINT(30 10)" diff --git a/src/main/java/com/ebremer/beakgraph/turbo/SineWaveGenerator.java b/src/main/java/com/ebremer/beakgraph/turbo/SineWaveGenerator.java deleted file mode 100644 index 86bac53c..00000000 --- a/src/main/java/com/ebremer/beakgraph/turbo/SineWaveGenerator.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ebremer.beakgraph.turbo; - -import org.locationtech.jts.geom.Coordinate; -import org.locationtech.jts.geom.GeometryFactory; -import org.locationtech.jts.geom.LineString; - -public class SineWaveGenerator { - - private static final GeometryFactory geomFactory = new GeometryFactory(); - - /** - * Generates a JTS LineString representing a Sine Wave with an offset. - * - * @param A Amplitude (Height from center to peak). Total vertical span is 2*A. - * @param W Total Width (length along X axis). - * @param n Number of full cycles to fit within W. - * @param numPoints Resolution: How many points to use to draw the wave. - * @param offX X offset (shifts the start of the wave horizontally). - * @param offY Y offset (shifts the center of the wave vertically). - * @return A JTS LineString. - */ - public static LineString createSinePolyline(double A, double W, double n, int numPoints, double offX, double offY) { - Coordinate[] coords = new Coordinate[numPoints + 1]; - - // Calculate the angular frequency - double k = (2 * Math.PI * n) / W; - - for (int i = 0; i <= numPoints; i++) { - // 1. Calculate the local x (0 to W) used for the shape math - double xLocal = (double) i / numPoints * W; - - // 2. Calculate the local y based on the sine function - double yLocal = A * Math.sin(k * xLocal); - - // 3. Apply the offsets to get the final world coordinates - coords[i] = new Coordinate(xLocal + offX, yLocal + offY); - } - - return geomFactory.createLineString(coords); - } -} \ No newline at end of file diff --git a/src/main/java/com/ebremer/beakgraph/utils/HDTBitmapDirectory.java b/src/main/java/com/ebremer/beakgraph/utils/HDTBitmapDirectory.java index 050defe6..facbc76c 100644 --- a/src/main/java/com/ebremer/beakgraph/utils/HDTBitmapDirectory.java +++ b/src/main/java/com/ebremer/beakgraph/utils/HDTBitmapDirectory.java @@ -23,7 +23,6 @@ public class HDTBitmapDirectory { private final long numBitmapEntries; private final long numSuperblockEntries; private final long numBlockEntries; - private final long numIdEntries; public HDTBitmapDirectory(BitPackedUnSignedLongBuffer superblock, BitPackedUnSignedLongBuffer block, @@ -48,38 +47,10 @@ public HDTBitmapDirectory(BitPackedUnSignedLongBuffer superblock, this.numBitmapEntries = bitmap.getNumEntries(); this.numSuperblockEntries = superblock.getNumEntries(); this.numBlockEntries = block.getNumEntries(); - this.numIdEntries = ids.getNumEntries(); } public long getNumBitmapEntries() { return numBitmapEntries; } - public long rank1(long pos) { - if (pos <= 0) return 0L; - if (pos > numBitmapEntries) pos = numBitmapEntries; - - long targetBit = pos - 1; - long sbIdx = targetBit / superblockSize; - long bIdx = targetBit / blockSize; - - long rank = (sbIdx < numSuperblockEntries) ? superblock.get(sbIdx) : superblock.get(numSuperblockEntries - 1); - - if (bIdx < numBlockEntries) { - rank += block.get(bIdx); - } - - long currentPos = bIdx * blockSize; - while (currentPos + 64 <= pos) { - long word = bitmap.getWord64(currentPos); - rank += Long.bitCount(word); - currentPos += 64; - } - while (currentPos < pos) { - if (bitmap.get(currentPos) == 1) rank++; - currentPos++; - } - return rank; - } - public long select1(long rank) { if (rank <= 0) return -1L; @@ -162,28 +133,10 @@ public long select1(long rank) { } private long findNthSetBitInWord(long word, long n) { - // Broadword selection: 0-based index (from MSB) of the n-th set bit (n >= 1), - // O(1) via 6 popcount narrowing steps. Replaces an O(64) bit-by-bit loop; the - // result is identical to the linear select1's selectInWordSafe. - long result = 0; - int cnt; - cnt = Long.bitCount(word >>> 32); if (n > cnt) { word <<= 32; result += 32; n -= cnt; } - cnt = Long.bitCount(word >>> 48); if (n > cnt) { word <<= 16; result += 16; n -= cnt; } - cnt = Long.bitCount(word >>> 56); if (n > cnt) { word <<= 8; result += 8; n -= cnt; } - cnt = Long.bitCount(word >>> 60); if (n > cnt) { word <<= 4; result += 4; n -= cnt; } - cnt = Long.bitCount(word >>> 62); if (n > cnt) { word <<= 2; result += 2; n -= cnt; } - cnt = Long.bitCount(word >>> 63); if (n > cnt) { result += 1; } - return result; + // Delegates to the shared broadword implementation so the accelerated + // select1 and the buffer's linear select1 can never disagree. + return UTIL.selectInWord(word, n); } public BitPackedUnSignedLongBuffer getIds() { return ids; } - - public long getId(long rank) { - if (rank <= 0 || rank > numIdEntries) { - throw new IndexOutOfBoundsException("Rank " + rank + " out of bounds [1.." + numIdEntries + "]"); - } - return ids.get(rank - 1); - } - - public long getBitCount() { return rank1(numBitmapEntries); } } \ No newline at end of file diff --git a/src/main/java/com/ebremer/beakgraph/utils/UTIL.java b/src/main/java/com/ebremer/beakgraph/utils/UTIL.java index 005495bd..5d5e95a1 100644 --- a/src/main/java/com/ebremer/beakgraph/utils/UTIL.java +++ b/src/main/java/com/ebremer/beakgraph/utils/UTIL.java @@ -39,73 +39,6 @@ public static String toBinaryString(ByteBuffer buffer, int offset) { return sb.toString(); } - public static byte[] getBytes(ByteBuffer buffer) { - String cn = buffer.getClass().getName(); - if (cn.equals("java.nio.HeapByteBuffer2")) { - buffer.position(0); - int r = buffer.capacity(); - byte[] b = new byte[r]; - buffer.get(b); - return b; - } - return buffer.array(); - } - - public static ByteBuffer subBuffer(ByteBuffer src, int offset, int length) { - ByteBuffer dup = src.duplicate(); - dup.position(offset); - dup.limit(offset + length); - return dup.slice(); - } - - public static void skipNullTerminatedStrings(ByteBuffer buffer, int skip) { - if (skip > 0) { - int currentPosition = buffer.position(); - int limit = buffer.limit(); - for (int i = 0; i < skip; i++) { - while (currentPosition < limit) { - if (buffer.get(currentPosition) == 0) { - currentPosition++; - break; - } - currentPosition++; - } - } - buffer.position(currentPosition); - } - } - - public static String readNullTerminatedString(ByteBuffer buffer) { - if (!buffer.hasRemaining()) { - return ""; - } - int startPosition = buffer.position(); - int limit = buffer.limit(); - int endPosition = startPosition; - // Find the null terminator - while (endPosition < limit && buffer.get(endPosition) != 0) { - endPosition++; - } - int length = endPosition - startPosition; - byte[] stringBytes = new byte[length]; - // Use bulk get for better performance - buffer.get(stringBytes); - // If we stopped at a null terminator, skip over it - if (buffer.hasRemaining() && buffer.get() != 0) { - // This handles the edge case where the loop stopped at limit - // but we still need to advance position correctly. - // Usually, buffer.get() above moves position to endPosition. - // If the byte at endPosition was 0, buffer.get() consumes it. - } - // Correctly advance position to after the null terminator if it exists - if (endPosition < limit) { - buffer.position(endPosition + 1); - } else { - buffer.position(limit); - } - return new String(stringBytes, StandardCharsets.UTF_8); - } - public static WritableDataset putAttributes( WritableDataset ds, Map attributes ) { attributes.forEach((k,v)->{ ds.putAttribute(k, v); @@ -118,6 +51,25 @@ public static int MinBits(long x) { return Long.SIZE - Long.numberOfLeadingZeros(x); } + /** + * Broadword selection: the 0-based index (from the MSB) of the k-th set bit + * (k >= 1) of {@code word}, in O(1) via six popcount narrowing steps. The + * SINGLE implementation shared by the bit-packed buffer's linear select1 and + * the rank/select directory's accelerated select1 - the two must agree + * bit-for-bit or the directory fast path and the fallback diverge. + */ + public static int selectInWord(long word, long k) { + int result = 0; + int cnt; + cnt = Long.bitCount(word >>> 32); if (k > cnt) { word <<= 32; result += 32; k -= cnt; } + cnt = Long.bitCount(word >>> 48); if (k > cnt) { word <<= 16; result += 16; k -= cnt; } + cnt = Long.bitCount(word >>> 56); if (k > cnt) { word <<= 8; result += 8; k -= cnt; } + cnt = Long.bitCount(word >>> 60); if (k > cnt) { word <<= 4; result += 4; k -= cnt; } + cnt = Long.bitCount(word >>> 62); if (k > cnt) { word <<= 2; result += 2; k -= cnt; } + cnt = Long.bitCount(word >>> 63); if (k > cnt) { result += 1; } + return result; + } + /** * True when {@code iri} is a relative reference (RFC 3986) - i.e. it has no * scheme. The empty string (a same-document reference such as {@code <>}) is diff --git a/src/main/java/com/ebremer/halcyon/geometry/Vector2D.java b/src/main/java/com/ebremer/halcyon/geometry/Vector2D.java index d49753df..c9e22188 100644 --- a/src/main/java/com/ebremer/halcyon/geometry/Vector2D.java +++ b/src/main/java/com/ebremer/halcyon/geometry/Vector2D.java @@ -14,27 +14,30 @@ public class Vector2D { } public double Magnitude() { - return Math.sqrt((a*a)+(b*b)); + // double math: int*int overflows for coordinates above ~46340, which + // slide-scale coordinates routinely exceed. + return Math.sqrt(((double) a * a) + ((double) b * b)); } - + public static double Magnitude(long[] a) { - long sum = 0; + double sum = 0; for (int c=0; c + * Trimmed to the members with live callers; the legacy viewer rendering and + * rasterization utilities that accumulated here (image generation, JSON + * export, alternative Polygon2Hilbert variants, range merging) were unused - + * several demonstrably broken - and were removed in the dead-code sweep. * * @author erich */ public final class HilbertSpace { private static final Logger logger = LoggerFactory.getLogger(HilbertSpace.class); public static final SmallHilbertCurve hc = HilbertCurve.small().bits(31).dimensions(2); + + /** Largest coordinate the 31-bit curve can address. */ + public static final long MAX_COORD = (1L << 31) - 1; + public static final byte N = 0; public static final byte NE = 1; public static final byte E = 2; @@ -47,7 +43,21 @@ public final class HilbertSpace { public static final byte NW = 7; private HilbertSpace() {} - + + /** + * Clamps a coordinate into the curve's domain [0, 2^31). The davidmoten + * curve silently MASKS coordinates to their low 31 bits, so out-of-domain + * values alias onto unrelated cells - written and queried covers then + * disagree and matches are silently lost. Clamping is a monotone + * projection: applied identically on the write and query sides, two + * overlapping bboxes still overlap after it, so recall is preserved + * (out-of-domain geometry indexes coarsely at the domain-edge cells and + * the exact JTS verification removes the false positives). + */ + public static long clampToDomain(long v) { + return Math.max(0, Math.min(MAX_COORD, v)); + } + public static boolean inRange(ArrayList rr, Point p, Byte neighbor) { // Return the membership result - the old switch *statement* computed // contains(...) and discarded it, so this always answered false and the @@ -78,29 +88,7 @@ public static boolean inRange(Ranges rr, Point p, Byte neighbor) { default -> false; }; } - - public static Point getPoint(long p) { - long[] c = hc.point(p); - return new Point((int) c[0], (int) c[1]); - } - public static Polygon getFatPoint(long p) { - long[] c = hc.point(p); - int a = (int) c[0]; - int b = (int) c[1]; - int[] x = new int[4]; - int[] y = new int[4]; - x[0] = a; - y[0] = b; - x[1] = a+1; - y[1] = b; - x[2] = a+1; - y[2] = b+1; - x[3] = a; - y[3] = b+1; - return new Polygon(x,y,4); - } - public static Polygon getSkinnyPoint(int a, int b) { int[] x = new int[4]; int[] y = new int[4]; @@ -111,37 +99,15 @@ public static Polygon getSkinnyPoint(int a, int b) { x[2] = a; y[2] = b; x[3] = a; - y[3] = b; + y[3] = b; return new Polygon(x,y,4); } - + public static Polygon getSkinnyPoint(long p) { long[] c = hc.point(p); - int a = (int) c[0]; - int b = (int) c[1]; - int[] x = new int[4]; - int[] y = new int[4]; - x[0] = a; - y[0] = b; - x[1] = a; - y[1] = b; - x[2] = a; - y[2] = b; - x[3] = a; - y[3] = b; - return new Polygon(x,y,4); - } - - public static long getCentroidHilbertIndex(org.locationtech.jts.geom.Polygon polygon) { - if (polygon == null || polygon.isEmpty()) { - throw new IllegalArgumentException("Polygon cannot be null or empty"); - } - org.locationtech.jts.geom.Point centroid = polygon.getCentroid(); - int x = (int) Math.round(centroid.getX()); - int y = (int) Math.round(centroid.getY()); - return hc.index(new long[] {x, y}); + return getSkinnyPoint((int) c[0], (int) c[1]); } - + public static long[] getBoundingBoxHilbertIndices(org.locationtech.jts.geom.Polygon polygon) { if (polygon == null || polygon.isEmpty()) { throw new IllegalArgumentException("Polygon cannot be null or empty"); @@ -156,44 +122,8 @@ public static long[] getBoundingBoxHilbertIndices(org.locationtech.jts.geom.Poly long tr = hc.index(new long[] {maxX, maxY}); long br = hc.index(new long[] {maxX, minY}); return new long[] {bl, tl, tr, br}; - } - - public static Ranges Fatten(Ranges rr) { - Iterator i = rr.iterator(); - ArrayList nr = new ArrayList(); - while (i.hasNext()) { - Range r = i.next(); - for (long c = r.low(); c<=r.high();c++) { - long[] p = hc.point(c); - if (!nr.contains(c)) nr.add(c); - p[0] = p[0]+1; - long nn = hc.index(p); - if (!nr.contains(nn)) nr.add(nn); - p[0] = p[0]-1; - p[1] = p[1]+1; - nn = hc.index(p); - if (!nr.contains(nn)) nr.add(nn); - } - } - Collections.sort(nr); - Ranges neo = new Ranges(nr.size()); - Iterator ii = nr.iterator(); - long first; - long last; - while (ii.hasNext()) { - first = ii.next(); - last = first; - while (ii.hasNext()) { - long next = ii.next(); - if ((next-last)==1) { - last = next; - } - } - neo.add(new Range(first,last)); - } - return neo; } - + public static Point NextPoint(Point p, Byte neighbor) { switch (neighbor) { case N -> { return new Point(p.x,p.y-1); } @@ -207,11 +137,6 @@ public static Point NextPoint(Point p, Byte neighbor) { } return null; } - - public static Point GetXY(long p) { - long[] c = hc.point(p); - return new Point((int) c[0],(int) c[1]); - } public static boolean contains(ArrayList rr, int x, int y) { long target = hc.index(new long[] {x,y}); @@ -222,7 +147,7 @@ public static boolean contains(ArrayList rr, int x, int y) { } return false; } - + public static boolean contains(Ranges rr, int x, int y) { long target = hc.index(new long[] {x,y}); for (Range r : rr) { @@ -232,200 +157,7 @@ public static boolean contains(Ranges rr, int x, int y) { } return false; } - - public static BufferedImage GetBI(int px, int py, int width, int height, Ranges ranges) { - BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB); - Graphics2D g2 = bi.createGraphics(); - g2.setColor(Color.RED); - g2.fillRect(0, 0, width, height); - for (Range pp : ranges) { - for (long k=pp.low(); k<(pp.high()+1); k++) { - long[] point = hc.point(k); - int x = (int)(point[0]- px); - int y = (int)(point[1]- py); - if ((x0)&&(y0)) { - bi.setRGB(x, y, 0xFF0000FF); - } - } - } - return bi; - } - - public static Ranges search(int x, int y, int width, int height) { - long[] a = new long[] {x,y}; - long[] b = new long[] {x+width-1,y+height-1}; - return hc.query(a, b); - } - - public static hsPolygon Box(int x, int y, int width, int height) { - return new hsPolygon(search(x,y,width,height)); - } - public static BufferedImage GetBI(int px, int py, int width, int height, HashMap> ranges, HashMap cvalues, HashMap pvalues) { - BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB); - Graphics2D g2 = bi.createGraphics(); - g2.setColor(new Color(128,0,128,128)); - g2.fillRect(0, 0, width, height); - for (Integer id : ranges.keySet()) { - float pc = pvalues.get(id); - int classid = cvalues.get(id); - int prob = (int) (pc*255f+0.5); - int color = (0xFF000000)+(classid<<16)+(prob<<8); - ArrayList rs = ranges.get(id); - for (Range pp : rs) { - long len = pp.high()-pp.low()+1; - if ((pp.low()>0)&&(len<((width*height)+1))) { - for (long k=pp.low(); k<(pp.high()+1); k++) { - long[] point = hc.point(k); - int x = (int)(point[0]- px); - int y = (int)(point[1]- py); - if ((x=0)&&(y=0)) { - bi.setRGB(x, y, color); - } - } - } - } - } - return bi; - } - - public static BufferedImage GetBIbyClass(int px, int py, int width, int height, HashMap> ranges, HashMap values) { - BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB); - Graphics2D g2 = bi.createGraphics(); - g2.setColor(new Color(128,0,128,128)); - g2.fillRect(0, 0, width, height); - for (Integer id : ranges.keySet()) { - int color = values.get(id); - color = (0xFF000000)+(color<<16)+(color<<8)+(color); - ArrayList rs = ranges.get(id); - for (Range pp : rs) { - long len = pp.high()-pp.low()+1; - if ((pp.low()>0)&&(len<((width*height)+1))) { - for (long k=pp.low(); k<(pp.high()+1); k++) { - long[] point = hc.point(k); - int x = (int)(point[0]- px); - int y = (int)(point[1]- py); - if ((x=0)&&(y=0)) { - bi.setRGB(x, y, color); - } - } - } - } - } - return bi; - } - - public static BufferedImage GetBIbyProbability(int px, int py, int width, int height, HashMap> ranges, HashMap values) { - BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB); - Graphics2D g2 = bi.createGraphics(); - g2.setColor(new Color(128,0,128,128)); - g2.fillRect(0, 0, width, height); - for (Integer id : ranges.keySet()) { - float pc = values.get(id); - int color = (int) (pc*255f+0.5); - color = (0xFF000000)+(color<<16)+(color<<8)+(color); - ArrayList rs = ranges.get(id); - for (Range pp : rs) { - long len = pp.high()-pp.low()+1; - if ((pp.low()>0)&&(len<((width*height)+1))) { - for (long k=pp.low(); k<(pp.high()+1); k++) { - long[] point = hc.point(k); - int x = (int)(point[0]- px); - int y = (int)(point[1]- py); - if ((x=0)&&(y=0)) { - bi.setRGB(x, y, color); - } - } - } - } - } - return bi; - } - - public static Box BoundingBox(Ranges rr) { - long start = System.nanoTime(); - Iterator i = rr.iterator(); - long c = 0; - Box bb = new Box(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE); - while (i.hasNext()) { - Range r = i.next(); - c = c + (r.high()-r.low()+1); - } - int cc = (int) c; - int[] px = new int[cc]; - int[] py = new int[cc]; - int k = -1; - i = rr.iterator(); - while (i.hasNext()) { - k++; - Range r = i.next(); - for (long a=r.low();a> ranges, HashMap values, HashMap classids) { - logger.debug("Convert to JSON String..."); - long start = System.nanoTime(); - JsonArrayBuilder jab = Json.createArrayBuilder(); - for (Integer id : ranges.keySet()) { - ArrayList rs = ranges.get(id); - Ranges rr = hTools.Tran(rs); - Polygon p = getPolygon(rr); - JsonArrayBuilder cab = Json.createArrayBuilder(); - if (p!=null) { - JsonObjectBuilder job = Json.createObjectBuilder(); - for (int k=0;k i = rr.iterator(); Point top = new Point(Integer.MAX_VALUE,Integer.MAX_VALUE); @@ -446,12 +178,7 @@ public static Point GetUpperLeft(Ranges rr) { } return top; } - - public static hNode DetermineNeighbors(Long p) { - hNode node = new hNode(); - return node; - } - + public static Polygon getPolygon(Ranges rr) { if (rr.size()==1) { Iterator ri = rr.iterator(); @@ -473,7 +200,7 @@ public static Polygon getPolygon(Ranges rr) { do { boolean jumped; do { - jumped = true; + jumped = true; if (inRange(big, cp, N) &&!inRange(big,cp, NW) && (v.getNumVisits(cp)>v.getNumVisits(NextPoint(cp, N)))) { ld = cd; lp.x = cp.x; lp.y = cp.y; cp.y--; cd = N; @@ -515,151 +242,7 @@ public static Polygon getPolygon(Ranges rr) { p.addPoint(cp.x, cp.y); return p; } - - public static String SpaceIT(String c) { - String e = ""; - int units = c.length()/2; - int s; - if ((units*2) Polygon2Hilbert(Polygon p, int scale) { - if (scale>0) { - for (int i=0; i>scale; - p.ypoints[i]=p.ypoints[i]>>scale; - } - return Polygon2Hilbert(p); - } else { - return Polygon2Hilbert(p); - } - } - - public static boolean mergable(Range a, Range b) { - if (a.high()= a.low()) { - return true; - } - return a.high() >= b.low(); - } - - public static Range merge(Range a, Range b) { - return new Range(Math.min(a.low(), b.low()),Math.max(a.high(), b.high())); - } - public static long Area(ArrayList list) { - long area = 0; - for (Range item : list) { - area = area + item.high()-item.low()+1; - } - return area; - } - - public static ArrayList compact(ArrayList list) { - if (list.size()==1) { - return list; - } else { - ArrayList neo = new ArrayList<>(); - while (list.size()>1) { - Range item = list.get(0); - int i = 1; - while ((list.size()>1)&&(i list) { - Iterator i = list.iterator(); - while (i.hasNext()) { - logger.debug("{}", i.next()); - } - } - - public static int len(int x1, int x2, int y1, int y2) { - return (int) Math.sqrt(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2))); - } - - public static boolean isSquare(Polygon p) { - if (p.npoints!=4) return false; - int s1 = len(p.xpoints[0],p.xpoints[1],p.ypoints[0],p.ypoints[1]); - int s2 = len(p.xpoints[1],p.xpoints[2],p.ypoints[1],p.ypoints[2]); - int s3 = len(p.xpoints[2],p.xpoints[3],p.ypoints[2],p.ypoints[3]); - int s4 = len(p.xpoints[3],p.xpoints[0],p.ypoints[3],p.ypoints[0]); - return (s1==s2)&&(s2==s3)&&(s3==s4); - } - - public static ArrayList Polygon2Hilbert(Polygon p) { - ArrayList rah = new ArrayList(); - Area a = new Area(p); - Rectangle2D r = a.getBounds2D(); - int minx = (int) r.getMinX(); - int maxx = (int) r.getMaxX(); - int miny = (int) r.getMinY(); - int maxy = (int) r.getMaxY(); - ArrayList pp = new ArrayList(); - for (int x=minx;x 100 ? clean.substring(0, 100) + "..." : clean), ex); } } - - public static ArrayList Polygon2Hilbert(String wkt) { - return Polygon2Hilbert(fromWkt(wkt)); - } - - public static ArrayList Polygon2Hilbert(org.locationtech.jts.geom.Polygon p) { - ArrayList rah = new ArrayList(); - GeometryFactory geometryFactory = new GeometryFactory(); - Envelope r = p.getEnvelopeInternal(); - int minx = (int) r.getMinX(); - int maxx = (int) r.getMaxX(); - int miny = (int) r.getMinY(); - int maxy = (int) r.getMaxY(); - ArrayList pp = new ArrayList(); - for (int x=minx;x 200) ? wkt.substring(0, 200) + "..." : wkt; + } + public static Polygon fixPolygon(Polygon polygon) { // Check if already valid if (polygon.isValid()) { @@ -80,7 +99,10 @@ public static Polygon fixPolygon(Polygon polygon) { return largest; } } - throw new IllegalStateException("Unable to fix invalid polygon: " + polygon); + // Describe the polygon by size and extent - embedding the full WKT of a + // possibly-100k-vertex polygon in an exception message helps nobody. + throw new IllegalStateException("Unable to fix invalid polygon (" + + polygon.getNumPoints() + " points, envelope " + polygon.getEnvelopeInternal() + ")"); } /** @@ -90,14 +112,31 @@ public static Polygon fixPolygon(Polygon polygon) { * @return Array of Polygons (Levels). */ public static Polygon[] toPolygons(Polygon original) { + if (original == null || original.isEmpty()) { + return null; + } + // Snap/clean here (not only in the String entry) so callers passing raw + // JTS parts - e.g. individual MULTIPOLYGON members - get the same + // integer-grid treatment. + original.apply(new IntSnapFilter()); + original = snapAndSimplify(original); if (original == null) { + logger.warn("Polygon collapsed during integer snapping; skipping spatial indexing"); return null; } List scaledPolygons = new ArrayList<>(); - Polygon current = fixPolygon(original); + Polygon current; + try { + current = fixPolygon(original); + } catch (RuntimeException ex) { + // One unfixable geometry must not abort the whole build: skip its + // spatial indexing - the source quad itself is still stored. + logger.warn("Skipping spatial indexing of unfixable polygon: {}", ex.getMessage()); + return null; + } if (current == null || !current.isValid()) { return new Polygon[0]; - } + } int maxIterations = 20; // Safety limit to prevent infinite loops int iterations = 0; while (iterations < maxIterations) { @@ -166,14 +205,17 @@ public static List getGridCells(Polygon poly, int numscales) { /** * Determines which grid cells the polygon intersects at a specific resolution scale. - * Logic: - * Scale 0: Tile covers 256 coordinates. - * Scale 1: Tile covers 512 coordinates (1/2 resolution). - * Scale 2: Tile covers 1024 coordinates (1/4 resolution). - * Formula: EffectiveSize = 256 * 2^scale - * + *

    + * The polygon is expected in the coordinates of ITS OWN scale level (already + * divided by 2^scale, as produced by {@link #toPolygons}), and every level's + * tiles are {@code GRIDTILESIZE} units on a side in those level coordinates - + * exactly the grid the writer persists (see generateGridURNs). The old + * formula multiplied the tile size by 2^scale ON TOP of the already-scaled + * coordinates, so for scale >= 1 the computed cells disagreed with every + * stored tile graph URN. + * * @param cells List to accumulate intersecting grid cells - * @param poly The input JTS Polygon (in base scale 0 coordinates) + * @param poly The input JTS Polygon, in scale-level coordinates * @param scale The pyramid scale level (0, 1, 2, 3...) * @return List of GridCell indices at the requested scale */ @@ -181,8 +223,8 @@ public static List getGridCells(List cells, Polygon poly, sh if (poly == null || poly.isEmpty() || scale < 0) { return cells; } - - double effectiveTileSize = GRIDTILESIZE * (1 << scale); + + double effectiveTileSize = GRIDTILESIZE; Envelope env = poly.getEnvelopeInternal(); int minGridX = (int) Math.floor(env.getMinX() / effectiveTileSize); @@ -238,40 +280,62 @@ public boolean isGeometryChanged() { } private static Polygon removeDuplicateAndCollinearVertices(Polygon poly) { - Coordinate[] coords = poly.getExteriorRing().getCoordinates(); - List cleaned = new ArrayList<>(); + // Clean every ring, not just the shell: interior rings (holes - lumens in + // pathology annotations) must survive cleanup. A hole that collapses under + // snapping is dropped while the outer shape survives. + Coordinate[] shellCoords = cleanRing(poly.getExteriorRing().getCoordinates()); + if (shellCoords == null) { + return null; + } + List holes = new ArrayList<>(); + for (int h = 0; h < poly.getNumInteriorRing(); h++) { + Coordinate[] ring = cleanRing(poly.getInteriorRingN(h).getCoordinates()); + if (ring != null) { + try { + holes.add(gf.createLinearRing(ring)); + } catch (Exception e) { + // collapsed/invalid hole: drop it, keep the polygon + } + } + } + try { + LinearRing shell = gf.createLinearRing(shellCoords); + return gf.createPolygon(shell, holes.toArray(LinearRing[]::new)); + } catch (Exception e) { + return null; + } + } + + /** De-duplicates and de-collinearizes one ring; null when it collapses (<4 points). */ + private static Coordinate[] cleanRing(Coordinate[] coords) { + List cleaned = new ArrayList<>(); // Remove duplicate consecutive vertices for (Coordinate coord : coords) { if (cleaned.isEmpty() || !coord.equals2D(cleaned.get(cleaned.size() - 1))) { cleaned.add(coord); } - } + } // Remove collinear points int i = 0; while (i < cleaned.size() - 2) { Coordinate a = cleaned.get(i); Coordinate b = cleaned.get(i + 1); Coordinate c = cleaned.get(i + 2); - + // Check if b is collinear with a and c if (Orientation.index(a, b, c) == 0) { cleaned.remove(i + 1); } else { i++; } - } + } // Ensure ring closure if (!cleaned.isEmpty() && !cleaned.get(0).equals2D(cleaned.get(cleaned.size() - 1))) { cleaned.add(new Coordinate(cleaned.get(0))); - } + } if (cleaned.size() < 4) { return null; - } - try { - LinearRing shell = gf.createLinearRing(cleaned.toArray(new Coordinate[0])); - return gf.createPolygon(shell); - } catch (Exception e) { - return null; } + return cleaned.toArray(new Coordinate[0]); } } diff --git a/src/main/java/com/ebremer/halcyon/hilbert/WKTDatatype.java b/src/main/java/com/ebremer/halcyon/hilbert/WKTDatatype.java index 9543992c..44a8621b 100644 --- a/src/main/java/com/ebremer/halcyon/hilbert/WKTDatatype.java +++ b/src/main/java/com/ebremer/halcyon/hilbert/WKTDatatype.java @@ -2,7 +2,6 @@ import org.apache.jena.datatypes.BaseDatatype; import org.apache.jena.datatypes.DatatypeFormatException; -import org.apache.jena.graph.impl.LiteralLabel; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.WKTReader; @@ -10,9 +9,16 @@ public class WKTDatatype extends BaseDatatype { - public static final String URI = "http://www.opengis.net/ont/geosparql#wktLiteral"; + public static final String URI = "http://www.opengis.net/ont/geosparql#wktLiteral"; public static final WKTDatatype INSTANCE = new WKTDatatype(); + static { + // Self-register on first touch: without this, the parse/equality machinery + // below was inert - TypeMapper handed out a generic datatype for + // geo:wktLiteral and nothing ever consulted this class. + org.apache.jena.datatypes.TypeMapper.getInstance().registerDatatype(INSTANCE); + } + private WKTDatatype() { super(URI); } @@ -21,7 +27,7 @@ private WKTDatatype() { * Parse the Lexical Form (String) into a Java Object (JTS Geometry). * GeoSPARQL literals can look like: " POINT(10 20)" * @param lexicalForm - * @return + * @return */ @Override public Object parse(String lexicalForm) throws DatatypeFormatException { @@ -38,10 +44,16 @@ public Object parse(String lexicalForm) throws DatatypeFormatException { } WKTReader reader = new WKTReader(); return reader.read(cleanWkt); - } catch (ParseException e) { + } catch (ParseException | RuntimeException e) { + // JTS throws IllegalArgumentException - not ParseException - for + // structurally invalid geometry (e.g. a two-point ring), and RIOT + // validates every wktLiteral through this method now that the + // datatype is registered. Anything escaping here turns one bad + // literal into a fatal abort of the whole parse; wrapping it makes + // it the ill-typed-literal warning it should be. throw new DatatypeFormatException( - lexicalForm, - this, + lexicalForm, + this, "Invalid WKT format: " + e.getMessage() ); } @@ -76,24 +88,10 @@ public boolean isValid(String lexicalForm) { } } - /** - * Comparison logic for SPARQL FILTERs - * @param value1 - * @param value2 - * @return - */ - @Override - public boolean isEqual(LiteralLabel value1, LiteralLabel value2) { - // Parse both to Geometries and check equality (topological equality) - if (value1.getDatatype() == this && value2.getDatatype() == this) { - try { - Geometry g1 = (Geometry) value1.getValue(); - Geometry g2 = (Geometry) value2.getValue(); - return g1.equals(g2); // JTS topological equality - } catch (Exception e) { - return false; - } - } - return super.isEqual(value1, value2); - } + // NOTE: no isEqual override. An earlier version compared wktLiterals by JTS + // topological equality, which changes RDF *term* equality - sameTerm, HashSet + // membership, and the writer's dictionary deduplication would silently + // collapse lexically distinct geometries (and pay a JTS parse per equality + // check). Term equality stays lexical (the BaseDatatype default); geometric + // comparison belongs in filter functions like geof:sfIntersects. } diff --git a/src/main/java/com/ebremer/halcyon/hilbert/eRange.java b/src/main/java/com/ebremer/halcyon/hilbert/eRange.java deleted file mode 100644 index 5ac0fd29..00000000 --- a/src/main/java/com/ebremer/halcyon/hilbert/eRange.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.ebremer.halcyon.hilbert; - -/** - * - * @author erich - */ -public class eRange implements Comparable { - private final long low; - private final long high; - - public eRange(long low, long high) { - this.low = Math.min(low, high); - this.high = Math.max(low, high); - } - - @Override - public int compareTo(eRange candidate) { - return (this.low < candidate.low() ? -1 : - (this.low == candidate.low() ? 0 : 1)); - } - - public static eRange create(long low, long high) { - return new eRange(low, high); - } - - public static eRange create(long value) { - return new eRange(value, value); - } - - public long low() { - return low; - } - - public long high() { - return high; - } - - public boolean contains(long value) { - return low <= value && value <= high; - } - - @Override - public String toString() { - return "Range [low=" + low + ", high=" + high + "]"; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (int) (high ^ (high >>> 32)); - result = prime * result + (int) (low ^ (low >>> 32)); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - eRange other = (eRange) obj; - if (high != other.high) - return false; - return low == other.low; - } - - public eRange join(eRange range) { - return eRange.create(Math.min(low, range.low), Math.max(high, range.high)); - } - -} diff --git a/src/main/java/com/ebremer/halcyon/hilbert/hNode.java b/src/main/java/com/ebremer/halcyon/hilbert/hNode.java deleted file mode 100644 index 95ccb3ed..00000000 --- a/src/main/java/com/ebremer/halcyon/hilbert/hNode.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.ebremer.halcyon.hilbert; - -/** - * - * @author erich - */ -public class hNode { - public hNode left = null; - public hNode right = null; - -} diff --git a/src/main/java/com/ebremer/halcyon/hilbert/hTools.java b/src/main/java/com/ebremer/halcyon/hilbert/hTools.java deleted file mode 100644 index 65258159..00000000 --- a/src/main/java/com/ebremer/halcyon/hilbert/hTools.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.ebremer.halcyon.hilbert; - -import java.util.ArrayList; -import java.util.Collections; -import org.davidmoten.hilbert.Range; -import org.davidmoten.hilbert.Ranges; - -/** - * - * @author erich - */ -public class hTools { - - public static Ranges Tran(ArrayList src) { - ArrayList tmp = new ArrayList<>(); - for (Range r : src) { - tmp.add(new eRange(r.low(),r.high())); - } - Collections.sort(tmp); - Ranges rr = new Ranges(tmp.size()); - for (eRange ee : tmp) { - rr.add(ee.low(),ee.high()); - } - return rr; - } -} diff --git a/src/main/java/com/ebremer/halcyon/hilbert/hsPolygon.java b/src/main/java/com/ebremer/halcyon/hilbert/hsPolygon.java deleted file mode 100644 index 3f36eb08..00000000 --- a/src/main/java/com/ebremer/halcyon/hilbert/hsPolygon.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ebremer.halcyon.hilbert; - -import java.util.List; -import org.davidmoten.hilbert.Range; -import org.davidmoten.hilbert.Ranges; - -/** - * - * @author erich - */ -public class hsPolygon { - List ranges; - private long min; - private long max; - - public hsPolygon(Ranges r) { - ranges = r.toList(); - } - - private long getMin() { - return min; - } - - private long getMax() { - return max; - } - - private void FindMixMax() { - min = Long.MAX_VALUE; - max = Long.MIN_VALUE; - for (Range r : ranges) { - min = Math.min(min,r.low()); - max = Math.max(max,r.high()); - } - } - - public List getRanges() { - return ranges; - } - -} diff --git a/src/main/resources/META-INF/native-image/resource-config.json b/src/main/resources/META-INF/native-image/resource-config.json index 23d8e113..c78a3056 100644 --- a/src/main/resources/META-INF/native-image/resource-config.json +++ b/src/main/resources/META-INF/native-image/resource-config.json @@ -2,7 +2,9 @@ "resources": { "includes": [ { "pattern": "META-INF/sparql/.*" }, - { "pattern": "log4j2.yaml" }, + { "pattern": "beakgraph.png" }, + { "pattern": "beakgraph-version.properties" }, + { "pattern": "log4j2.yml" }, { "pattern": "org/apache/jena/ext/xerces/impl/msg/.*" }, { "pattern": "META-INF/services/.*" } ] diff --git a/src/main/resources/META-INF/sparql/beakgraph.png b/src/main/resources/META-INF/sparql/beakgraph.png deleted file mode 100644 index 57e7a442b2cd9ac2f08847191905edb1f3ba4203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1616762 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໭TXt|+b~IlWf<0OhJ-5@s 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

    0t`?JOQkEYck(^-}C;~;#z6b)m;SMuvlOm4xr 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 z%0A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
    L$_3$m`5PmB`ewlKRA(xF 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

    }vgiwQ>FJTHsTj;fV7LGBZ=5#zQ5uspmo;kV@P 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

    1Mrv~&6{IP9yZYGFw(g-`Q}y8lF3l|&_IYI{WwU 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 KMNUMnLSTZU0hMh4 diff --git a/src/main/resources/log4j2.yml b/src/main/resources/log4j2.yml index 821b8f6f..7ab3d18f 100644 --- a/src/main/resources/log4j2.yml +++ b/src/main/resources/log4j2.yml @@ -23,6 +23,15 @@ Configuration: - ref: FileAppender Logger: + # BeakGraph's own progress reporting (quads loaded, dictionary/index build, + # skipped geometries) lives at INFO/WARN - the root stays at ERROR so + # third-party libraries remain quiet. + - name: com.ebremer.beakgraph + level: info + additivity: false + AppenderRef: + - ref: STDOUT + - ref: FileAppender - name: org.apache.jena.fuseki level: error additivity: false diff --git a/src/test/java/com/ebremer/beakgraph/BGIteratorConcreteSubjectTest.java b/src/test/java/com/ebremer/beakgraph/BGIteratorConcreteSubjectTest.java index 9f6fb858..890e56f2 100644 --- a/src/test/java/com/ebremer/beakgraph/BGIteratorConcreteSubjectTest.java +++ b/src/test/java/com/ebremer/beakgraph/BGIteratorConcreteSubjectTest.java @@ -35,6 +35,7 @@ class BGIteratorConcreteSubjectTest { @TempDir static Path dir; + static BeakGraph bg; static Dataset ds; @BeforeAll @@ -46,7 +47,14 @@ static void buildAndOpen() throws Exception { .setSource(ttl).setDestination(h5) .setSpatial(false).setFeatures(false) .build().write(); - ds = new BeakGraph(new HDF5Reader(h5)).getDataset(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @org.junit.jupiter.api.AfterAll + static void closeReader() { + // Release the mapped file: a leaked reader makes @TempDir cleanup flaky on Windows. + if (bg != null) bg.close(); } private static int count(String iri) { diff --git a/src/test/java/com/ebremer/beakgraph/BadPolygonResilienceTest.java b/src/test/java/com/ebremer/beakgraph/BadPolygonResilienceTest.java new file mode 100644 index 00000000..f2a87a0e --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/BadPolygonResilienceTest.java @@ -0,0 +1,139 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import com.ebremer.halcyon.hilbert.PolygonScaler; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Regression tests for the bad-geometry policy: one problematic polygon must + * never abort a (possibly multi-hour) spatial build, and the failure modes are + * uniform - parse failure, snap-collapse and unfixable geometry all skip that + * geometry's spatial indexing (with a warning) while the source quad itself is + * still stored and every other geometry is indexed normally. + */ +class BadPolygonResilienceTest { + + // ex:degen is structurally invalid WKT (a two-point ring): JTS throws + // IllegalArgumentException for it, not ParseException - real pathology data + // contains these, and one of them must not abort the parse of a whole file. + private static final String TTL = """ + @prefix ex: . + @prefix geo: . + ex:good geo:asWKT "POLYGON((0 0,64 0,64 64,0 64,0 0))"^^geo:wktLiteral . + ex:tiny geo:asWKT "POLYGON((0.1 0.1,0.4 0.1,0.4 0.4,0.1 0.4,0.1 0.1))"^^geo:wktLiteral . + ex:bow geo:asWKT "POLYGON((0 0,10 10,10 0,0 10,0 0))"^^geo:wktLiteral . + ex:degen geo:asWKT "POLYGON((0 0,1 1))"^^geo:wktLiteral . + """; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("badpoly.ttl").toFile(); + File h5 = dir.resolve("badpoly.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + // The collapsing and self-intersecting geometries must not abort this. + HDF5Writer.Builder() + .setSource(ttl).setDestination(h5) + .setSpatial(true).setFeatures(false) + .build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static int count(String where) { + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create( + "PREFIX ex: SELECT * WHERE { " + where + " }")).build()) { + ResultSet rs = qe.execSelect(); + int n = 0; + while (rs.hasNext()) { rs.next(); n++; } + return n; + } + } + + @Test + void goodGeometryIsIndexedDespiteBadNeighbors() { + assertTrue(count("GRAPH <" + Params.SPATIALSTRING + "> { ex:good ?p ?o }") > 0, + "the well-formed geometry must be spatially indexed"); + } + + @Test + void collapsedGeometryHasNoScaledPyramidButBuildSurvives() { + // Snapping collapses the sub-pixel polygon, so no scaled-WKT pyramid is + // produced for it (and - critically - the build did not abort). Its + // recall-safe index cells ARE still written: the geometry stays findable, + // and sfIntersects verification uses the precise original WKT. + assertEquals(0, count("GRAPH <" + Params.SPATIALSTRING + "> { ex:tiny ?o }")); + } + + @Test + void sourceQuadsSurviveRegardlessOfGeometryFate() { + assertEquals(4, count("?s ?o")); + } + + @Test + void structurallyInvalidWktIsKeptAsATermAndSkippedSpatially() { + // The two-point ring survives as an RDF term (lexical + datatype intact)... + assertEquals(1, count("ex:degen " + + "\"POLYGON((0 0,1 1))\"^^")); + // ...but contributes nothing to the spatial index. + assertEquals(0, count("GRAPH <" + Params.SPATIALSTRING + "> { ex:degen ?p ?o }")); + } + + @Test + void selfIntersectingStoredGeometryIsReturnedBySpatialQueries() { + // The bowtie is deliberately indexed at build time; the sfIntersects + // verification stage must repair it rather than throw (which made Jena + // drop the row - an indexed geometry no query could ever return). + // Region inside the bowtie's left lobe; it also overlaps ex:good. + assertEquals(1, count("?f ?w . " + + "FILTER(?f = ex:bow) " + + "FILTER((?w, " + + "\"POLYGON((1 4,2 4,2 6,1 6,1 4))\"^^))"), + "the self-intersecting geometry must be returned by a query over its real area"); + } + + @Test + void invalidQueryRegionStillAnswersInsteadOfEmptying() { + // A self-intersecting QUERY region must be repaired too, not silently + // turned into zero rows for every candidate. + assertEquals(1, count("ex:good ?w . " + + "FILTER((?w, " + + "\"POLYGON((0 0,20 20,20 0,0 20,0 0))\"^^))")); + } + + @Test + void unfixablePolygonReturnsNullInsteadOfThrowing() { + // Direct unit check of the policy seam: a geometry the fixer cannot repair + // must come back as "skip" (null), never as an exception that would abort + // the build. An empty polygon exercises the null/empty guard; the + // collapsing TTL geometry above exercises the snap-collapse path end-to-end. + assertNull(PolygonScaler.toPolygons( + new org.locationtech.jts.geom.GeometryFactory().createPolygon())); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/BitPackedUnSignedLongBufferTest.java b/src/test/java/com/ebremer/beakgraph/BitPackedUnSignedLongBufferTest.java index 78196422..235704c0 100644 --- a/src/test/java/com/ebremer/beakgraph/BitPackedUnSignedLongBufferTest.java +++ b/src/test/java/com/ebremer/beakgraph/BitPackedUnSignedLongBufferTest.java @@ -35,6 +35,34 @@ void roundTripsAcrossSupportedWidths() { } } + @Test + void streamFailsLoudlyOnTruncatedBuffer() { + // A buffer shorter than its declared entry count is corrupt. The stream + // used to emit silent garbage (negative-shift artifacts) where the + // sequential reader threw; both must now fail loudly. + java.nio.ByteBuffer twoBytes = java.nio.ByteBuffer.allocate(2); + BitPackedUnSignedLongBuffer truncated = new BitPackedUnSignedLongBuffer(null, twoBytes, 10, 16); + assertThrows(java.nio.BufferUnderflowException.class, () -> truncated.stream().toArray()); + } + + @Test + void rejectsValuesThatWouldBeTruncated() { + // A value wider than the buffer's bit width used to be silently masked, + // corrupting the dictionary far from the cause. It must be rejected. + BitPackedUnSignedLongBuffer narrow = new BitPackedUnSignedLongBuffer(null, null, 0, 8); + assertDoesNotThrow(() -> narrow.writeLong(255)); + assertThrows(IllegalArgumentException.class, () -> narrow.writeLong(256)); + assertThrows(IllegalArgumentException.class, () -> narrow.writeLong(-1)); + assertThrows(IllegalArgumentException.class, () -> narrow.writeInteger(256)); + + // Widths 32 and 64 legitimately carry full two's-complement patterns + // (the int/long literal buffers): negatives must stay writable there. + BitPackedUnSignedLongBuffer w32 = new BitPackedUnSignedLongBuffer(null, null, 0, 32); + assertDoesNotThrow(() -> w32.writeInteger(-5)); + BitPackedUnSignedLongBuffer w64 = new BitPackedUnSignedLongBuffer(null, null, 0, 64); + assertDoesNotThrow(() -> w64.writeLong(Long.MIN_VALUE)); + } + @Test void rejectsUnsupportedBitWidths() { // 58..63 would overflow the 64-bit accumulator (value + <=7-bit sub-byte offset) and silently diff --git a/src/test/java/com/ebremer/beakgraph/DefaultGraphSentinelTest.java b/src/test/java/com/ebremer/beakgraph/DefaultGraphSentinelTest.java new file mode 100644 index 00000000..801289a7 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/DefaultGraphSentinelTest.java @@ -0,0 +1,84 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.core.lib.NodeComparator; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.apache.jena.graph.Node; +import org.apache.jena.graph.NodeFactory; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.apache.jena.sparql.core.Quad; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * The two ARQ default-graph sentinel URIs are DISTINCT RDF terms. The + * comparator ranked both "default" and returned 0 for the pair, so a source + * that used urn:x-arq:DefaultGraphNode as a data term collapsed it onto the + * same dictionary id as urn:x-arq:DefaultGraph - queries then returned the + * wrong term or nothing. + */ +class DefaultGraphSentinelTest { + + @Test + void sentinelTermsAreDistinctAndDefaultGraphSortsFirst() { + NodeComparator cmp = NodeComparator.INSTANCE; + Node dg = Quad.defaultGraphIRI; + Node dgn = Quad.defaultGraphNodeGenerated; + assertTrue(cmp.compare(dg, dgn) != 0, "distinct sentinel terms must not compare equal"); + assertTrue(cmp.compare(dg, dgn) < 0, "urn:x-arq:DefaultGraph must keep the lowest rank"); + assertEquals(-Integer.signum(cmp.compare(dgn, dg)), Integer.signum(cmp.compare(dg, dgn))); + // Both sentinels still rank before ordinary terms. + Node uri = NodeFactory.createURI("http://ex.org/a"); + assertTrue(cmp.compare(dg, uri) < 0); + assertTrue(cmp.compare(dgn, uri) < 0); + assertEquals(0, cmp.compare(dg, dg)); + assertEquals(0, cmp.compare(dgn, dgn)); + } + + @TempDir + Path dir; + + @Test + void sentinelUriAsDataTermRoundTrips() throws Exception { + String ttl = """ + @prefix ex: . + ex:p . + ex:q "v" . + ex:normal ex:p ex:other . + """; + File src = dir.resolve("sentinel.ttl").toFile(); + File h5 = dir.resolve("sentinel.ttl.h5").toFile(); + Files.write(src.toPath(), ttl.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(src).setDestination(h5) + .setSpatial(false).setFeatures(false).build().write(); + + try (BeakGraph bg = new BeakGraph(new HDF5Reader(h5))) { + Dataset ds = bg.getDataset(); + assertEquals(1, count(ds, "SELECT ?o WHERE { ex:p ?o }"), + "the sentinel-URI subject must be findable as its own term"); + assertEquals(1, count(ds, "SELECT ?s WHERE { ?s ex:q \"v\" }")); + assertEquals(3, count(ds, "SELECT * WHERE { ?s ?p ?o }")); + } + } + + private static int count(Dataset ds, String query) { + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create("PREFIX ex: " + query)).build()) { + ResultSet rs = qe.execSelect(); + int n = 0; + while (rs.hasNext()) { rs.next(); n++; } + return n; + } + } +} diff --git a/src/test/java/com/ebremer/beakgraph/DualRoleUriTest.java b/src/test/java/com/ebremer/beakgraph/DualRoleUriTest.java index c70f6641..5c01da3b 100644 --- a/src/test/java/com/ebremer/beakgraph/DualRoleUriTest.java +++ b/src/test/java/com/ebremer/beakgraph/DualRoleUriTest.java @@ -44,6 +44,7 @@ class DualRoleUriTest { @TempDir static Path dir; + static BeakGraph bg; static Dataset ds; static File h5; @@ -53,7 +54,14 @@ static void build() throws Exception { h5 = dir.resolve("dual.ttl.h5").toFile(); Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); HDF5Writer.Builder().setSource(ttl).setDestination(h5).setSpatial(false).setFeatures(false).build().write(); - ds = new BeakGraph(new HDF5Reader(h5)).getDataset(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @org.junit.jupiter.api.AfterAll + static void closeReader() { + // Release the mapped file: a leaked reader makes @TempDir cleanup flaky on Windows. + if (bg != null) bg.close(); } private static String one(String var, String query) { diff --git a/src/test/java/com/ebremer/beakgraph/FeatureGenerationResilienceTest.java b/src/test/java/com/ebremer/beakgraph/FeatureGenerationResilienceTest.java new file mode 100644 index 00000000..ff5ac868 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/FeatureGenerationResilienceTest.java @@ -0,0 +1,97 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Regression test for the FEATURES pipeline's bad-geometry policy: a + * structurally invalid WKT (two-point ring - JTS throws + * IllegalArgumentException, not ParseException) must not abort the build + * through MajorMinor/Gen2DFeatures. One geometry's features are skipped with a + * warning; every other geometry still gets its features. + */ +class FeatureGenerationResilienceTest { + + private static final String TTL = """ + @prefix ex: . + @prefix geo: . + ex:good geo:asWKT "POLYGON((0 0,64 0,64 32,0 32,0 0))"^^geo:wktLiteral . + ex:degen geo:asWKT "POLYGON((0 0,1 1))"^^geo:wktLiteral . + ex:crs geo:asWKT " POLYGON((200 200,264 200,264 232,200 232,200 200))"^^geo:wktLiteral . + """; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("features.ttl").toFile(); + File h5 = dir.resolve("features.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + // Pre-fix this aborted: MajorMinor.add let the IllegalArgumentException + // escape into the spatial task's Future, failing the whole write. + HDF5Writer.Builder().setSource(ttl).setDestination(h5) + .setSpatial(true).setFeatures(true).build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static int count(String where) { + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create( + "PREFIX ex: PREFIX hal: SELECT * WHERE { " + where + " }")).build()) { + ResultSet rs = qe.execSelect(); + int n = 0; + while (rs.hasNext()) { rs.next(); n++; } + return n; + } + } + + @Test + void goodGeometryGetsFeatures() { + assertEquals(1, count("ex:good hal:centroid ?c"), + "the well-formed geometry must get its derived features"); + } + + @Test + void degenerateGeometryIsSkippedWithoutFeatures() { + assertEquals(0, count("ex:degen hal:centroid ?c")); + } + + @Test + void crsPrefixedGeometryGetsFeatures() { + // The GeoSPARQL-standard " WKT" form: the spatial indexing path + // stripped the prefix but feature generation re-read the raw lexical, so + // JTS threw and CRS-prefixed geometries silently got no features. + assertEquals(1, count("ex:crs hal:centroid ?c"), + "a CRS-prefixed geometry must get the same derived features as a plain one"); + } + + @Test + void bothSourceQuadsSurvive() { + assertTrue(count("ex:good ?p ?o") >= 1); + assertTrue(count("ex:degen ?p ?o") >= 1); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/FeatureMathTest.java b/src/test/java/com/ebremer/beakgraph/FeatureMathTest.java new file mode 100644 index 00000000..93d2709a --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/FeatureMathTest.java @@ -0,0 +1,49 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.ebremer.beakgraph.features.ShapeAnalysis; +import com.ebremer.halcyon.geometry.Point; +import com.ebremer.halcyon.geometry.Vector2D; +import java.awt.image.BufferedImage; +import org.junit.jupiter.api.Test; + +/** + * Regression tests for feature-math defects: + *

      + *
    • Vector2D.Magnitude(Point) computed sqrt(x*x + y+y) - addition instead + * of multiplication - and overflowed int for coordinates above ~46340.
    • + *
    • ShapeAnalysis.isEdge read the four neighbours without bounds checks, so + * a filled pixel on the image border threw ArrayIndexOutOfBoundsException + * out of Circumference.
    • + *
    + */ +class FeatureMathTest { + + @Test + void magnitudeUsesSquaresNotSums() { + assertEquals(5.0, Vector2D.Magnitude(new Point(3, 4)), 1e-9); + assertEquals(13.0, Vector2D.Magnitude(new Point(5, 12)), 1e-9); + } + + @Test + void magnitudeSurvivesLargeCoordinates() { + // 50000^2 overflows int; slide-scale coordinates routinely exceed 46340. + double expected = Math.sqrt(2.0 * 50000.0 * 50000.0); + assertEquals(expected, Vector2D.Magnitude(new Point(50000, 50000)), 1e-3); + } + + @Test + void circumferenceHandlesShapesTouchingTheBorder() { + // Every pixel filled: all are border/edge pixels. Previously isEdge read + // (x-1,y) etc. without bounds checks and threw on the first border pixel. + BufferedImage bi = new BufferedImage(3, 3, BufferedImage.TYPE_INT_ARGB); + for (int x = 0; x < 3; x++) { + for (int y = 0; y < 3; y++) { + bi.setRGB(x, y, 0xFFFFFFFF); + } + } + assertEquals(8, ShapeAnalysis.Circumference(bi), + "all pixels except the centre are edge pixels of the 3x3 block"); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/HilbertSpaceFixesTest.java b/src/test/java/com/ebremer/beakgraph/HilbertSpaceFixesTest.java index f12ea876..fae8c44d 100644 --- a/src/test/java/com/ebremer/beakgraph/HilbertSpaceFixesTest.java +++ b/src/test/java/com/ebremer/beakgraph/HilbertSpaceFixesTest.java @@ -56,6 +56,36 @@ void fromWktRejectsGarbageWithCatchableException() { throw new AssertionError("malformed WKT must raise a RuntimeException"); } + // --- Corner-only range relevance ---------------------------------------- + + @Test + void subCellPolygonProducesANonEmptyCover() { + // Smaller than one cell and away from every cell corner: the old + // relevance test only asked whether the polygon covers a range's two + // endpoint cell-corner POINTS, so this real polygon produced an EMPTY + // Hilbert cover - a silent false negative for every API consumer. + String subCell = "POLYGON((0.2 0.2,0.8 0.2,0.8 0.8,0.2 0.8,0.2 0.2))"; + ArrayList ranges = HilbertPolygon.Polygon2Hilbert(subCell, 0); + long cell00 = HilbertSpace.hc.index(0, 0); + assertFalse(ranges.isEmpty(), "a real polygon must produce a non-empty cover"); + assertTrue(ranges.stream().anyMatch(r -> r.low() <= cell00 && cell00 <= r.high()), + "the cover must contain the polygon's own cell"); + + // Same failure mode at a coarser scale (cells of 2^2 units). + ArrayList scaled = HilbertPolygon.Polygon2Hilbert(subCell, 2); + assertFalse(scaled.isEmpty(), "the scaled cover must not be empty either"); + } + + @Test + void cellInteriorOverlapKeepsTheRange() { + // Overlaps the interior of cell (5,4) without covering its corner point. + ArrayList ranges = HilbertPolygon.Polygon2Hilbert( + "POLYGON((5.2 4.2,5.8 4.2,5.8 4.8,5.2 4.8,5.2 4.2))", 0); + long cell = HilbertSpace.hc.index(5, 4); + assertTrue(ranges.stream().anyMatch(r -> r.low() <= cell && cell <= r.high()), + "a range whose cell the polygon overlaps must be kept"); + } + // --- H10 ---------------------------------------------------------------- @Test diff --git a/src/test/java/com/ebremer/beakgraph/InputBindingShapeTest.java b/src/test/java/com/ebremer/beakgraph/InputBindingShapeTest.java new file mode 100644 index 00000000..2e8ab935 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/InputBindingShapeTest.java @@ -0,0 +1,126 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.jena.graph.NodeFactory; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.apache.jena.sparql.core.Var; +import org.apache.jena.sparql.engine.binding.Binding; +import org.apache.jena.sparql.exec.QueryExec; +import org.apache.jena.sparql.exec.RowSet; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Bindings flowing INTO a BeakGraph BGP (VALUES, BIND, joins) must come back + * out well-formed. SolverLibBeak.convert copies every input var into the + * BindingNodeId for id-level solving, and BindingBG also mounts the original + * binding as its BindingBase parent - before the fix each input var was + * therefore exposed twice: size() was inflated, vars() yielded duplicates, and + * DISTINCT could not merge such a row with an equal-valued row of normal shape + * (two identical rows came back). + */ +class InputBindingShapeTest { + + private static final String TTL = """ + @prefix ex: . + ex:s1 ex:p ex:o1 . + """; + + private static final String PREFIX = "PREFIX ex: "; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("shape.ttl").toFile(); + File h5 = dir.resolve("shape.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(ttl).setDestination(h5) + .setSpatial(false).setFeatures(false).build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static int countRows(String query) { + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create(PREFIX + query)).build()) { + ResultSet rs = qe.execSelect(); + int n = 0; + while (rs.hasNext()) { rs.next(); n++; } + return n; + } + } + + @Test + void valuesSeededRowHasWellFormedShape() { + try (QueryExec qe = QueryExec.dataset(ds.asDatasetGraph()) + .query(PREFIX + "SELECT * WHERE { VALUES ?x { ex:s1 } ?x ex:p ?o }").build()) { + RowSet rows = qe.select(); + assertTrue(rows.hasNext()); + Binding b = rows.next(); + assertFalse(rows.hasNext(), "exactly one row expected"); + assertEquals(2, b.size(), "two variables must count as two, not re-count the input var"); + List vars = new ArrayList<>(); + b.vars().forEachRemaining(vars::add); + Set distinct = new HashSet<>(vars); + assertEquals(distinct.size(), vars.size(), "vars() must not yield duplicates: " + vars); + assertEquals(Set.of(Var.alloc("x"), Var.alloc("o")), distinct); + assertEquals(NodeFactory.createURI("http://ex.org/s1"), b.get(Var.alloc("x"))); + assertEquals(NodeFactory.createURI("http://ex.org/o1"), b.get(Var.alloc("o"))); + } + } + + @Test + void distinctMergesValuesSeededRowsWithScannedRows() { + assertEquals(1, countRows("SELECT DISTINCT ?x WHERE { { ?x ex:p ex:o1 } " + + "UNION { VALUES ?x { ex:s1 } ?x ex:p ex:o1 } }"), + "the seeded row and the scanned row bind the same term and must merge"); + } + + @Test + void distinctMergesBindSeededRowsWithScannedRows() { + assertEquals(1, countRows("SELECT DISTINCT ?x WHERE { { ?x ex:p ex:o1 } " + + "UNION { BIND(ex:s1 AS ?x) ?x ex:p ex:o1 } }")); + } + + @Test + void termNotInStoreStillRidesThroughToOutput() { + // ?y is not used by the pattern; its term does not exist in this store + // (a "does not exist" id) and must still come back bound to the + // original term via the parent binding. + try (QueryExec qe = QueryExec.dataset(ds.asDatasetGraph()) + .query(PREFIX + "SELECT * WHERE { VALUES ?y { ex:missing } ?s ex:p ?o }").build()) { + RowSet rows = qe.select(); + assertTrue(rows.hasNext()); + Binding b = rows.next(); + assertEquals(NodeFactory.createURI("http://ex.org/missing"), b.get(Var.alloc("y"))); + assertEquals(3, b.size()); + } + } +} diff --git a/src/test/java/com/ebremer/beakgraph/MalformedLiteralRoundTripTest.java b/src/test/java/com/ebremer/beakgraph/MalformedLiteralRoundTripTest.java new file mode 100644 index 00000000..71d3896a --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/MalformedLiteralRoundTripTest.java @@ -0,0 +1,122 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.apache.jena.rdf.model.Literal; +import org.apache.jena.rdf.model.RDFNode; +import org.apache.jena.vocabulary.XSD; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Regression tests for writer robustness against ill-typed literals: RDF + * permits literals whose lexical form is not valid for their datatype + * ("abc"^^xsd:int), and Jena's parsers accept them with a warning. The writer + * used to call getLiteralValue() unconditionally and abort the entire build on + * the resulting DatatypeFormatException. Such terms must instead be stored + * term-exact via the lexical strings path. + */ +class MalformedLiteralRoundTripTest { + + private static final String TTL = """ + @prefix ex: . + @prefix xsd: . + ex:a ex:v "abc"^^xsd:int . + ex:b ex:v "not-a-date"^^xsd:date . + ex:c ex:v 5 . + ex:d ex:v "5"^^xsd:int . + ex:e ex:v "9z9"^^xsd:long . + """; + + private static final String PREFIX = + "PREFIX ex: PREFIX xsd: "; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("malformed.ttl").toFile(); + File h5 = dir.resolve("malformed.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + // Pre-fix this aborted with an IOException wrapping DatatypeFormatException. + HDF5Writer.Builder() + .setSource(ttl).setDestination(h5) + .setSpatial(false).setFeatures(false) + .build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static Set subjects(String objectTerm) { + Set uris = new HashSet<>(); + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + "SELECT ?s WHERE { ?s ex:v " + objectTerm + " }")).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + RDFNode n = rs.next().get("s"); + if (n != null && n.isURIResource()) uris.add(n.asResource().getURI()); + } + } + return uris; + } + + private static Literal value(String subject) { + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create(PREFIX + "SELECT ?v WHERE { " + subject + " ex:v ?v }")).build()) { + return qe.execSelect().next().getLiteral("v"); + } + } + + @Test + void illTypedLiteralsRoundTripTermExact() { + Literal a = value("ex:a"); + assertEquals("abc", a.getLexicalForm()); + assertEquals(XSD.xint.getURI(), a.getDatatypeURI()); + + Literal b = value("ex:b"); + assertEquals("not-a-date", b.getLexicalForm()); + assertEquals(XSD.date.getURI(), b.getDatatypeURI()); + + Literal e = value("ex:e"); + assertEquals("9z9", e.getLexicalForm()); + assertEquals(XSD.xlong.getURI(), e.getDatatypeURI()); + } + + @Test + void illTypedLiteralsAreFindableByTerm() { + assertEquals(Set.of("http://ex.org/a"), subjects("\"abc\"^^xsd:int")); + assertEquals(Set.of("http://ex.org/b"), subjects("\"not-a-date\"^^xsd:date")); + } + + @Test + void wellFormedNeighborsAreUnaffected() { + assertEquals(Set.of("http://ex.org/c"), subjects("5")); + assertEquals(Set.of("http://ex.org/d"), subjects("\"5\"^^xsd:int")); + Literal d = value("ex:d"); + assertEquals("5", d.getLexicalForm()); + assertEquals(XSD.xint.getURI(), d.getDatatypeURI()); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/NonExistentBindingTest.java b/src/test/java/com/ebremer/beakgraph/NonExistentBindingTest.java index 203f4f35..8e44091b 100644 --- a/src/test/java/com/ebremer/beakgraph/NonExistentBindingTest.java +++ b/src/test/java/com/ebremer/beakgraph/NonExistentBindingTest.java @@ -38,6 +38,7 @@ class NonExistentBindingTest { @TempDir static Path dir; + static BeakGraph bg; static Dataset ds; @BeforeAll @@ -46,7 +47,14 @@ static void build() throws Exception { File h5 = dir.resolve("ne.ttl.h5").toFile(); Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); HDF5Writer.Builder().setSource(ttl).setDestination(h5).setSpatial(false).setFeatures(false).build().write(); - ds = new BeakGraph(new HDF5Reader(h5)).getDataset(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @org.junit.jupiter.api.AfterAll + static void closeReader() { + // Release the mapped file: a leaked reader makes @TempDir cleanup flaky on Windows. + if (bg != null) bg.close(); } private static int count(String body) { diff --git a/src/test/java/com/ebremer/beakgraph/PolygonScalerGridCellTest.java b/src/test/java/com/ebremer/beakgraph/PolygonScalerGridCellTest.java new file mode 100644 index 00000000..f47a09a1 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/PolygonScalerGridCellTest.java @@ -0,0 +1,46 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.ebremer.halcyon.hilbert.GridCell; +import com.ebremer.halcyon.hilbert.PolygonScaler; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Test; +import org.locationtech.jts.geom.Envelope; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Polygon; + +/** + * PolygonScaler.getGridCells must agree with the tile grid the writer + * persists: every scale level's tiles are GRIDTILESIZE units on a side in that + * level's own (already divided) coordinates - generateGridURNs stamps the + * stored per-tile graph URNs with exactly that formula. The old code + * multiplied the tile size by 2^scale ON TOP of the already-scaled polygon, so + * for scale >= 1 every computed cell disagreed with every stored tile. + */ +class PolygonScalerGridCellTest { + + @Test + void gridCellsMatchThePersistedTileGrid() { + GeometryFactory gf = new GeometryFactory(); + // Coordinates are scale-1 coordinates (base 2048..2060 halved). + Polygon atScale1 = (Polygon) gf.toGeometry(new Envelope(1024, 1030, 0, 10)); + List cells = PolygonScaler.getGridCells(new ArrayList<>(), atScale1, (short) 1); + assertEquals(1, cells.size()); + assertEquals(1, cells.get(0).scale); + assertEquals(2, cells.get(0).x, "x = floor(1024 / 512), the writer's tile column"); + assertEquals(0, cells.get(0).y); + } + + @Test + void scaleZeroCellsAreUnchanged() { + GeometryFactory gf = new GeometryFactory(); + Polygon atScale0 = (Polygon) gf.toGeometry(new Envelope(600, 610, 0, 10)); + List cells = PolygonScaler.getGridCells(new ArrayList<>(), atScale0, (short) 0); + assertEquals(1, cells.size()); + assertEquals(0, cells.get(0).scale); + assertEquals(1, cells.get(0).x, "x = floor(600 / 512)"); + assertEquals(0, cells.get(0).y); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/QuadFormatIngestionTest.java b/src/test/java/com/ebremer/beakgraph/QuadFormatIngestionTest.java new file mode 100644 index 00000000..8c93f58d --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/QuadFormatIngestionTest.java @@ -0,0 +1,106 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Regression tests for source-syntax handling: the parser language must be + * detected from the file name instead of being hardcoded to Turtle - BeakGraph + * is a quad store, and named graphs can only arrive through a quad-capable + * syntax (TriG, N-Quads). + */ +class QuadFormatIngestionTest { + + @TempDir + static Path dir; + + private static int count(Dataset ds, String query) { + try (QueryExecution qe = QueryExecution.dataset(ds) + .query(QueryFactory.create("PREFIX ex: " + query)).build()) { + ResultSet rs = qe.execSelect(); + int n = 0; + while (rs.hasNext()) { rs.next(); n++; } + return n; + } + } + + @Test + void trigSourceWithNamedGraphRoundTrips() throws Exception { + String trig = """ + @prefix ex: . + ex:s0 ex:p ex:o0 . + ex:g1 { + ex:s1 ex:p ex:o1 . + ex:s2 ex:p ex:o2 . + } + """; + File src = dir.resolve("data.trig").toFile(); + File h5 = dir.resolve("data.trig.h5").toFile(); + Files.write(src.toPath(), trig.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(src).setDestination(h5) + .setSpatial(false).setFeatures(false).build().write(); + try (BeakGraph bg = new BeakGraph(new HDF5Reader(h5))) { + Dataset ds = bg.getDataset(); + assertEquals(2, count(ds, "SELECT * WHERE { GRAPH ex:g1 { ?s ?p ?o } }"), + "the TriG named graph must be stored and queryable"); + assertEquals(1, count(ds, "SELECT * WHERE { ?s ex:p ex:o0 }"), + "the TriG default graph must be stored"); + assertTrue(ds.asDatasetGraph().containsGraph( + org.apache.jena.graph.NodeFactory.createURI("http://ex.org/g1"))); + } + } + + @Test + void nquadsSourceRoundTrips() throws Exception { + String nq = """ + . + . + """; + File src = dir.resolve("data.nq").toFile(); + File h5 = dir.resolve("data.nq.h5").toFile(); + Files.write(src.toPath(), nq.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(src).setDestination(h5) + .setSpatial(false).setFeatures(false).build().write(); + try (BeakGraph bg = new BeakGraph(new HDF5Reader(h5))) { + Dataset ds = bg.getDataset(); + assertEquals(1, count(ds, "SELECT * WHERE { GRAPH { ?s ?p ?o } }")); + assertEquals(1, count(ds, "SELECT * WHERE { ?s ex:p }")); + } + } + + @Test + void emptySourceProducesConsistentFile() throws Exception { + File src = dir.resolve("empty.ttl").toFile(); + File h5 = dir.resolve("empty.ttl.h5").toFile(); + Files.write(src.toPath(), "# nothing here\n".getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(src).setDestination(h5) + .setSpatial(false).setFeatures(false).build().write(); + try (BeakGraph bg = new BeakGraph(new HDF5Reader(h5))) { + Dataset ds = bg.getDataset(); + // The VoID metadata graph is always written; the columnar graph list + // must therefore exist too, or enumeration/union/contains disagree + // with direct GRAPH queries on the same file. + int direct = count(ds, "SELECT * WHERE { GRAPH <" + Params.VOIDSTRING + "> { ?s ?p ?o } }"); + assertTrue(direct > 0, "VoID metadata must be present"); + assertEquals(Boolean.TRUE, + ds.asDatasetGraph().containsGraph(org.apache.jena.graph.NodeFactory.createURI(Params.VOIDSTRING)), + "containsGraph must agree with the stored VoID graph"); + assertEquals(direct, count(ds, "SELECT * WHERE { GRAPH ?g { ?s ?p ?o } }"), + "graph enumeration must see the same rows as the direct query"); + } + } +} diff --git a/src/test/java/com/ebremer/beakgraph/SpatialConcreteSubjectTest.java b/src/test/java/com/ebremer/beakgraph/SpatialConcreteSubjectTest.java new file mode 100644 index 00000000..0bc38da1 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/SpatialConcreteSubjectTest.java @@ -0,0 +1,133 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * geof:sfIntersects with a CONCRETE feature subject. The spatial index stores + * geometry SUBJECT ids, so with nothing to seed (no variable subject in the + * geometry triple) the accelerator must step aside and leave the answer to the + * pattern solve + sfIntersects verification. The old code seeded the geometry + * OBJECT variable with subject ids instead: every candidate row failed the + * triple pattern and any pinned-subject spatial query silently returned zero + * rows (ASK said false for a geometry that genuinely intersects). + */ +class SpatialConcreteSubjectTest { + + private static final String REGION = "POLYGON((100 100,300 100,300 300,100 300,100 100))"; + + private static final String TTL = """ + @prefix ex: . + @prefix geo: . + # entirely inside the region + ex:small geo:asWKT "POLYGON((150 150,160 150,160 160,150 160,150 150))"^^geo:wktLiteral . + # far away - disjoint from the region + ex:far geo:asWKT "POLYGON((5000 5000,5100 5000,5100 5100,5000 5100,5000 5000))"^^geo:wktLiteral . + """; + + private static final String PREFIXES = """ + PREFIX ex: + PREFIX geo: + PREFIX geof: + """; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("concrete.ttl").toFile(); + File h5 = dir.resolve("concrete.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(ttl).setDestination(h5) + .setSpatial(true).setFeatures(false).build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static List select(String query, String var) { + List out = new ArrayList<>(); + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create(PREFIXES + query)).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + org.apache.jena.rdf.model.RDFNode n = rs.next().get(var); + out.add(n.isLiteral() ? n.asLiteral().getLexicalForm() : n.toString()); + } + } + return out; + } + + private static boolean ask(String query) { + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create(PREFIXES + query)).build()) { + return qe.execAsk(); + } + } + + @Test + void concreteSubjectIntersectingReturnsItsGeometry() { + List rows = select( + "SELECT ?w WHERE { ex:small geo:asWKT ?w FILTER(geof:sfIntersects(?w, \"" + + REGION + "\"^^geo:wktLiteral)) }", "w"); + assertEquals(1, rows.size(), "pinned-subject spatial query must return its intersecting geometry"); + assertTrue(rows.get(0).startsWith("POLYGON((150 150"), "the bound WKT must be ex:small's geometry"); + } + + @Test + void concreteSubjectAskIsTrue() { + assertTrue(ask("ASK { ex:small geo:asWKT ?w FILTER(geof:sfIntersects(?w, \"" + + REGION + "\"^^geo:wktLiteral)) }")); + } + + @Test + void concreteSubjectDisjointReturnsNothing() { + assertEquals(List.of(), select( + "SELECT ?w WHERE { ex:far geo:asWKT ?w FILTER(geof:sfIntersects(?w, \"" + + REGION + "\"^^geo:wktLiteral)) }", "w")); + assertFalse(ask("ASK { ex:far geo:asWKT ?w FILTER(geof:sfIntersects(?w, \"" + + REGION + "\"^^geo:wktLiteral)) }")); + } + + @Test + void preBoundSubjectFromValuesStillMatches() { + // The subject var is seeded with index candidates while the incoming + // binding already pins it - putCompatible must keep the compatible row. + List rows = select( + "SELECT ?w WHERE { VALUES ?f { ex:small } ?f geo:asWKT ?w FILTER(geof:sfIntersects(?w, \"" + + REGION + "\"^^geo:wktLiteral)) }", "w"); + assertEquals(1, rows.size()); + } + + @Test + void variableSubjectControlStillWorks() { + List rows = select( + "SELECT ?f WHERE { ?f geo:asWKT ?w FILTER(geof:sfIntersects(?w, \"" + + REGION + "\"^^geo:wktLiteral)) }", "f"); + assertEquals(List.of("http://ex.org/small"), rows); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/SpatialFidelityTest.java b/src/test/java/com/ebremer/beakgraph/SpatialFidelityTest.java new file mode 100644 index 00000000..43c8b40c --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/SpatialFidelityTest.java @@ -0,0 +1,114 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Regression tests for spatial write fidelity: + *
      + *
    • polygon holes (donut annotations - lumens in pathology) must survive + * into the scaled WKT pyramid instead of being dropped;
    • + *
    • every part of a MULTIPOLYGON must be indexed, not just the first;
    • + *
    • POINT geometries must be indexed (via their envelope) instead of being + * silently skipped.
    • + *
    + */ +class SpatialFidelityTest { + + private static final String TTL = """ + @prefix ex: . + @prefix geo: . + ex:donut geo:asWKT "POLYGON((0 0,64 0,64 64,0 64,0 0),(16 16,48 16,48 48,16 48,16 16))"^^geo:wktLiteral . + ex:multi geo:asWKT "MULTIPOLYGON(((0 0,32 0,32 32,0 32,0 0)),((1000 1000,1032 1000,1032 1032,1000 1032,1000 1000)))"^^geo:wktLiteral . + ex:pt geo:asWKT "POINT(500 500)"^^geo:wktLiteral . + """; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("fidelity.ttl").toFile(); + File h5 = dir.resolve("fidelity.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(ttl).setDestination(h5) + .setSpatial(true).setFeatures(false).build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static int count(String where) { + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create( + "PREFIX ex: PREFIX hal: SELECT * WHERE { " + where + " }")).build()) { + ResultSet rs = qe.execSelect(); + int n = 0; + while (rs.hasNext()) { rs.next(); n++; } + return n; + } + } + + private static String levelZeroWkt(String subject) { + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create( + "PREFIX ex: PREFIX hal: " + + "SELECT ?w WHERE { GRAPH <" + Params.SPATIALSTRING + "> { " + subject + " hal:asWKT0 ?w } }")).build()) { + ResultSet rs = qe.execSelect(); + assertTrue(rs.hasNext(), "expected a level-0 scaled WKT for " + subject); + return rs.next().getLiteral("w").getLexicalForm(); + } + } + + @Test + void polygonHolesSurviveScaling() { + String wkt0 = levelZeroWkt("ex:donut"); + // A polygon with an interior ring serializes with two coordinate lists. + assertTrue(wkt0.indexOf('(') != wkt0.lastIndexOf('('), + "level-0 WKT must be a polygon"); + assertTrue(wkt0.contains("), ("), + "the donut's interior ring must survive into the scaled WKT, got: " + wkt0); + } + + @Test + void allMultiPolygonPartsAreIndexed() { + // A query region overlapping ONLY the second part must still find the + // geometry - first-part-only indexing left the other parts unfindable. + String q = "PREFIX ex: " + + "PREFIX geo: " + + "PREFIX geof: " + + "SELECT ?f WHERE { ?f geo:asWKT ?w FILTER(geof:sfIntersects(?w, " + + "\"POLYGON((1010 1010,1020 1010,1020 1020,1010 1020,1010 1010))\"^^geo:wktLiteral)) }"; + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create(q)).build()) { + ResultSet rs = qe.execSelect(); + assertTrue(rs.hasNext(), "the second MULTIPOLYGON part must be findable"); + assertEquals("http://ex.org/multi", rs.next().get("f").asResource().getURI()); + } + } + + @Test + void pointGeometriesAreIndexed() { + assertTrue(count("GRAPH <" + Params.SPATIALSTRING + "> { ex:pt ?p ?o }") > 0, + "a POINT must be indexed via its envelope, not silently skipped"); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/SpatialGeometryCollectionTest.java b/src/test/java/com/ebremer/beakgraph/SpatialGeometryCollectionTest.java new file mode 100644 index 00000000..420d1a71 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/SpatialGeometryCollectionTest.java @@ -0,0 +1,94 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * EVERY member of a mixed GEOMETRYCOLLECTION must be spatially indexed. The + * envelope fallback for non-polygonal geometry used to fire only when NO + * polygonal part existed, so a point member sitting next to a polygon member + * was silently unindexed - invisible to every sfIntersects query. + */ +class SpatialGeometryCollectionTest { + + private static final String TTL = """ + @prefix ex: . + @prefix geo: . + ex:mixed geo:asWKT "GEOMETRYCOLLECTION(POLYGON((0 0,10 0,10 10,0 10,0 0)), POINT(500 500))"^^geo:wktLiteral . + """; + + private static final String PREFIXES = """ + PREFIX ex: + PREFIX geo: + PREFIX geof: + """; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("mixed.ttl").toFile(); + File h5 = dir.resolve("mixed.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(ttl).setDestination(h5) + .setSpatial(true).setFeatures(false).build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static Set intersecting(String regionWkt) { + Set hits = new HashSet<>(); + String q = PREFIXES + + "SELECT ?f WHERE { ?f geo:asWKT ?w FILTER(geof:sfIntersects(?w, \"" + regionWkt + "\"^^geo:wktLiteral)) }"; + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create(q)).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + hits.add(rs.next().getResource("f").getURI()); + } + } + return hits; + } + + @Test + void pointMemberNextToAPolygonMemberIsFindable() { + assertEquals(Set.of("http://ex.org/mixed"), + intersecting("POLYGON((495 495,505 495,505 505,495 505,495 495))")); + } + + @Test + void polygonMemberIsStillFindable() { + assertEquals(Set.of("http://ex.org/mixed"), + intersecting("POLYGON((2 2,8 2,8 8,2 8,2 2))")); + } + + @Test + void regionTouchingNeitherMemberMatchesNothing() { + assertEquals(Set.of(), + intersecting("POLYGON((100 100,200 100,200 200,100 200,100 100))")); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/SpatialHugeCoordinateTest.java b/src/test/java/com/ebremer/beakgraph/SpatialHugeCoordinateTest.java new file mode 100644 index 00000000..bb159448 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/SpatialHugeCoordinateTest.java @@ -0,0 +1,103 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Locale; +import java.util.Set; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Coordinates at or beyond 2^31 exceed the 31-bit Hilbert curve's domain. The + * davidmoten curve silently MASKS such coordinates onto unrelated cells, so + * the written cover and the queried cover aliased differently and genuine + * intersections were silently lost. Both sides now clamp into the domain with + * the same monotone projection: out-of-domain geometry indexes coarsely at + * the domain-edge cells (recall-safe) and JTS verification does the rest. + */ +class SpatialHugeCoordinateTest { + + private static final long BASE = 1L << 31; + + private static final String PREFIXES = """ + PREFIX ex: + PREFIX geo: + PREFIX geof: + """; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + private static String square(long minX, long minY, long size) { + long maxX = minX + size, maxY = minY + size; + return String.format(Locale.ROOT, "POLYGON((%d %d,%d %d,%d %d,%d %d,%d %d))", + minX, minY, maxX, minY, maxX, maxY, minX, maxY, minX, minY); + } + + @BeforeAll + static void buildAndOpen() throws Exception { + String ttl = "@prefix ex: .\n" + + "@prefix geo: .\n" + + "ex:huge geo:asWKT \"" + square(BASE + 100, BASE + 100, 100) + "\"^^geo:wktLiteral .\n" + + "ex:small geo:asWKT \"" + square(500, 500, 60) + "\"^^geo:wktLiteral .\n"; + File src = dir.resolve("huge.ttl").toFile(); + File h5 = dir.resolve("huge.ttl.h5").toFile(); + Files.write(src.toPath(), ttl.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(src).setDestination(h5) + .setSpatial(true).setFeatures(false).build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static Set intersecting(String regionWkt) { + Set hits = new HashSet<>(); + String q = PREFIXES + + "SELECT ?f WHERE { ?f geo:asWKT ?w FILTER(geof:sfIntersects(?w, \"" + regionWkt + "\"^^geo:wktLiteral)) }"; + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create(q)).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + hits.add(rs.next().getResource("f").getURI()); + } + } + return hits; + } + + @Test + void beyondDomainGeometryIsFoundByOverlappingRegion() { + assertEquals(Set.of("http://ex.org/huge"), + intersecting(square(BASE + 50, BASE + 50, 100))); + } + + @Test + void beyondDomainRegionWithNoOverlapMatchesNothing() { + // Both clamp onto the domain-edge cells (candidates!), so the JTS + // verification must reject the non-overlapping pair. + assertEquals(Set.of(), intersecting(square(BASE + 10_000, BASE + 10_000, 100))); + } + + @Test + void inDomainQueriesAreUnaffected() { + assertEquals(Set.of("http://ex.org/small"), intersecting(square(480, 480, 60))); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/SpatialNegativeCoordinateTest.java b/src/test/java/com/ebremer/beakgraph/SpatialNegativeCoordinateTest.java new file mode 100644 index 00000000..a7e5b093 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/SpatialNegativeCoordinateTest.java @@ -0,0 +1,119 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Spatial correctness for geometry and query regions in NEGATIVE coordinate + * space (real GeoSPARQL lon/lat data lives there). The Hilbert domain is + * non-negative, so both sides clamp their bboxes into it with the same + * monotone projection - overlap survives the clamp and the exact JTS + * verification removes the clamp's false positives. Before the fix, + * fully-negative geometry was skipped at build (unfindable by any query) and + * negative query regions bailed out to zero candidates: genuine intersections + * were silent false negatives. + */ +class SpatialNegativeCoordinateTest { + + private static final String TTL = """ + @prefix ex: . + @prefix geo: . + # entirely in negative space + ex:neg geo:asWKT "POLYGON((-100 -100,-50 -100,-50 -50,-100 -50,-100 -100))"^^geo:wktLiteral . + # straddles the origin + ex:strad geo:asWKT "POLYGON((-10 -10,10 -10,10 10,-10 10,-10 -10))"^^geo:wktLiteral . + # entirely positive, far from the origin + ex:pos geo:asWKT "POLYGON((500 500,560 500,560 560,500 560,500 500))"^^geo:wktLiteral . + """; + + private static final String PREFIXES = """ + PREFIX ex: + PREFIX geo: + PREFIX geof: + """; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("negspace.ttl").toFile(); + File h5 = dir.resolve("negspace.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(ttl).setDestination(h5) + .setSpatial(true).setFeatures(false).build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static Set intersecting(String regionWkt) { + Set hits = new HashSet<>(); + String q = PREFIXES + + "SELECT ?f WHERE { ?f geo:asWKT ?w FILTER(geof:sfIntersects(?w, \"" + regionWkt + "\"^^geo:wktLiteral)) }"; + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create(q)).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + hits.add(rs.next().getResource("f").getURI()); + } + } + return hits; + } + + @Test + void negativeRegionFindsFullyNegativeGeometry() { + assertEquals(Set.of("http://ex.org/neg"), + intersecting("POLYGON((-90 -90,-60 -90,-60 -60,-90 -60,-90 -90))")); + } + + @Test + void negativeRegionFindsStraddlingGeometry() { + assertEquals(Set.of("http://ex.org/strad"), + intersecting("POLYGON((-8 -8,-2 -8,-2 -2,-8 -2,-8 -8))")); + } + + @Test + void straddlingRegionFindsBothNegativeAndStraddlingGeometry() { + assertEquals(Set.of("http://ex.org/neg", "http://ex.org/strad"), + intersecting("POLYGON((-60 -60,5 -60,5 5,-60 5,-60 -60))")); + } + + @Test + void positiveRegionIsUnaffectedByOriginClustering() { + // The clamped negative geometries cluster at the axis cells; a positive + // region far away must still return only its true intersections. + assertEquals(Set.of("http://ex.org/pos"), + intersecting("POLYGON((520 520,540 520,540 540,520 540,520 520))")); + } + + @Test + void disjointNegativeRegionMatchesNothing() { + // Clamping makes every negative-space geometry a CANDIDATE here; the + // JTS verification stage must reject them all. + assertEquals(Set.of(), + intersecting("POLYGON((-2000 -2000,-1900 -2000,-1900 -1900,-2000 -1900,-2000 -2000))")); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/SpatialQueryCorrectnessTest.java b/src/test/java/com/ebremer/beakgraph/SpatialQueryCorrectnessTest.java new file mode 100644 index 00000000..b23d84f4 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/SpatialQueryCorrectnessTest.java @@ -0,0 +1,136 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.apache.jena.rdf.model.RDFNode; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * End-to-end correctness tests for the spatial index + geof:sfIntersects. + * The index must be a recall-safe PRE-FILTER (bbox cell-cover overlap - never a + * false negative) and the JTS-backed sfIntersects filter must stay in the plan + * as the verification stage (killing the index's false positives). The old + * corner-only design failed both ways: a geometry containing or straddling the + * query region never matched, candidates were never re-verified, and one match + * could appear up to four times. + */ +class SpatialQueryCorrectnessTest { + + // Query region: the square [100,300] x [100,300]. + private static final String REGION = "POLYGON((100 100,300 100,300 300,100 300,100 100))"; + + private static final String TTL = """ + @prefix ex: . + @prefix geo: . + # entirely inside the region + ex:small geo:asWKT "POLYGON((150 150,160 150,160 160,150 160,150 150))"^^geo:wktLiteral . + # CONTAINS the whole region - the classic corner-index false negative + ex:big geo:asWKT "POLYGON((0 0,1000 0,1000 1000,0 1000,0 0))"^^geo:wktLiteral . + # straddles the region's left edge - corners outside, overlap real + ex:strad geo:asWKT "POLYGON((50 120,150 120,150 200,50 200,50 120))"^^geo:wktLiteral . + # far away - bbox disjoint, excluded by the index + ex:far geo:asWKT "POLYGON((5000 5000,5100 5000,5100 5100,5000 5100,5000 5000))"^^geo:wktLiteral . + # bbox overlaps the region corner but the triangle itself does not + # (x + y >= 620 everywhere; the region maxes out at 600) - an index + # candidate that the JTS verification stage must reject + ex:trap geo:asWKT "POLYGON((260 360,360 260,370 370,260 360))"^^geo:wktLiteral . + # residual-filter sanity data + ex:n1 ex:name "axb" . + ex:n2 ex:name "ab" . + """; + + private static final String PREFIXES = """ + PREFIX ex: + PREFIX geo: + PREFIX geof: + """; + + @TempDir + static Path dir; + static BeakGraph bg; + static Dataset ds; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("spatialq.ttl").toFile(); + File h5 = dir.resolve("spatialq.ttl.h5").toFile(); + Files.write(ttl.toPath(), TTL.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(ttl).setDestination(h5) + .setSpatial(true).setFeatures(false).build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + ds = bg.getDataset(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + private static List intersecting(String regionWkt) { + List hits = new ArrayList<>(); + String q = PREFIXES + + "SELECT ?f WHERE { ?f geo:asWKT ?w FILTER(geof:sfIntersects(?w, \"" + regionWkt + "\"^^geo:wktLiteral)) }"; + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create(q)).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + RDFNode n = rs.next().get("f"); + if (n != null && n.isURIResource()) hits.add(n.asResource().getURI()); + } + } + return hits; + } + + @Test + void intersectionMatchesGeometryNotCorners() { + List hits = intersecting(REGION); + Set distinct = new HashSet<>(hits); + assertEquals(Set.of("http://ex.org/small", "http://ex.org/big", "http://ex.org/strad"), distinct, + "containing and straddling geometries must match; disjoint and bbox-only-overlap must not"); + assertEquals(distinct.size(), hits.size(), + "each matching geometry must appear exactly once (no per-corner/per-range duplicates)"); + } + + @Test + void containingGeometryAloneIsFound() { + // A region buried deep inside only ex:big - zero stored corners or cells + // of ex:big lie anywhere near it; only a recall-safe cover finds it. + assertEquals(List.of("http://ex.org/big"), + intersecting("POLYGON((600 600,610 600,610 610,600 610,600 600))")); + } + + @Test + void disjointRegionMatchesNothing() { + assertEquals(List.of(), intersecting("POLYGON((8000 8000,8100 8000,8100 8100,8000 8100,8000 8000))")); + } + + @Test + void residualFiltersStillApplyToOrdinaryPatterns() { + // Sanity guard for the same plan machinery the verify stage rides on: + // a non-pushdownable FILTER (regex) must still be evaluated. + String q = "PREFIX ex: SELECT ?s WHERE { ?s ex:name ?n FILTER(regex(?n, \"x\")) }"; + List hits = new ArrayList<>(); + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create(q)).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) hits.add(rs.next().getResource("s").getURI()); + } + assertEquals(List.of("http://ex.org/n1"), hits); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/TemporalTotalOrderTest.java b/src/test/java/com/ebremer/beakgraph/TemporalTotalOrderTest.java new file mode 100644 index 00000000..7e3933eb --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/TemporalTotalOrderTest.java @@ -0,0 +1,212 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.core.lib.NodeComparator; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.apache.jena.datatypes.xsd.XSDDatatype; +import org.apache.jena.graph.Node; +import org.apache.jena.graph.NodeFactory; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.ResultSet; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * NodeComparator must be a strict total order - every sort and binary search in + * the store depends on it. NodeValue.compareAlways alone is NOT one: for + * XSD-indeterminate pairs (a timezone-less dateTime vs a timezoned one within + * +/-14h, a month-based duration vs a day-based one) it falls back to term + * order pairwise, which mixes two different orders and creates comparison + * cycles. Before the fix, a file with ordinary mixed local/UTC timestamps + * failed to build ("Cannot resolve Object (not in dictionary)") or, worse, + * built and then silently dropped rows on lookup. + */ +class TemporalTotalOrderTest { + + private static final NodeComparator CMP = NodeComparator.INSTANCE; + + private static Node dt(String lex) { return NodeFactory.createLiteralDT(lex, XSDDatatype.XSDdateTime); } + private static Node dur(String lex) { return NodeFactory.createLiteralDT(lex, XSDDatatype.XSDduration); } + + /** The reproduced 3-cycle: naive < +14:00 < Z < naive under the old comparator. */ + @Test + void reportedDateTimeCycleIsGone() { + assertTotallyOrdered(List.of( + dt("2020-01-02T00:00:00"), + dt("2020-01-02T08:00:00+14:00"), + dt("2020-01-01T20:00:00Z"))); + } + + @Test + void durationCycleIsGone() { + // P1Y < P13M by value, but P13M and P15D (and P15D and P1Y) were + // month-vs-day indeterminate and fell back to term order: a cycle. + assertTotallyOrdered(List.of(dur("P1Y"), dur("P13M"), dur("P15D"))); + } + + @Test + void comparatorIsTotalOverMixedLiteralSpaces() { + List nodes = new ArrayList<>(); + // dateTimes: naive, UTC, and offsets all within each other's +/-14h windows + for (int i = 0; i < 8; i++) { + nodes.add(dt(String.format("2020-01-0%dT0%d:00:00", 1 + i % 3, i))); + nodes.add(dt(String.format("2020-01-0%dT0%d:30:00Z", 1 + i % 3, i))); + nodes.add(dt(String.format("2020-01-0%dT0%d:15:00+0%d:00", 1 + i % 3, i, 1 + i % 9))); + nodes.add(dt(String.format("2020-01-0%dT0%d:45:00-0%d:30", 1 + i % 3, i, 1 + i % 9))); + } + // instant-equal, term-distinct dateTimes must order deterministically + nodes.add(dt("2020-06-01T12:00:00Z")); + nodes.add(dt("2020-06-01T12:00:00+00:00")); + nodes.add(dt("2020-06-01T14:00:00+02:00")); + // times and dates with and without timezones + for (int i = 0; i < 4; i++) { + nodes.add(NodeFactory.createLiteralDT(String.format("0%d:00:00", 2 * i), XSDDatatype.XSDtime)); + nodes.add(NodeFactory.createLiteralDT(String.format("0%d:00:00+1%d:00", 2 * i, i), XSDDatatype.XSDtime)); + nodes.add(NodeFactory.createLiteralDT(String.format("2020-01-1%d", i), XSDDatatype.XSDdate)); + nodes.add(NodeFactory.createLiteralDT(String.format("2020-01-1%d+14:00", i), XSDDatatype.XSDdate)); + nodes.add(NodeFactory.createLiteralDT(String.format("201%d", i), XSDDatatype.XSDgYear)); + nodes.add(NodeFactory.createLiteralDT(String.format("201%dZ", i), XSDDatatype.XSDgYear)); + } + // durations: month-based, day/time-based, mixed, value-equal pair (P1D/PT24H) + for (String d : new String[]{"P1Y", "P13M", "P15D", "P1M", "P100D", "P2M", "P30D", + "P1M10D", "PT24H", "P1D", "PT36H", "P400D", "P1Y1D", "-P1M", "-P20D"}) { + nodes.add(dur(d)); + } + // neighbors from other value spaces (space-ranked by compareAlways) + nodes.add(NodeFactory.createLiteralDT("2020-01-02T04:00:00", XSDDatatype.XSDstring)); + nodes.add(NodeFactory.createLiteralDT("zzz", XSDDatatype.XSDstring)); + nodes.add(NodeFactory.createLiteralDT("42", XSDDatatype.XSDinteger)); + nodes.add(NodeFactory.createLiteralDT("41.5", XSDDatatype.XSDdouble)); + nodes.add(NodeFactory.createLiteralDT("not-a-date", XSDDatatype.XSDdateTime)); // ill-formed + nodes.add(NodeFactory.createLiteral("plain")); + + assertTotallyOrdered(nodes); + + // The property that actually broke: sort, then find EVERY element again. + Node[] sorted = nodes.toArray(Node[]::new); + Arrays.sort(sorted, CMP); + for (Node n : nodes) { + assertTrue(Arrays.binarySearch(sorted, n, CMP) >= 0, + "binary search must find every sorted element, missed: " + n); + } + } + + private static void assertTotallyOrdered(List nodes) { + int n = nodes.size(); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + int ij = Integer.signum(CMP.compare(nodes.get(i), nodes.get(j))); + int ji = Integer.signum(CMP.compare(nodes.get(j), nodes.get(i))); + assertEquals(-ji, ij, "antisymmetry violated for " + nodes.get(i) + " / " + nodes.get(j)); + if (i == j) continue; + for (int k = 0; k < n; k++) { + int jk = Integer.signum(CMP.compare(nodes.get(j), nodes.get(k))); + int ik = Integer.signum(CMP.compare(nodes.get(i), nodes.get(k))); + if (ij < 0 && jk < 0) { + assertTrue(ik < 0, "transitivity violated: " + nodes.get(i) + " < " + + nodes.get(j) + " < " + nodes.get(k) + " but not i < k"); + } + } + } + } + } + + @TempDir + Path dir; + + /** + * End-to-end: the exact failure mode - hundreds of mixed timezone-less and + * timezoned dateTimes in one file. Under the cyclic comparator this build + * threw "Cannot resolve Object (not in dictionary)" at index construction. + */ + @Test + void mixedTimezoneDateTimesRoundTrip() throws Exception { + int count = 300; + StringBuilder ttl = new StringBuilder("@prefix ex: .\n" + + "@prefix xsd: .\n"); + for (int i = 0; i < count; i++) { + int day = 1 + (i / 24) % 27; + int hour = i % 24; + int minute = (i * 7) % 60; + String lex = String.format("2020-01-%02dT%02d:%02d:00", day, hour, minute); + String form = switch (i % 3) { + case 0 -> lex; + case 1 -> lex + "Z"; + default -> lex + String.format("%s%02d:00", (i % 2 == 0 ? "+" : "-"), 1 + i % 13); + }; + ttl.append(String.format("ex:s%d ex:when \"%s\"^^xsd:dateTime .%n", i, form)); + } + + File src = dir.resolve("mixedtz.ttl").toFile(); + File h5 = dir.resolve("mixedtz.ttl.h5").toFile(); + Files.write(src.toPath(), ttl.toString().getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(src).setDestination(h5) + .setSpatial(false).setFeatures(false).build().write(); + + try (BeakGraph bg = new BeakGraph(new HDF5Reader(h5))) { + Dataset ds = bg.getDataset(); + assertEquals(count, countRows(ds, + "PREFIX ex: SELECT ?s ?o WHERE { ?s ex:when ?o }"), + "every mixed-timezone dateTime row must round-trip"); + // concrete-literal lookups exercise the read-side binary search on both forms + assertEquals(1, countRows(ds, "PREFIX ex: " + + "PREFIX xsd: " + + "SELECT ?s WHERE { ?s ex:when \"2020-01-01T00:00:00\"^^xsd:dateTime }")); + assertEquals(1, countRows(ds, "PREFIX ex: " + + "PREFIX xsd: " + + "SELECT ?s WHERE { ?s ex:when \"2020-01-01T01:07:00Z\"^^xsd:dateTime }")); + } + } + + @Test + void mixedDurationsRoundTrip() throws Exception { + String[] durations = {"P1Y", "P13M", "P15D", "P1M", "P100D", "P2M", "P30D", "P28D", + "P1M10D", "PT24H", "P1D", "PT36H", "P400D", "P1Y1D", "P9M", "P276D", + "-P1M", "-P20D", "P3D", "P20D", "PT240H", "P10D", "P1M9D", "P38D"}; + StringBuilder ttl = new StringBuilder("@prefix ex: .\n" + + "@prefix xsd: .\n"); + for (int i = 0; i < durations.length; i++) { + ttl.append(String.format("ex:d%d ex:lasts \"%s\"^^xsd:duration .%n", i, durations[i])); + } + + File src = dir.resolve("durations.ttl").toFile(); + File h5 = dir.resolve("durations.ttl.h5").toFile(); + Files.write(src.toPath(), ttl.toString().getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(src).setDestination(h5) + .setSpatial(false).setFeatures(false).build().write(); + + try (BeakGraph bg = new BeakGraph(new HDF5Reader(h5))) { + Dataset ds = bg.getDataset(); + assertEquals(durations.length, countRows(ds, + "PREFIX ex: SELECT ?s ?o WHERE { ?s ex:lasts ?o }")); + assertEquals(1, countRows(ds, "PREFIX ex: " + + "PREFIX xsd: " + + "SELECT ?s WHERE { ?s ex:lasts \"P13M\"^^xsd:duration }")); + } + } + + private static int countRows(Dataset ds, String query) { + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create(query)).build()) { + ResultSet rs = qe.execSelect(); + int rows = 0; + while (rs.hasNext()) { + rs.next(); + rows++; + } + return rows; + } + } +} diff --git a/src/test/java/com/ebremer/beakgraph/TransactionStateTest.java b/src/test/java/com/ebremer/beakgraph/TransactionStateTest.java new file mode 100644 index 00000000..f50f03e7 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/TransactionStateTest.java @@ -0,0 +1,82 @@ +package com.ebremer.beakgraph; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.apache.jena.query.ReadWrite; +import org.apache.jena.sparql.core.DatasetGraph; +import org.apache.jena.system.Txn; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * isInTransaction() must report REAL per-thread state. The old implementation + * unconditionally answered true - a contract lie that masked mispaired + * begin/end in callers (a skipped begin, an end without begin, and a nested + * begin all passed silently). + */ +class TransactionStateTest { + + @TempDir + static Path dir; + static BeakGraph bg; + static DatasetGraph dsg; + + @BeforeAll + static void buildAndOpen() throws Exception { + File ttl = dir.resolve("txn.ttl").toFile(); + File h5 = dir.resolve("txn.ttl.h5").toFile(); + Files.write(ttl.toPath(), + " .\n".getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(ttl).setDestination(h5) + .setSpatial(false).setFeatures(false).build().write(); + bg = new BeakGraph(new HDF5Reader(h5)); + dsg = bg.getDataset().asDatasetGraph(); + } + + @AfterAll + static void closeReader() { + if (bg != null) bg.close(); + } + + @Test + void transactionStateFollowsTheLifecycle() { + assertFalse(dsg.isInTransaction(), "no transaction has begun"); + dsg.begin(ReadWrite.READ); + assertTrue(dsg.isInTransaction()); + assertEquals(ReadWrite.READ, dsg.transactionMode()); + dsg.end(); + assertFalse(dsg.isInTransaction(), "end() must leave the transaction"); + + dsg.begin(ReadWrite.READ); + dsg.commit(); + dsg.end(); + assertFalse(dsg.isInTransaction()); + } + + @Test + void txnExecuteReadWorks() { + long[] count = {0}; + Txn.executeRead(dsg, () -> + dsg.getDefaultGraph().find().forEachRemaining(t -> count[0]++)); + assertTrue(count[0] >= 1); + assertFalse(dsg.isInTransaction()); + } + + @Test + void writeTransactionsAreRejected() { + assertThrows(UnsupportedOperationException.class, () -> dsg.begin(ReadWrite.WRITE)); + assertFalse(dsg.isInTransaction(), "a rejected begin must not leave txn state behind"); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/VariableGraphScanTest.java b/src/test/java/com/ebremer/beakgraph/VariableGraphScanTest.java index 51a5931a..1162e1d4 100644 --- a/src/test/java/com/ebremer/beakgraph/VariableGraphScanTest.java +++ b/src/test/java/com/ebremer/beakgraph/VariableGraphScanTest.java @@ -78,4 +78,32 @@ void variableGraphScanBindsGraphAndCoversExactlyTheRealGraphs() throws Exception assertTrue(count >= 20, "should return at least the 20 default-graph triples; got " + count); } } + + @Test + void preBoundGraphVariableScansTheBoundGraph() throws Exception { + // The graph var is a VARIABLE in the quad but already bound in the + // BindingNodeId (BGIteratorMaster routes this shape to BGIteratorSPO_All + // when the predicate is unbound). SPO_All used to locate() the raw + // variable node, get -1, and silently yield nothing for a graph that + // exists - unlike the other three iterators behind the same dispatcher. + try (HDF5Reader reader = new HDF5Reader(h5)) { + PositionalDictionaryReader dict = (PositionalDictionaryReader) reader.getDictionary(); + NodeTable nt = reader.getNodeTable(); + Var g = Var.alloc("g"), s = Var.alloc("s"), p = Var.alloc("p"), o = Var.alloc("o"); + + long gid = dict.getGraphs().locate(Quad.defaultGraphIRI); + assertTrue(gid >= 1, "the default graph must exist in the dictionary"); + BindingNodeId bnid = new BindingNodeId(); + bnid.put(g, new NodeId(gid, com.ebremer.beakgraph.hdf5.jena.NodeType.GRAPH)); + + long count = 0; + Iterator it = new BGIteratorMaster( + reader, dict, bnid, new Quad(g, s, p, o), null, nt); + while (it.hasNext()) { + it.next(); + count++; + } + assertEquals(20, count, "the pre-bound default graph holds exactly the 20 source triples"); + } + } } diff --git a/src/test/java/com/ebremer/beakgraph/WriteErrorHandlingTest.java b/src/test/java/com/ebremer/beakgraph/WriteErrorHandlingTest.java index e1703fa9..1c96101d 100644 --- a/src/test/java/com/ebremer/beakgraph/WriteErrorHandlingTest.java +++ b/src/test/java/com/ebremer/beakgraph/WriteErrorHandlingTest.java @@ -1,7 +1,9 @@ package com.ebremer.beakgraph; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; import java.io.File; @@ -31,4 +33,29 @@ void malformedRdfAbortsTheWriteInsteadOfSwallowing() throws Exception { // And no .h5 should have been produced for the failed input. assertFalse(h5.exists(), "a failed write must not leave a partial .h5 behind"); } + + @Test + void failedRebuildPreservesThePreviousGoodArtifact() throws Exception { + File ttl = dir.resolve("data.ttl").toFile(); + File h5 = dir.resolve("data.ttl.h5").toFile(); + Files.write(ttl.toPath(), + " .\n".getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(ttl).setDestination(h5) + .setSpatial(false).setFeatures(false).build().write(); + byte[] good = Files.readAllBytes(h5.toPath()); + + // Rebuild over the same destination with a broken source: the failure + // happens before anything is written, and the old cleanup deleted the + // previous, fully valid artifact anyway. + Files.write(ttl.toPath(), "no longer valid turtle @@@".getBytes(StandardCharsets.UTF_8)); + assertThrows(Exception.class, () -> + HDF5Writer.Builder().setSource(ttl).setDestination(h5) + .setSpatial(false).setFeatures(false).build().write()); + + assertTrue(h5.exists(), "a failed rebuild must not destroy the previous artifact"); + assertArrayEquals(good, Files.readAllBytes(h5.toPath()), + "the previous artifact must be byte-identical after a failed rebuild"); + assertFalse(dir.resolve("data.ttl.h5.tmp").toFile().exists(), + "the temp file must be cleaned up after a failed build"); + } } diff --git a/src/test/java/com/ebremer/beakgraph/cmdline/BeakGraphCLIConversionTest.java b/src/test/java/com/ebremer/beakgraph/cmdline/BeakGraphCLIConversionTest.java new file mode 100644 index 00000000..2822a037 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/cmdline/BeakGraphCLIConversionTest.java @@ -0,0 +1,66 @@ +package com.ebremer.beakgraph.cmdline; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Conversion-run accounting. FileProcessor runs inside Futures that are never + * inspected, so before the fix any failure thrown outside its try block - + * including the NPE from a missing -dest - was swallowed by FutureTask: the + * run logged nothing, counted nothing, and reported every file as a + * successful conversion. + */ +class BeakGraphCLIConversionTest { + + @TempDir + Path dir; + + @Test + void failedConversionsAreCountedAndGoodFilesStillConvert() throws Exception { + Path src = Files.createDirectories(dir.resolve("src")); + Files.write(src.resolve("good.ttl"), + " .\n".getBytes(StandardCharsets.UTF_8)); + Files.write(src.resolve("bad.ttl"), + "this is not turtle @@@\n".getBytes(StandardCharsets.UTF_8)); + + Parameters p = new Parameters(); + p.src = src.toFile(); + p.dest = dir.resolve("out").toFile(); + + BeakGraphCLI cli = new BeakGraphCLI(p); + cli.traverse(); + + assertEquals(2, cli.getFileCounter().getRDFFileCount()); + assertEquals(1, cli.getFileCounter().getFailedConversionFileCount(), + "the unparseable source must be counted as a failed conversion"); + File goodH5 = dir.resolve("out").resolve("good.h5").toFile(); + assertTrue(goodH5.exists() && goodH5.length() > 0, + "the well-formed source must still convert"); + } + + @Test + void missingDestinationFailsEveryFileLoudlyInsteadOfSilently() throws Exception { + // main() refuses to start without -dest; if a processor is ever reached + // without one anyway, the failure must land in the counter, not vanish + // inside a discarded Future. + Path src = Files.createDirectories(dir.resolve("src2")); + Files.write(src.resolve("a.ttl"), + " .\n".getBytes(StandardCharsets.UTF_8)); + + Parameters p = new Parameters(); + p.src = src.toFile(); + p.dest = null; + + BeakGraphCLI cli = new BeakGraphCLI(p); + cli.traverse(); + + assertEquals(1, cli.getFileCounter().getFailedConversionFileCount()); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/cmdline/FileCounterTest.java b/src/test/java/com/ebremer/beakgraph/cmdline/FileCounterTest.java new file mode 100644 index 00000000..df92cc65 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/cmdline/FileCounterTest.java @@ -0,0 +1,31 @@ +package com.ebremer.beakgraph.cmdline; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +class FileCounterTest { + + @Test + void successfulConversionsAreRdfMinusFailedOnly() { + FileCounter fc = new FileCounter(); + // The traverse filter rejects zero-length files BEFORE they count as RDF + // files, so the summary must not subtract them a second time (the old + // formula printed rdf - zero - failed, which understated the count and + // went negative when empties outnumbered conversions). + for (int i = 0; i < 7; i++) fc.incrementRDFFileCount(); + for (int i = 0; i < 3; i++) fc.incrementZeroLengthFileCount(); + for (int i = 0; i < 3; i++) fc.incrementFailedConversionFileCount(); + assertEquals(4, fc.getSuccessfulConversionCount()); + assertTrue(fc.toString().contains("Successful Conversions : 4"), fc.toString()); + } + + @Test + void manyEmptyFilesCannotDriveTheSummaryNegative() { + FileCounter fc = new FileCounter(); + for (int i = 0; i < 2; i++) fc.incrementRDFFileCount(); + for (int i = 0; i < 5; i++) fc.incrementZeroLengthFileCount(); + assertEquals(2, fc.getSuccessfulConversionCount()); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/core/VoidStatsTest.java b/src/test/java/com/ebremer/beakgraph/core/VoidStatsTest.java new file mode 100644 index 00000000..6e2f0db4 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/core/VoidStatsTest.java @@ -0,0 +1,51 @@ +package com.ebremer.beakgraph.core; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.apache.jena.graph.NodeFactory; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * The VoID description carries one void:propertyPartition per (graph, + * predicate) pair, so a predicate used in several graphs appears in several + * partitions. VoidStats must SUM them: a plain put() kept whichever partition + * HashMap iteration visited last, feeding the reorder cost model a per-graph + * count against the dataset-wide total. + */ +class VoidStatsTest { + + @TempDir + Path dir; + + @Test + void predicateCountsSumAcrossGraphPartitions() throws Exception { + String trig = """ + @prefix ex: . + ex:s1 ex:p ex:o1 . + ex:s2 ex:p ex:o2 . + ex:g1 { + ex:s3 ex:p ex:o3 . + ex:s4 ex:p ex:o4 . + ex:s5 ex:p ex:o5 . + } + """; + File src = dir.resolve("stats.trig").toFile(); + File h5 = dir.resolve("stats.trig.h5").toFile(); + Files.write(src.toPath(), trig.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(src).setDestination(h5) + .setSpatial(false).setFeatures(false).build().write(); + + try (HDF5Reader reader = new HDF5Reader(h5)) { + VoidStats stats = VoidStats.load(reader); + assertEquals(5, stats.predicateCount(NodeFactory.createURI("http://ex.org/p")), + "ex:p appears in two graph partitions (2 + 3) and must sum to 5"); + } + } +} diff --git a/src/test/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServletTest.java b/src/test/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServletTest.java index a0f2d04d..31633add 100644 --- a/src/test/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServletTest.java +++ b/src/test/java/com/ebremer/beakgraph/core/fuseki/LWSStorageServletTest.java @@ -87,6 +87,38 @@ void encodeHrefPercentEncodesUnsafeCharactersButKeepsSlashes() { assertEquals("/plain/file.h5", LWSStorageServlet.encodeHref("/plain/file.h5")); } + @Test + void toLiveUriMapsCanonicalUrisWithoutDoubledSlashes() { + String canonicalRoot = com.ebremer.beakgraph.lws.LWSMetadataGenerator.CANONICAL_BASE; + // Live bases end with '/'; canonical remainders start with '/': the old + // concatenation minted "http://host//name" URIs that 404 when followed. + assertEquals("http://example:9999/sub/file.h5", + LWSStorageServlet.toLiveUri(canonicalRoot + "/sub/file.h5", "http://example:9999/")); + assertEquals("http://example:9999/", + LWSStorageServlet.toLiveUri(canonicalRoot, "http://example:9999/")); + } + + @Test + void decodePathDecodesPercentEncodingAndRejectsGarbage() { + // getRequestURI() is undecoded; the metadata model and the filesystem + // hold raw names, so "a b.h5" must be reachable via its encoded link. + assertEquals("/a b.h5", LWSStorageServlet.decodePath("/a%20b.h5")); + assertEquals("/x/y.h5", LWSStorageServlet.decodePath("/x/y.h5")); + // '+' is a literal plus in a path (URLDecoder would have eaten it). + assertEquals("/a+b.h5", LWSStorageServlet.decodePath("/a+b.h5")); + assertNull(LWSStorageServlet.decodePath("/bad%zz")); + } + + @Test + void wildcardAcceptHeadersGetARepresentationNotA406() { + assertTrue(LWSStorageServlet.acceptsHtmlRepresentation("")); // no Accept at all + assertTrue(LWSStorageServlet.acceptsHtmlRepresentation("*/*")); // curl's default + assertTrue(LWSStorageServlet.acceptsHtmlRepresentation("text/*")); + assertTrue(LWSStorageServlet.acceptsHtmlRepresentation("text/html,application/xhtml+xml")); + assertFalse(LWSStorageServlet.acceptsHtmlRepresentation("application/ld+json")); + assertFalse(LWSStorageServlet.acceptsHtmlRepresentation("text/turtle")); + } + @Test void fileUrisAreNotExposableToClients() { org.apache.jena.rdf.model.Model m = org.apache.jena.rdf.model.ModelFactory.createDefaultModel(); diff --git a/src/test/java/com/ebremer/beakgraph/core/fuseki/RelativeIRIResolverTest.java b/src/test/java/com/ebremer/beakgraph/core/fuseki/RelativeIRIResolverTest.java index d5d5a0e1..3b90a2a3 100644 --- a/src/test/java/com/ebremer/beakgraph/core/fuseki/RelativeIRIResolverTest.java +++ b/src/test/java/com/ebremer/beakgraph/core/fuseki/RelativeIRIResolverTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.List; +import java.util.function.Predicate; import org.apache.jena.graph.Node; import org.apache.jena.graph.NodeFactory; import org.apache.jena.query.ResultSet; @@ -55,29 +56,61 @@ void storageToAbsoluteLeavesAbsoluteIrisUnchanged() { assertSame(snomed, t.apply(snomed)); } + /** A dictionary that holds only relative-form terms (no scheme) - the shape a BG store has. */ + private static final Predicate RELATIVE_FORMS_STORED = n -> !n.getURI().contains(":"); + @Test void absoluteToStorageRelativizesTheDocumentItself() { - NodeTransform t = new RelativeIRIResolver(BASE).absoluteToStorage(); + NodeTransform t = new RelativeIRIResolver(BASE).absoluteToStorage(RELATIVE_FORMS_STORED); assertEquals("", t.apply(NodeFactory.createURI(BASE)).getURI()); } @Test void absoluteToStorageRelativizesASibling() { - NodeTransform t = new RelativeIRIResolver(BASE).absoluteToStorage(); + NodeTransform t = new RelativeIRIResolver(BASE).absoluteToStorage(RELATIVE_FORMS_STORED); assertEquals("image.png", t.apply(NodeFactory.createURI(SIBLING)).getURI()); } @Test void absoluteToStorageLeavesUnrelatedIrisUnchanged() { - NodeTransform t = new RelativeIRIResolver(BASE).absoluteToStorage(); + NodeTransform t = new RelativeIRIResolver(BASE).absoluteToStorage(RELATIVE_FORMS_STORED); Node snomed = NodeFactory.createURI("http://snomed.info/id/123"); assertSame(snomed, t.apply(snomed)); } + @Test + void absoluteStoredIriIsNotRewrittenIntoAGuaranteedMiss() { + // Same host, different subtree: relativize yields the path-absolute form + // "/other/thing", which the writer never stores. The rewrite must not + // fire - the dictionary holds the ABSOLUTE term and the query must keep + // naming it (the old unconditional rewrite silently returned 0 rows). + String abs = "http://localhost:8888/other/thing"; + NodeTransform t = new RelativeIRIResolver(BASE) + .absoluteToStorage(n -> n.getURI().equals(abs)); + Node node = NodeFactory.createURI(abs); + assertSame(node, t.apply(node)); + } + + @Test + void parentDirectoryFormIsNeverStoredSoNoRewrite() { + // "../other.png" is relative per IRIx but not a form the writer produces; + // with nothing stored, the absolute name must pass through untouched. + Node up = NodeFactory.createURI("http://localhost:8888/HalcyonStorage/utah/other.png"); + NodeTransform t = new RelativeIRIResolver(BASE).absoluteToStorage(n -> false); + assertSame(up, t.apply(up)); + } + + @Test + void bothFormsStoredKeepsTheExactTermTheQueryNamed() { + NodeTransform t = new RelativeIRIResolver(BASE).absoluteToStorage(n -> true); + Node sibling = NodeFactory.createURI(SIBLING); + assertSame(sibling, t.apply(sibling)); + } + @Test void inputThenOutputRoundTripsToTheOriginalIri() { RelativeIRIResolver r = new RelativeIRIResolver(BASE); - NodeTransform in = r.absoluteToStorage(); + NodeTransform in = r.absoluteToStorage(RELATIVE_FORMS_STORED); NodeTransform out = r.storageToAbsolute(); for (String iri : new String[] { BASE, SIBLING }) { Node original = NodeFactory.createURI(iri); @@ -91,7 +124,7 @@ void nullBaseMakesResolverInactiveAndTransformsIdentity() { assertFalse(r.isActive()); Node rel = NodeFactory.createURI("image.png"); assertSame(rel, r.storageToAbsolute().apply(rel)); - assertSame(rel, r.absoluteToStorage().apply(rel)); + assertSame(rel, r.absoluteToStorage(n -> true).apply(rel)); } @Test diff --git a/src/test/java/com/ebremer/beakgraph/features/FeatureEdgeCasesTest.java b/src/test/java/com/ebremer/beakgraph/features/FeatureEdgeCasesTest.java new file mode 100644 index 00000000..8e59a7b8 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/features/FeatureEdgeCasesTest.java @@ -0,0 +1,101 @@ +package com.ebremer.beakgraph.features; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.features.pyradiomics.Gen2DFeatures; +import com.ebremer.ns.HAL; +import com.ebremer.ns.PYR; +import java.util.ArrayList; +import java.util.Map; +import java.util.stream.Collectors; +import org.apache.jena.graph.Node; +import org.apache.jena.graph.NodeFactory; +import org.apache.jena.sparql.core.Quad; +import org.junit.jupiter.api.Test; + +/** + * Feature-math edge cases: + *
      + *
    • a valid polygon thinner than ~0.5 units must still get features (the + * raster used to round to a 0-sized image and BufferedImage threw, + * skipping even the purely polygon-based features);
    • + *
    • zero-area geometry must not emit "INF"^^xsd:double literals;
    • + *
    • MajorMinor values come from exact AREA moments: holed polygons get an + * unbiased centroid (the vertex cloud double-weighted ring closures) and + * axis lengths follow the pyradiomics 4*sqrt(lambda) convention that + * PYR.MajorAxisLength uses.
    • + *
    + */ +class FeatureEdgeCasesTest { + + private static final Node F = NodeFactory.createURI("http://ex.org/f"); + + private static Map byPredicate(ArrayList quads) { + return quads.stream().collect(Collectors.toMap(Quad::getPredicate, + q -> q.getObject().getLiteralLexicalForm())); + } + + @Test + void thinPolygonStillGetsAllFeatures() { + ArrayList quads = new ArrayList<>(); + Gen2DFeatures.generate(quads, F, "POLYGON((0 0,100 0,100 0.4,0 0.4,0 0))"); + Map features = byPredicate(quads); + assertTrue(features.containsKey(PYR.MeshSurface.asNode()), + "polygon-based features must survive a sub-pixel raster height"); + assertEquals(40.0, Double.parseDouble(features.get(PYR.MeshSurface.asNode())), 1e-9); + assertTrue(features.containsKey(PYR.PixelSurface.asNode()), + "the raster features must be computed on the clamped 1px image"); + } + + @Test + void zeroAreaGeometryEmitsNoNonFiniteFeatureValues() { + // The bowtie's shoelace area is exactly 0: the ratio features divide by + // it and used to store "INF"^^xsd:double as real feature values. + ArrayList quads = new ArrayList<>(); + Gen2DFeatures.generate(quads, F, "POLYGON((0 0,10 10,10 0,0 10,0 0))"); + Map features = byPredicate(quads); + assertTrue(features.containsKey(PYR.Perimeter.asNode()), "finite features are still emitted"); + assertFalse(features.containsKey(PYR.PerimeterSurfaceRatio.asNode()), + "perimeter/area is infinite for zero area and must be skipped"); + assertFalse(features.containsKey(PYR.SphericalDisproportion.asNode())); + for (Map.Entry e : features.entrySet()) { + assertTrue(Double.isFinite(Double.parseDouble(e.getValue())), + "non-finite value emitted for " + e.getKey() + ": " + e.getValue()); + } + } + + @Test + void holedPolygonCentroidIsTheAreaCentroid() { + // Square shell with a centered square hole: the area centroid is exactly + // the center. The vertex cloud kept the shell's ring-closure vertex, so + // the old PCA centroid was biased toward it (~1.78 instead of 2). + ArrayList quads = new ArrayList<>(); + MajorMinor.add(quads, F, "POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1,3 1,3 3,1 3,1 1))"); + Map features = byPredicate(quads); + assertEquals("POINT(2.0000 2.0000)", features.get(HAL.centroid.asNode())); + } + + @Test + void axisLengthsFollowThePyradiomicsAreaConvention() throws Exception { + // Rectangle 20x10: region variance along x is 20^2/12, so the pyradiomics + // major axis is 4*sqrt(400/12) = 23.094 - the SAME definition + // PYR.MajorAxisLength uses on the raster. The old vertex-cloud 2*sqrt + // drawn axis was mutually inconsistent with it. + ArrayList quads = new ArrayList<>(); + MajorMinor.add(quads, F, "POLYGON((0 0,20 0,20 10,0 10,0 0))"); + Map features = byPredicate(quads); + + org.locationtech.jts.geom.Geometry major = new org.locationtech.jts.io.WKTReader() + .read(features.get(HAL.majorAxis.asNode())); + org.locationtech.jts.geom.Geometry minor = new org.locationtech.jts.io.WKTReader() + .read(features.get(HAL.minorAxis.asNode())); + assertEquals(4 * Math.sqrt(400.0 / 12.0), major.getLength(), 1e-3); + assertEquals(4 * Math.sqrt(100.0 / 12.0), minor.getLength(), 1e-3); + // The major axis runs along x, centered on the area centroid. + org.locationtech.jts.geom.Coordinate[] c = major.getCoordinates(); + assertEquals(5.0, c[0].y, 1e-6); + assertEquals(5.0, c[1].y, 1e-6); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/lws/LWSMetadataGeneratorTest.java b/src/test/java/com/ebremer/beakgraph/lws/LWSMetadataGeneratorTest.java new file mode 100644 index 00000000..bda18733 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/lws/LWSMetadataGeneratorTest.java @@ -0,0 +1,36 @@ +package com.ebremer.beakgraph.lws; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.apache.jena.rdf.model.Model; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +class LWSMetadataGeneratorTest { + + @TempDir + Path root; + + @Test + void regenerationDoesNotIndexTheMetadataCacheItself() throws Exception { + Files.write(root.resolve("data.h5"), new byte[]{1, 2, 3}); + // A previous generation's cache is on disk - the regeneration walk must + // not turn it into a listed DataResource: the raw model carries the + // owl:sameAs file:/// server paths the servlet redacts from clients. + Files.write(root.resolve(LWSMetadataGenerator.CACHE_FILE_NAME), + "stale cache".getBytes(StandardCharsets.UTF_8)); + + Model model = LWSMetadataGenerator.generateLWSModel(root); + + String base = LWSMetadataGenerator.CANONICAL_BASE; + assertTrue(model.containsResource(model.createResource(base + "/data.h5")), + "real files must be indexed"); + assertFalse(model.containsResource( + model.createResource(base + "/" + LWSMetadataGenerator.CACHE_FILE_NAME)), + "the metadata cache file must never index itself"); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/pool/BeakGraphPoolValidationTest.java b/src/test/java/com/ebremer/beakgraph/pool/BeakGraphPoolValidationTest.java new file mode 100644 index 00000000..2d61563b --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/pool/BeakGraphPoolValidationTest.java @@ -0,0 +1,47 @@ +package com.ebremer.beakgraph.pool; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.apache.commons.pool2.PooledObject; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * Pool validation must actually probe the reader (testOnBorrow is on): an + * isOpen-only check re-issued a poisoned instance to every borrower forever, + * since a reader whose backing data went bad still reports "open". + */ +class BeakGraphPoolValidationTest { + + @TempDir + Path dir; + + @Test + void validateObjectProbesRealDataAndRejectsClosedReaders() throws Exception { + File ttl = dir.resolve("pool.ttl").toFile(); + File h5 = dir.resolve("pool.ttl.h5").toFile(); + Files.write(ttl.toPath(), + " .\n".getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(ttl).setDestination(h5) + .setSpatial(false).setFeatures(false).build().write(); + + BeakGraphPoolFactory factory = new BeakGraphPoolFactory(); + BeakGraph bg = factory.create(h5.toURI()); + PooledObject pooled = factory.wrap(bg); + try { + assertTrue(factory.validateObject(h5.toURI(), pooled), + "a healthy instance must validate (probe included)"); + } finally { + bg.close(); + } + assertFalse(factory.validateObject(h5.toURI(), pooled), + "a closed instance must fail validation and be discarded"); + } +} From 972b7b8cdd1eeb8db98ec40c37d8cb399ce38ca8 Mon Sep 17 00:00:00 2001 From: Erich Bremer Date: Thu, 2 Jul 2026 10:09:46 -0400 Subject: [PATCH 4/4] initial huge BeakGraph support --- RDF_1.1-compliance.md | 64 ++ pom.xml | 148 +++- .../beakgraph/cmdline/BeakGraphCLI.java | 33 +- .../ebremer/beakgraph/cmdline/Parameters.java | 13 +- .../com/ebremer/beakgraph/core/lib/VByte.java | 22 +- .../hdf5/BitPackedUnSignedLongBuffer.java | 187 +++-- .../beakgraph/hdf5/readers/FCDReader.java | 39 +- .../beakgraph/hdf5/readers/IndexReader.java | 3 +- .../readers/MultiTypeDictionaryReader.java | 28 +- .../readers/PositionalDictionaryReader.java | 7 +- .../beakgraph/huge/ExternalSorter.java | 254 ++++++ .../beakgraph/huge/HugeBuildPipeline.java | 763 ++++++++++++++++++ .../beakgraph/huge/HugeHDF5Writer.java | 165 ++++ .../com/ebremer/beakgraph/huge/HugeIO.java | 73 ++ .../beakgraph/huge/HugeIndexWriter.java | 264 ++++++ .../ebremer/beakgraph/huge/HugeRecords.java | 114 +++ .../beakgraph/huge/NativeHdf5File.java | 282 +++++++ .../com/ebremer/beakgraph/huge/NodeCodec.java | 105 +++ .../ebremer/beakgraph/huge/RecordFile.java | 123 +++ .../beakgraph/huge/SpatialAugmenter.java | 198 +++++ .../beakgraph/huge/SpillBitPackedBuffer.java | 127 +++ .../beakgraph/huge/SpillDataBuffer.java | 92 +++ .../beakgraph/huge/SpillFCDWriter.java | 142 ++++ .../huge/StreamingDictionaryWriter.java | 274 +++++++ .../ebremer/beakgraph/huge/StreamingHdf5.java | 38 + .../beakgraph/huge/StreamingHdf5Dataset.java | 30 + .../beakgraph/huge/StreamingHdf5File.java | 33 + .../beakgraph/huge/StreamingHdf5Group.java | 37 + .../ebremer/beakgraph/huge/package-info.java | 38 + .../ebremer/beakgraph/io/ByteBufferBytes.java | 66 ++ .../ebremer/beakgraph/io/DatasetBytes.java | 59 ++ .../beakgraph/io/MemorySegmentBytes.java | 83 ++ .../beakgraph/io/RandomAccessBytes.java | 43 + .../cmdline/BeakGraphCLIConversionTest.java | 32 + .../beakgraph/huge/ExternalSorterTest.java | 76 ++ .../beakgraph/huge/HugeWriterParityTest.java | 277 +++++++ .../beakgraph/huge/NativeHdf5SmokeTest.java | 79 ++ .../huge/SpillBitPackedBufferTest.java | 71 ++ .../beakgraph/io/FfmReaderPathTest.java | 121 +++ .../io/RandomAccessBytesParityTest.java | 110 +++ 40 files changed, 4581 insertions(+), 132 deletions(-) create mode 100644 RDF_1.1-compliance.md create mode 100644 src/main/java/com/ebremer/beakgraph/huge/ExternalSorter.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/HugeBuildPipeline.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/HugeHDF5Writer.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/HugeIO.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/HugeIndexWriter.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/HugeRecords.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/NativeHdf5File.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/NodeCodec.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/RecordFile.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/SpatialAugmenter.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/SpillBitPackedBuffer.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/SpillDataBuffer.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/SpillFCDWriter.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/StreamingDictionaryWriter.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5Dataset.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5File.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5Group.java create mode 100644 src/main/java/com/ebremer/beakgraph/huge/package-info.java create mode 100644 src/main/java/com/ebremer/beakgraph/io/ByteBufferBytes.java create mode 100644 src/main/java/com/ebremer/beakgraph/io/DatasetBytes.java create mode 100644 src/main/java/com/ebremer/beakgraph/io/MemorySegmentBytes.java create mode 100644 src/main/java/com/ebremer/beakgraph/io/RandomAccessBytes.java create mode 100644 src/test/java/com/ebremer/beakgraph/huge/ExternalSorterTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/huge/HugeWriterParityTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/huge/NativeHdf5SmokeTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/huge/SpillBitPackedBufferTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/io/FfmReaderPathTest.java create mode 100644 src/test/java/com/ebremer/beakgraph/io/RandomAccessBytesParityTest.java diff --git a/RDF_1.1-compliance.md b/RDF_1.1-compliance.md new file mode 100644 index 00000000..87b57e6e --- /dev/null +++ b/RDF_1.1-compliance.md @@ -0,0 +1,64 @@ +# BeakGraph RDF 1.1 Compliance Assessment + +*Assessed 2026-07-02 against [RDF 1.1 Concepts and Abstract Syntax](https://www.w3.org/TR/rdf11-concepts/) (W3C Recommendation, 25 February 2014). + +## Verdict + +Substantially compliant for the core data model as an RDF 1.1 dataset store queried through SPARQL. Three deliberate, documented deviations exist, of which one (numeric literal canonicalization) affects term identity. + +## Compliant areas + +### Term model and positions +- Subjects are IRI/blank node, predicates IRI, objects IRI/blank node/literal, graph names IRI/blank node — enforced with loud failures rather than silent acceptance of generalized RDF (`PositionalDictionaryWriterBuilder.ProcessQuad`, mirrored in `HugeBuildPipeline.countEntityKind`). +- RDF-star quoted triples are rejected with an exception. Correct behavior for an RDF **1.1** store; quoted triples are RDF 1.2 territory. + +### Literals +- Every literal carries its datatype IRI, per RDF 1.1 (simple literals are `xsd:string`; identification inherited from Jena 5). +- `rdf:langString` is fully supported: the `langs`/`langTags` datasets store language tags separately and literals reconstruct term-exact (`MultiTypeDictionaryWriter` / `MultiTypeDictionaryReader`). Tag normalization policy is inherited from Jena's parsers and applied consistently on both write and query paths. +- Ill-typed literals (e.g. `"abc"^^xsd:int`) are valid RDF 1.1 terms and are preserved term-exactly through the strings path instead of being rejected or "repaired". +- Unicode: UTF-8 storage throughout; the front-coded dictionary never splits UTF-16 surrogate pairs (`FCDWriter.commonPrefixLength`). + +### Blank nodes +- Blank node identifiers are not part of the RDF 1.1 abstract syntax; graphs are defined up to isomorphism. Rank-based storage (labels regenerated from dictionary ids on read) and the huge writer's keep-original-labels policy are both compliant under that rule. +- Blank node sharing across named graphs within one dataset is preserved, matching TriG/N-Quads dataset scoping. + +### Datasets +- Default graph plus named graphs, with IRI and blank-node graph names supported. The default graph is held under ARQ's sentinel IRI internally — a representation detail invisible at the SPARQL level (`NodeComparator` even orders the two ARQ sentinels as distinct terms so data that uses them survives). +- Union-graph queries apply RDF-correct set semantics (explicit row dedup in `HDF5Reader.readUnion`). + +### Syntax and query semantics +- Parsing/serialization and SPARQL 1.1 semantics are delegated to Jena 5.x (RIOT/ARQ); BeakGraph sits below as storage. +- The value-ordered dictionary preserves term identity: `NodeComparator` breaks value-equal ties on the exact RDF term (`"1"^^xsd:int` vs `"1"^^xsd:integer` keep distinct ids), and provides a self-consistent total order for timezone-sensitive temporal value spaces that agrees with XSD order wherever XSD order is determinate. + +## Deviations + +### 1. Numeric lexical canonicalization (affects term identity) +`canonicalizeNumericObject` rewrites `xsd:int` / `xsd:long` / `xsd:float` / `xsd:double` **objects** to canonical lexical form at ingest (`"01"^^xsd:int` → `"1"^^xsd:int`). Under RDF 1.1 these are distinct terms with equal values, so: + +- the stored graph is value-preserving and D-entailment-equivalent to the source, but **not isomorphic** when the source contains non-canonical spellings; +- `sameTerm`-style lookups for the original spelling miss. + +This is forced by the storage design: those four datatypes are stored by binary value and the reader regenerates the lexical form, so non-canonical spellings have nowhere to live. Strict term fidelity would require routing non-canonical numerics through the term-exact strings path (larger files, no numeric range pushdown for those literals). If archival round-tripping ever matters, this is the one behavior worth putting behind an off switch. + +Note: `xsd:integer`, `xsd:decimal`, `xsd:dateTime`, booleans, and all other datatypes are stored term-exactly via the strings path. (The `T`-substring on `xsd:dateTime` in `ProcessQuad` feeds string-length *statistics* only; the stored literal is the full lexical form.) + +### 2. Relative IRIs stored unresolved +RDF 1.1 abstract syntax requires absolute IRIs. BeakGraph deliberately stores document-relative references (`DataType.RELATIVE_IRI`) unresolved — parsed against a sentinel base, stripped back to relative form, and resolved against the serving URL at query time (`RelativeIRIResolver`). Until resolution, the in-file graph is not pure abstract syntax. This is an intentional extension serving the LWS/document use case. + +### 3. Injected metadata graphs +The stored dataset is a superset of the source: VoID/SD metadata (`urn:x-beakgraph:void`) always, spatial index graphs (`urn:x-beakgraph:Spatial`, grid-tile URN graphs) when spatial indexing is enabled. Valid RDF, but `GRAPH ?g` enumerates graphs the source never contained — a faithfulness caveat rather than a spec violation. Relatedly, the `numQuads` attribute counts source quads only, excluding injected metadata. + +## Summary table + +| Aspect | Status | +|---|---| +| Term positions (S/P/O/G kinds) | Compliant, enforced | +| Literal datatypes, `xsd:string` identity | Compliant | +| `rdf:langString` / language tags | Compliant | +| Ill-typed literals | Compliant (preserved term-exact) | +| Blank node semantics | Compliant (isomorphism) | +| Datasets / named graphs | Compliant | +| Generalized RDF / RDF-star | Rejected loudly (correct for 1.1) | +| Numeric literal term identity | **Deviation** — canonicalized at ingest | +| Absolute-IRI requirement | **Deviation** — relative IRIs stored, resolved at serving time | +| Dataset faithfulness | **Caveat** — metadata graphs injected | diff --git a/pom.xml b/pom.xml index a4dfb6c4..45a6c913 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.ebremer BeakGraph BeakGraph - 0.15.0 + 0.16.0 jar Library for creating indexed binary storages for Apache Jena Graphs and Datasets @@ -53,6 +53,21 @@ 2.25.2 2.0.17 0.10.0 + + 1.14.3-1.5.10 + 2.1.1 + + linux-x86_64 3.0 0.2.3 1.20.0 @@ -209,7 +224,18 @@ lib - true + + + !thin + BeakGraph-${project.version} @@ -374,6 +400,121 @@ + + + + + hdf5-backend-javacpp + + + !hdf5.ffm + + + + + org.bytedeco + hdf5-platform + ${hdf5.javacpp.version} + true + + + + + + hdf5-backend-ffm + + + hdf5.ffm + + + + + github-hdfgroup + HDF Group GitHub Packages + https://maven.pkg.github.com/HDFGroup/hdf5 + true + false + + + + + org.hdfgroup + hdf5-java-ffm + ${hdf5.ffm.version} + ${hdf5.ffm.classifier} + true + + + + + + hdf5-ffm-windows + + windows + + + windows-x86_64 + + + + hdf5-ffm-linux + + linuxamd64 + + + linux-x86_64 + + + + hdf5-ffm-macos-intel + + macx86_64 + + + macos-x86_64 + + + + hdf5-ffm-macos-arm + + macaarch64 + + + macos-aarch64 + + @@ -455,6 +596,9 @@ jhdf ${jhdf.version} + org.jcommander jcommander diff --git a/src/main/java/com/ebremer/beakgraph/cmdline/BeakGraphCLI.java b/src/main/java/com/ebremer/beakgraph/cmdline/BeakGraphCLI.java index 3f48763d..118c4944 100644 --- a/src/main/java/com/ebremer/beakgraph/cmdline/BeakGraphCLI.java +++ b/src/main/java/com/ebremer/beakgraph/cmdline/BeakGraphCLI.java @@ -5,6 +5,7 @@ import com.ebremer.beakgraph.Params; import com.ebremer.beakgraph.core.fuseki.SPARQLEndPoint; import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import com.ebremer.beakgraph.huge.HugeHDF5Writer; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; @@ -209,13 +210,31 @@ public Model call() { return null; } dest.getParent().toFile().mkdirs(); - HDF5Writer.Builder() - .setSource(src.toFile()) - .setDestination(dest.toFile()) - .setSpatial(params.spatial) - .setFeatures(params.features) - .build() - .write(); + if (params.huge) { + // Disk-based build: same output format, but sorting/indexing + // spill to a workspace instead of the heap. Note the huge + // writer needs the native HDF5 backend on the classpath (the + // hdf5-backend-* profiles); with -threads N, N builds run + // concurrently, each with its own workspace. + HugeHDF5Writer.Builder builder = HugeHDF5Writer.Builder() + .setSource(src.toFile()) + .setDestination(dest.toFile()) + .setSpatial(params.spatial) + .setFeatures(params.features); + if (params.workdir != null) { + params.workdir.mkdirs(); + builder.setWorkDirectory(params.workdir.toPath()); + } + builder.build().write(); + } else { + HDF5Writer.Builder() + .setSource(src.toFile()) + .setDestination(dest.toFile()) + .setSpatial(params.spatial) + .setFeatures(params.features) + .build() + .write(); + } } catch (Exception ex) { fc.incrementFailedConversionFileCount(); logger.error("Failed to convert {}", src, ex); diff --git a/src/main/java/com/ebremer/beakgraph/cmdline/Parameters.java b/src/main/java/com/ebremer/beakgraph/cmdline/Parameters.java index 6c180e49..71ddf798 100644 --- a/src/main/java/com/ebremer/beakgraph/cmdline/Parameters.java +++ b/src/main/java/com/ebremer/beakgraph/cmdline/Parameters.java @@ -27,9 +27,20 @@ public class Parameters { @Parameter(names = {"-spatial"}, converter = BooleanConverter.class) public boolean spatial = false; - + @Parameter(names = {"-features"}, converter = BooleanConverter.class) public boolean features = false; + + @Parameter(names = {"-huge"}, converter = BooleanConverter.class, + description = "Use the disk-based writer (com.ebremer.beakgraph.huge): sorts and " + + "indexes on disk instead of RAM, for sources too large for the heap") + public boolean huge = false; + + @Parameter(names = "-workdir", + description = "Workspace directory for -huge spill files; needs free space on the " + + "order of a few times the uncompressed source (default: each " + + "destination file's directory)", required = false) + public File workdir = null; @Parameter(names = {"-version","-v"}, converter = BooleanConverter.class) public boolean version = false; diff --git a/src/main/java/com/ebremer/beakgraph/core/lib/VByte.java b/src/main/java/com/ebremer/beakgraph/core/lib/VByte.java index d65fb031..54693764 100644 --- a/src/main/java/com/ebremer/beakgraph/core/lib/VByte.java +++ b/src/main/java/com/ebremer/beakgraph/core/lib/VByte.java @@ -1,15 +1,17 @@ package com.ebremer.beakgraph.core.lib; +import com.ebremer.beakgraph.io.RandomAccessBytes; import java.io.IOException; import java.io.OutputStream; -import java.nio.ByteBuffer; /** * Variable-byte (VByte) encoding, trimmed to the two operations the * front-coded dictionaries actually use: streaming encode at write time and * position-independent decode at read time. The signed (zig-zag), byte-array * and position-mutating ByteBuffer variants that accumulated here had no - * callers and were removed in the dead-code sweep. + * callers and were removed in the dead-code sweep. The decode side reads + * through {@link RandomAccessBytes} with long offsets (its only caller is + * FCDReader), so string buffers past 2 GiB decode without int truncation. */ public class VByte { @@ -35,20 +37,20 @@ public static int encode(OutputStream out, long value) throws IOException { } /** - * Decode an unsigned long from a ByteBuffer at an absolute offset, WITHOUT moving the - * buffer's position. This lets a single buffer be read by concurrent threads safely. - * @param buffer the buffer to read from + * Decode an unsigned long at an absolute offset. Absolute reads only, so a + * single backing region can be read by concurrent threads safely. + * @param bytes the region to read from * @param offset the absolute byte offset to start decoding at * @return value and nextOffset (the absolute position just past the encoded value) */ - public static DecodeResult decodeAt(ByteBuffer buffer, int offset) { + public static DecodeResult decodeAt(RandomAccessBytes bytes, long offset) { long result = 0; int shift = 0; - int pos = offset; + long pos = offset; byte b; do { if (shift >= 64) throw new IllegalArgumentException("VByte sequence too long"); - b = buffer.get(pos++); + b = bytes.get(pos++); result |= (long)(b & 0x7F) << shift; shift += 7; } while ((b & 0x80) == 0); @@ -60,9 +62,9 @@ public static DecodeResult decodeAt(ByteBuffer buffer, int offset) { */ public static class DecodeResult { public final long value; - public final int nextOffset; + public final long nextOffset; - public DecodeResult(long value, int nextOffset) { + public DecodeResult(long value, long nextOffset) { this.value = value; this.nextOffset = nextOffset; } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/BitPackedUnSignedLongBuffer.java b/src/main/java/com/ebremer/beakgraph/hdf5/BitPackedUnSignedLongBuffer.java index 0267c3c9..5b75add1 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/BitPackedUnSignedLongBuffer.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/BitPackedUnSignedLongBuffer.java @@ -1,5 +1,7 @@ package com.ebremer.beakgraph.hdf5; +import com.ebremer.beakgraph.io.ByteBufferBytes; +import com.ebremer.beakgraph.io.RandomAccessBytes; import com.ebremer.beakgraph.utils.UTIL; import io.jhdf.api.WritableDataset; import io.jhdf.api.WritableGroup; @@ -16,58 +18,95 @@ /** * A buffer that supports writing and reading bit-packed unsigned integers/longs. + * + *

    All read paths go through {@link RandomAccessBytes} with long offsets, so + * a read view is no longer capped at 2 GiB by ByteBuffer's int indexing - the + * backing bytes may be a jHDF-mapped buffer, an FFM-mapped segment, or (for + * the write side after {@link #prepareForReading()}) the internally + * accumulated bytes. */ public class BitPackedUnSignedLongBuffer { private ByteBuffer buffer; + private RandomAccessBytes data; private final int bitWidth; - + // Writing State private long writeAccumulator; private int writeAccumulatorCount; private final boolean usesInternalStream; private ByteArrayOutputStream internalStream; - + // Reading State (Sequential) private long readAccumulator; private int readAccumulatorCount; - + private long readPos; + private final Path path; private long numEntries; public BitPackedUnSignedLongBuffer(Path path, ByteBuffer buffer, long numEntries, int bitWidth) { this.path = path; - // The pack/unpack accumulators (putValue/getValue/get/stream) hold a value together with its - // <=7-bit sub-byte offset in a single 64-bit long. That fits only for width <= 57 (7 + 57 = 64); - // width 64 is also safe because it is byte-aligned (offset always 0). Widths 58..63 would - // silently drop high bits on both read and write, so reject them up front rather than corrupt - // data. Unreachable in practice: width is MinBits(id count) and 57 bits already addresses - // > 1.4e17 ids. - boolean supported = (bitWidth >= 1 && bitWidth <= 57) || bitWidth == 64; - if (!supported) { - throw new IllegalArgumentException( - "Unsupported bit width: " + bitWidth + ". Supported: 1..57, or 64 (byte-aligned)."); - } + checkWidth(bitWidth); this.bitWidth = bitWidth; if (buffer == null) { this.internalStream = new ByteArrayOutputStream(); this.usesInternalStream = true; - this.buffer = ByteBuffer.allocate(0); + this.buffer = ByteBuffer.allocate(0); + this.data = new ByteBufferBytes(this.buffer); this.numEntries = 0; } else { this.buffer = buffer; // Enforce Big Endian so getLong() matches the stream byte order this.buffer.order(ByteOrder.BIG_ENDIAN); + this.data = new ByteBufferBytes(this.buffer); this.usesInternalStream = false; this.numEntries = numEntries; } resetState(); } + private BitPackedUnSignedLongBuffer(RandomAccessBytes data, long numEntries, int bitWidth) { + this.path = null; + checkWidth(bitWidth); + this.bitWidth = bitWidth; + this.buffer = null; // pure read view: the write-side API is unavailable + this.data = data; + this.usesInternalStream = false; + this.numEntries = numEntries; + resetState(); + } + + /** + * A read-only view over already-packed bytes. This is how the HDF5 readers + * construct buffers (via {@code DatasetBytes.of}); unlike the ByteBuffer + * constructor it carries no 2 GiB ceiling. A static factory rather than a + * constructor overload: the writers construct with a null ByteBuffer + * literal, which an overload would make ambiguous. + */ + public static BitPackedUnSignedLongBuffer readView(RandomAccessBytes data, long numEntries, int bitWidth) { + return new BitPackedUnSignedLongBuffer(data, numEntries, bitWidth); + } + + private static void checkWidth(int bitWidth) { + // The pack/unpack accumulators (putValue/getValue/get/stream) hold a value together with its + // <=7-bit sub-byte offset in a single 64-bit long. That fits only for width <= 57 (7 + 57 = 64); + // width 64 is also safe because it is byte-aligned (offset always 0). Widths 58..63 would + // silently drop high bits on both read and write, so reject them up front rather than corrupt + // data. Unreachable in practice: width is MinBits(id count) and 57 bits already addresses + // > 1.4e17 ids. + boolean supported = (bitWidth >= 1 && bitWidth <= 57) || bitWidth == 64; + if (!supported) { + throw new IllegalArgumentException( + "Unsupported bit width: " + bitWidth + ". Supported: 1..57, or 64 (byte-aligned)."); + } + } + private void resetState() { this.writeAccumulator = 0L; this.writeAccumulatorCount = 0; this.readAccumulator = 0L; this.readAccumulatorCount = 0; + this.readPos = 0L; } // --- QUERY METHODS --- @@ -83,14 +122,12 @@ public long select1(long rank) { // so trailing padding / arena tail bytes can't inflate popcount and skew the rank. long fullWords = maxIndex / 64; long fullWordBytes = fullWords * 8; - int bufferLimit = buffer.limit(); - int safeLimit = (int) Math.min(fullWordBytes, bufferLimit) - 8; - int bufferOffset = 0; + long safeLimit = Math.min(fullWordBytes, data.size()) - 8; + long bufferOffset = 0; long i = 0; - // FAST PATH: Iterate over full 64-bit words directly from buffer - // This eliminates the overhead of getWord64() + // FAST PATH: Iterate over full 64-bit words directly from the backing bytes while (bufferOffset <= safeLimit && i < maxIndex) { - long word = buffer.getLong(bufferOffset); + long word = data.getLong(bufferOffset); int pop = Long.bitCount(word); if (currentRank + pop >= rank) { // The target bit is in this word. @@ -106,7 +143,7 @@ public long select1(long rank) { for (; i < maxIndex; i += 64) { long word = getWord64SafeTail(i); // Use existing safe method for the edge int pop = Long.bitCount(word); - + if (currentRank + pop >= rank) { long needed = rank - currentRank; long resultIndex = i + selectInWordSafe(word, needed); @@ -116,7 +153,7 @@ public long select1(long rank) { } return -1; } - + /** * Finds the index (0-63, from the MSB) of the k-th set bit in a word. * Delegates to the shared broadword implementation so this linear select1 @@ -150,23 +187,26 @@ public void writeLong(long value) { putValue(value & ((bitWidth == 64) ? -1L : (1L << bitWidth) - 1)); numEntries++; } - + public long getBitWidth() { return bitWidth; } - + public long getNumEntries() { return numEntries; } private void putValue(long valToPack) { + if (buffer == null) { + throw new IllegalStateException("This buffer is a read view; the write API is unavailable"); + } writeAccumulator = (writeAccumulator << bitWidth) | valToPack; writeAccumulatorCount += bitWidth; while (writeAccumulatorCount >= 8) { int shift = writeAccumulatorCount - 8; byte b = (byte) (writeAccumulator >>> shift); - + if (usesInternalStream) { internalStream.write(b); } else { @@ -175,7 +215,7 @@ private void putValue(long valToPack) { } buffer.put(b); } - + writeAccumulator &= (1L << shift) - 1; writeAccumulatorCount -= 8; } @@ -184,7 +224,7 @@ private void putValue(long valToPack) { public void complete() { if (writeAccumulatorCount > 0) { byte b = (byte) (writeAccumulator << (8 - writeAccumulatorCount)); - + if (usesInternalStream) { internalStream.write(b); } else { @@ -204,8 +244,8 @@ public void complete() { public void prepareForReading() { complete(); if (usesInternalStream) { - byte[] data = internalStream.toByteArray(); - buffer = ByteBuffer.wrap(data); + byte[] bytes = internalStream.toByteArray(); + buffer = ByteBuffer.wrap(bytes); // Enforce Big Endian for internal buffers too buffer.order(ByteOrder.BIG_ENDIAN); } else { @@ -213,8 +253,11 @@ public void prepareForReading() { // Enforce Big Endian buffer.order(ByteOrder.BIG_ENDIAN); } + // Refresh the read view: the flip/wrap above changed the readable window. + data = new ByteBufferBytes(buffer); readAccumulator = 0L; readAccumulatorCount = 0; + readPos = 0L; } public long get(long index) { @@ -222,16 +265,16 @@ public long get(long index) { throw new IndexOutOfBoundsException("Index " + index + " out of bounds [0, " + numEntries + ")"); } long totalBitOffset = index * bitWidth; - int startByteIndex = Math.toIntExact(totalBitOffset / 8); + long startByteIndex = totalBitOffset / 8; int bitOffsetInFirstByte = (int) (totalBitOffset % 8); long acc = 0; int bitsCollected = 0; - int currentByteIndex = startByteIndex; + long currentByteIndex = startByteIndex; while (bitsCollected < bitOffsetInFirstByte + bitWidth) { - if (currentByteIndex >= buffer.limit()) { + if (currentByteIndex >= data.size()) { throw new BufferUnderflowException(); } - acc = (acc << 8) | (buffer.get(currentByteIndex) & 0xFFL); + acc = (acc << 8) | (data.get(currentByteIndex) & 0xFFL); currentByteIndex++; bitsCollected += 8; } @@ -242,24 +285,24 @@ public long get(long index) { } public long getWord64(long bitIndex) { - int byteIndex = Math.toIntExact(bitIndex / 8); + long byteIndex = bitIndex / 8; int bitOffset = (int) (bitIndex % 8); if (bitIndex + 64 > numEntries) { return getWord64SafeTail(bitIndex); } long raw; try { - raw = buffer.getLong(byteIndex); + raw = data.getLong(byteIndex); } catch (IndexOutOfBoundsException | BufferUnderflowException e) { return getWord64SafeTail(bitIndex); } if (bitOffset == 0) { return raw; } - if (byteIndex + 8 >= buffer.limit()) { + if (byteIndex + 8 >= data.size()) { return getWord64SafeTail(bitIndex); } - long nextByte = buffer.get(byteIndex + 8) & 0xFFL; + long nextByte = data.get(byteIndex + 8) & 0xFFL; return (raw << bitOffset) | (nextByte >>> (8 - bitOffset)); } @@ -268,8 +311,8 @@ private long getWord64SafeTail(long bitIndex) { for (int i = 0; i < 64; i++) { acc <<= 1; long entryIdx = bitIndex + i; - if (entryIdx < numEntries) { - acc |= get(entryIdx); + if (entryIdx < numEntries) { + acc |= get(entryIdx); } } return acc; @@ -278,22 +321,22 @@ private long getWord64SafeTail(long bitIndex) { public int get() { return (int) getValue(); } - + public long getLong() { return getValue(); } private long getValue() { while (readAccumulatorCount < bitWidth) { - if (!buffer.hasRemaining()) { + if (readPos >= data.size()) { throw new BufferUnderflowException(); } - readAccumulator = (readAccumulator << 8) | (buffer.get() & 0xFFL); + readAccumulator = (readAccumulator << 8) | (data.get(readPos++) & 0xFFL); readAccumulatorCount += 8; } int shift = readAccumulatorCount - bitWidth; long value = readAccumulator >>> shift; - + readAccumulator &= (1L << shift) - 1; readAccumulatorCount -= bitWidth; return value; @@ -304,6 +347,9 @@ public Path getName() { } public void add(WritableGroup group) { + if (buffer == null) { + throw new IllegalStateException("This buffer is a read view; the write API is unavailable"); + } ByteBuffer dup = buffer.duplicate(); dup.rewind(); byte[] data = new byte[dup.remaining()]; @@ -315,7 +361,7 @@ public void add(WritableGroup group) { ds.putAttribute("numEntries", numEntries); } } - + public long binarySearch(long start, long end, long value) { long low = start; long high = end; @@ -336,14 +382,14 @@ public long binarySearch(long start, long end, long value) { } return -(low + 1); // Value not found, returns insertion point } - + /** - * Finds the first index in the range [start, end] where the value is + * Finds the first index in the range [start, end] where the value is * greater than or equal to the target. (Unsigned) * @param start * @param end * @param value - * @return + * @return */ public long lowerBound(long start, long end, long value) { long low = start; @@ -364,12 +410,12 @@ public long lowerBound(long start, long end, long value) { } /** - * Finds the last index in the range [start, end] where the value is + * Finds the last index in the range [start, end] where the value is * less than or equal to the target. (Unsigned) * @param start * @param end * @param value - * @return + * @return */ public long upperBound(long start, long end, long value) { long low = start; @@ -388,41 +434,32 @@ public long upperBound(long start, long end, long value) { } return result; } - + /** * Returns a sequential LongStream of all entries in the buffer. - * Note: This method duplicates the underlying buffer to ensure the stream - * doesn't interfere with the current read position of the buffer. - * @return + * Note: the stream reads through the shared read view with its own cursor, + * so it never disturbs this buffer's sequential read position. + * @return */ public LongStream stream() { - // Ensure the buffer is ready for reading (flipped, etc) - // If the user hasn't called prepareForReading, you might want to call it here, - // but typically it's safer to assume the object is in a read-state. - - ByteBuffer readOnlyCopy = buffer.duplicate(); - readOnlyCopy.order(ByteOrder.BIG_ENDIAN); - // Rewind so the stream reads from byte 0 regardless of the live buffer's current - // position (e.g. if sequential getValue()/getLong() calls have advanced it). - readOnlyCopy.rewind(); - // If we are using an internal stream and haven't 'prepared' yet, - // this stream will be empty. Usually, complete() should be called first. - - return StreamSupport.longStream(new BitPackedSpliterator(readOnlyCopy, numEntries, bitWidth), false); + return StreamSupport.longStream(new BitPackedSpliterator(data, numEntries, bitWidth), false); } private static class BitPackedSpliterator extends Spliterators.AbstractLongSpliterator { - private final ByteBuffer localBuf; + private final RandomAccessBytes bytes; + private final long byteSize; private final int bitWidth; private final long totalEntries; private long entriesRead = 0; - + private long pos = 0; + private long acc = 0L; private int accCount = 0; - BitPackedSpliterator(ByteBuffer buffer, long totalEntries, int bitWidth) { + BitPackedSpliterator(RandomAccessBytes bytes, long totalEntries, int bitWidth) { super(totalEntries, Spliterator.IMMUTABLE | Spliterator.ORDERED | Spliterator.SIZED | Spliterator.NONNULL); - this.localBuf = buffer; + this.bytes = bytes; + this.byteSize = bytes.size(); this.totalEntries = totalEntries; this.bitWidth = bitWidth; } @@ -434,23 +471,23 @@ public boolean tryAdvance(java.util.function.LongConsumer action) { } while (accCount < bitWidth) { - if (!localBuf.hasRemaining()) { + if (pos >= byteSize) { // A buffer too short for its declared entry count is corrupt. // Fail loudly like the sequential reader does - the old break // left accCount < bitWidth, making the shift below negative // (mod-64) and emitting silent garbage values. throw new BufferUnderflowException(); } - acc = (acc << 8) | (localBuf.get() & 0xFFL); + acc = (acc << 8) | (bytes.get(pos++) & 0xFFL); accCount += 8; } int shift = accCount - bitWidth; long value = acc >>> shift; - + acc &= (1L << shift) - 1; accCount -= bitWidth; - + action.accept(value); entriesRead++; return true; diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/readers/FCDReader.java b/src/main/java/com/ebremer/beakgraph/hdf5/readers/FCDReader.java index 447946b5..e25bb3fb 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/readers/FCDReader.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/readers/FCDReader.java @@ -2,23 +2,24 @@ import com.ebremer.beakgraph.core.lib.VByte; import com.ebremer.beakgraph.hdf5.BitPackedUnSignedLongBuffer; +import com.ebremer.beakgraph.io.DatasetBytes; +import com.ebremer.beakgraph.io.RandomAccessBytes; import com.ebremer.beakgraph.utils.StringUtils; import io.jhdf.api.Group; import io.jhdf.api.dataset.ContiguousDataset; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; import java.nio.charset.StandardCharsets; /** * Reader for a front-coded string dictionary. *

    - * Safe for concurrent reads: it never mutates the shared {@code stringbuffer}'s position - * (every read is absolute, threaded through a local cursor), and the Zstd decompressor - - * which airlift does not allow sharing across threads - is held per thread. + * Safe for concurrent reads: it never shares mutable position state (every read + * is absolute through {@link RandomAccessBytes}, with long offsets - so string + * buffers past 2 GiB are addressable), and the Zstd decompressor - which + * airlift does not allow sharing across threads - is held per thread. */ public class FCDReader { - private final ByteBuffer buffer; - private final ByteBuffer offsets; + private final RandomAccessBytes buffer; + private final RandomAccessBytes offsets; private final BitPackedUnSignedLongBuffer compressed; private final long blockSize; private final long numEntries; @@ -29,10 +30,10 @@ public FCDReader(Group strings) { ContiguousDataset stringbuffer = (ContiguousDataset) strings.getChild("stringbuffer"); ContiguousDataset off = (ContiguousDataset) strings.getChild("offsets"); ContiguousDataset xcompressed = (ContiguousDataset) strings.getChild("compressed"); - this.buffer = stringbuffer.getBuffer(); - this.offsets = off.getBuffer().order(ByteOrder.BIG_ENDIAN); - this.compressed = new BitPackedUnSignedLongBuffer( - null, xcompressed.getBuffer(), + this.buffer = DatasetBytes.of(stringbuffer); + this.offsets = DatasetBytes.of(off); + this.compressed = BitPackedUnSignedLongBuffer.readView( + DatasetBytes.of(xcompressed), (long) xcompressed.getAttribute("numEntries").getData(), (int) xcompressed.getAttribute("width").getData() ); @@ -42,18 +43,18 @@ public FCDReader(Group strings) { } /** A decoded fragment plus the absolute position just past it. */ - private record Fragment(String value, int nextPos) {} + private record Fragment(String value, long nextPos) {} /** * Reads the length-prefixed fragment that starts at absolute byte position {@code pos}. - * Uses absolute reads only, so it does not disturb the shared buffer's position. + * Absolute reads only, so concurrent readers never disturb each other. */ - private Fragment readFragment(int pos, int entryIndex) { + private Fragment readFragment(long pos, long entryIndex) { VByte.DecodeResult lenR = VByte.decodeAt(buffer, pos); int dataLen = (int) lenR.value; - int p = lenR.nextOffset; + long p = lenR.nextOffset; byte[] data = new byte[dataLen]; - buffer.get(p, data); // absolute bulk read; does not move the buffer position + buffer.get(p, data, 0, dataLen); // absolute bulk read p += dataLen; boolean isCompressed = compressed.get(entryIndex) == 1; String value = isCompressed ? su.get().decompress(data) : new String(data, StandardCharsets.UTF_8); @@ -64,10 +65,10 @@ public String get(long n) { if (n < 0 || n >= numEntries) throw new IndexOutOfBoundsException(); long block = n / blockSize; - int pos = (int) offsets.getLong((int) block * 8); + long pos = offsets.getLong(block * 8L); // The first string in the block is always at index (block * blockSize). - Fragment frag = readFragment(pos, (int) (block * blockSize)); + Fragment frag = readFragment(pos, block * blockSize); String current = frag.value(); pos = frag.nextPos(); @@ -77,7 +78,7 @@ public String get(long n) { int prefixLen = (int) pl.value; pos = pl.nextOffset; // Suffix fragment is at index (block * blockSize + i). - Fragment suffix = readFragment(pos, (int) (block * blockSize + i)); + Fragment suffix = readFragment(pos, block * blockSize + i); current = current.substring(0, prefixLen) + suffix.value(); pos = suffix.nextPos(); } diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/readers/IndexReader.java b/src/main/java/com/ebremer/beakgraph/hdf5/readers/IndexReader.java index e34bd4c8..ffe00527 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/readers/IndexReader.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/readers/IndexReader.java @@ -3,6 +3,7 @@ import com.ebremer.beakgraph.Params; import com.ebremer.beakgraph.hdf5.BitPackedUnSignedLongBuffer; import com.ebremer.beakgraph.hdf5.Index; +import com.ebremer.beakgraph.io.DatasetBytes; import com.ebremer.beakgraph.utils.HDTBitmapDirectory; import io.jhdf.api.Group; import io.jhdf.api.dataset.ContiguousDataset; @@ -57,7 +58,7 @@ private BitPackedUnSignedLongBuffer loadBuffer(Group index, String name) { if (ds == null) return null; long num = (Long) ds.getAttribute("numEntries").getData(); int width = (Integer) ds.getAttribute("width").getData(); - return new BitPackedUnSignedLongBuffer(null, ds.getBuffer(), num, width); + return BitPackedUnSignedLongBuffer.readView(DatasetBytes.of(ds), num, width); } public HDTBitmapDirectory getDirectory(char component) { diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/readers/MultiTypeDictionaryReader.java b/src/main/java/com/ebremer/beakgraph/hdf5/readers/MultiTypeDictionaryReader.java index 7ede81f8..e11fab58 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/readers/MultiTypeDictionaryReader.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/readers/MultiTypeDictionaryReader.java @@ -4,10 +4,10 @@ import com.ebremer.beakgraph.core.lib.DataType; import com.ebremer.beakgraph.core.lib.NodeComparator; import com.ebremer.beakgraph.hdf5.BitPackedUnSignedLongBuffer; +import com.ebremer.beakgraph.io.DatasetBytes; +import com.ebremer.beakgraph.io.RandomAccessBytes; import io.jhdf.api.Group; import io.jhdf.api.dataset.ContiguousDataset; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; import java.util.Arrays; import java.util.Optional; import java.util.stream.LongStream; @@ -25,8 +25,8 @@ public class MultiTypeDictionaryReader extends AbstractDictionary { private final BitPackedUnSignedLongBuffer longs; private final BitPackedUnSignedLongBuffer datatype; private final BitPackedUnSignedLongBuffer typedLiterals; - private final ByteBuffer floats; - private final ByteBuffer doubles; + private final RandomAccessBytes floats; + private final RandomAccessBytes doubles; private final FCDReader iri; private final FCDReader strings; private final FCDReader typedLiteralsDictionary; @@ -52,22 +52,22 @@ public MultiTypeDictionaryReader(Group d) { this.name = d.getName(); ContiguousDataset offsetsDS = (ContiguousDataset) d.getDatasetByPath("offsets"); this.numEntries = (Long) offsetsDS.getAttribute("numEntries").getData(); - this.offsets = new BitPackedUnSignedLongBuffer(null, offsetsDS.getBuffer(), numEntries, (Integer) offsetsDS.getAttribute("width").getData()); + this.offsets = BitPackedUnSignedLongBuffer.readView(DatasetBytes.of(offsetsDS), numEntries, (Integer) offsetsDS.getAttribute("width").getData()); ContiguousDataset datatypeDS = (ContiguousDataset) d.getDatasetByPath("datatypes"); - this.datatype = new BitPackedUnSignedLongBuffer(null, datatypeDS.getBuffer(), (Long) datatypeDS.getAttribute("numEntries").getData(), (Integer) datatypeDS.getAttribute("width").getData()); + this.datatype = BitPackedUnSignedLongBuffer.readView(DatasetBytes.of(datatypeDS), (Long) datatypeDS.getAttribute("numEntries").getData(), (Integer) datatypeDS.getAttribute("width").getData()); ContiguousDataset typedLiteralsDS = (ContiguousDataset) d.getChild("typedLiterals"); - this.typedLiterals = (typedLiteralsDS != null) ? new BitPackedUnSignedLongBuffer(null, typedLiteralsDS.getBuffer(), (Long) typedLiteralsDS.getAttribute("numEntries").getData(), (Integer) typedLiteralsDS.getAttribute("width").getData()) : null; + this.typedLiterals = (typedLiteralsDS != null) ? BitPackedUnSignedLongBuffer.readView(DatasetBytes.of(typedLiteralsDS), (Long) typedLiteralsDS.getAttribute("numEntries").getData(), (Integer) typedLiteralsDS.getAttribute("width").getData()) : null; - this.doubles = getDataSet(d, "doubles").map(ds -> ds.getBuffer().order(ByteOrder.BIG_ENDIAN)).orElse(null); - this.floats = getDataSet(d, "floats").map(ds -> ds.getBuffer().order(ByteOrder.BIG_ENDIAN)).orElse(null); + this.doubles = getDataSet(d, "doubles").map(DatasetBytes::of).orElse(null); + this.floats = getDataSet(d, "floats").map(DatasetBytes::of).orElse(null); this.integers = getDataSet(d, "integers").map(ds -> - new BitPackedUnSignedLongBuffer(null, ds.getBuffer(), (Long) ds.getAttribute("numEntries").getData(), (Integer) ds.getAttribute("width").getData())).orElse(null); + BitPackedUnSignedLongBuffer.readView(DatasetBytes.of(ds), (Long) ds.getAttribute("numEntries").getData(), (Integer) ds.getAttribute("width").getData())).orElse(null); this.longs = getDataSet(d, "longs").map(ds -> - new BitPackedUnSignedLongBuffer(null, ds.getBuffer(), (Long) ds.getAttribute("numEntries").getData(), (Integer) ds.getAttribute("width").getData())).orElse(null); + BitPackedUnSignedLongBuffer.readView(DatasetBytes.of(ds), (Long) ds.getAttribute("numEntries").getData(), (Integer) ds.getAttribute("width").getData())).orElse(null); Group stringsG = (Group) d.getChild("strings"); this.strings = (stringsG != null) ? new FCDReader(stringsG) : null; @@ -81,7 +81,7 @@ public MultiTypeDictionaryReader(Group d) { Group langsG = (Group) d.getChild("langs"); this.langs = (langsG != null) ? new FCDReader(langsG) : null; ContiguousDataset langTagsDS = (ContiguousDataset) d.getChild("langTags"); - this.langTags = (langTagsDS != null) ? new BitPackedUnSignedLongBuffer(null, langTagsDS.getBuffer(), (Long) langTagsDS.getAttribute("numEntries").getData(), (Integer) langTagsDS.getAttribute("width").getData()) : null; + this.langTags = (langTagsDS != null) ? BitPackedUnSignedLongBuffer.readView(DatasetBytes.of(langTagsDS), (Long) langTagsDS.getAttribute("numEntries").getData(), (Integer) langTagsDS.getAttribute("width").getData()) : null; } private TieredIndex tieredIndex() { @@ -130,8 +130,8 @@ public Node extract(long id) { Node na = switch (dt) { case INTEGER -> NodeFactory.createLiteralByValue((int) integers.get(off)); case LONG -> NodeFactory.createLiteralByValue(longs.get(off)); - case FLOAT -> NodeFactory.createLiteralByValue(floats.getFloat(Math.toIntExact(off * Float.BYTES))); - case DOUBLE -> NodeFactory.createLiteralByValue(doubles.getDouble(Math.toIntExact(off * Double.BYTES))); + case FLOAT -> NodeFactory.createLiteralByValue(floats.getFloat(off * Float.BYTES)); + case DOUBLE -> NodeFactory.createLiteralByValue(doubles.getDouble(off * Double.BYTES)); case STRING -> { // A language tag takes precedence: rdf:langString is reconstructed // as a lang-tagged literal (term-exact per RDF semantics). diff --git a/src/main/java/com/ebremer/beakgraph/hdf5/readers/PositionalDictionaryReader.java b/src/main/java/com/ebremer/beakgraph/hdf5/readers/PositionalDictionaryReader.java index 21fc6a30..2599d286 100644 --- a/src/main/java/com/ebremer/beakgraph/hdf5/readers/PositionalDictionaryReader.java +++ b/src/main/java/com/ebremer/beakgraph/hdf5/readers/PositionalDictionaryReader.java @@ -3,6 +3,7 @@ import com.ebremer.beakgraph.core.GSPODictionary; import com.ebremer.beakgraph.core.Dictionary; import com.ebremer.beakgraph.hdf5.BitPackedUnSignedLongBuffer; +import com.ebremer.beakgraph.io.DatasetBytes; import io.jhdf.api.Group; import io.jhdf.api.dataset.ContiguousDataset; import java.util.Optional; @@ -38,11 +39,11 @@ public PositionalDictionaryReader(Group dictionary) { this.maxEntityId = (entities != null) ? entities.getNumberOfNodes() : 0; this.graphs = getDataSet(dictionary, "graphs").map(ds -> - new BitPackedUnSignedLongBuffer(null, ds.getBuffer(), (Long) ds.getAttribute("numEntries").getData(), (Integer) ds.getAttribute("width").getData())).orElse(null); + BitPackedUnSignedLongBuffer.readView(DatasetBytes.of(ds), (Long) ds.getAttribute("numEntries").getData(), (Integer) ds.getAttribute("width").getData())).orElse(null); this.subjects = getDataSet(dictionary, "subjects").map(ds -> - new BitPackedUnSignedLongBuffer(null, ds.getBuffer(), (Long) ds.getAttribute("numEntries").getData(), (Integer) ds.getAttribute("width").getData())).orElse(null); + BitPackedUnSignedLongBuffer.readView(DatasetBytes.of(ds), (Long) ds.getAttribute("numEntries").getData(), (Integer) ds.getAttribute("width").getData())).orElse(null); this.objects = getDataSet(dictionary, "objects").map(ds -> - new BitPackedUnSignedLongBuffer(null, ds.getBuffer(), (Long) ds.getAttribute("numEntries").getData(), (Integer) ds.getAttribute("width").getData())).orElse(null); + BitPackedUnSignedLongBuffer.readView(DatasetBytes.of(ds), (Long) ds.getAttribute("numEntries").getData(), (Integer) ds.getAttribute("width").getData())).orElse(null); this.objectsDict = makeObjectsDictionary(); } diff --git a/src/main/java/com/ebremer/beakgraph/huge/ExternalSorter.java b/src/main/java/com/ebremer/beakgraph/huge/ExternalSorter.java new file mode 100644 index 00000000..829bd96e --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/ExternalSorter.java @@ -0,0 +1,254 @@ +package com.ebremer.beakgraph.huge; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.DataInput; +import java.io.DataInputStream; +import java.io.DataOutput; +import java.io.DataOutputStream; +import java.io.EOFException; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.PriorityQueue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * External merge sort over records of type {@code T}: records are buffered in + * RAM, sorted and spilled as runs to temp files when the buffer fills, and the + * runs are k-way merged (multi-level when there are more runs than the fan-in) + * into one sorted stream. This is what lets the huge writer sort node and quad + * populations far larger than the heap - the RAM writer's + * {@code Arrays.parallelSort} over all quads is the size ceiling this removes. + * + *

    Single-consumer: {@link #sorted()} may be called once. Duplicate records + * are preserved (callers dedup while streaming, exactly like the RAM writers + * dedup after sorting). + * + * @author Erich Bremer + */ +final class ExternalSorter implements AutoCloseable { + + private static final Logger logger = LoggerFactory.getLogger(ExternalSorter.class); + + /** Serializes records for spill runs. {@code read} throws {@link EOFException} at run end. */ + interface Codec { + void write(DataOutput out, T record) throws IOException; + + T read(DataInput in) throws IOException; + } + + /** A sorted record stream that owns temp files; must be closed. */ + interface SortedStream extends Iterator, AutoCloseable { + @Override + void close(); + } + + private final Path workDir; + private final String tag; + private final Codec codec; + private final Comparator comparator; + private final int maxRecordsInMemory; + private final int mergeFanIn; + private ArrayList buffer = new ArrayList<>(); + private final List runs = new ArrayList<>(); + private long size = 0; + private int runCounter = 0; + private boolean consumed = false; + + ExternalSorter(Path workDir, String tag, Codec codec, Comparator comparator, + int maxRecordsInMemory, int mergeFanIn) { + if (maxRecordsInMemory < 1 || mergeFanIn < 2) { + throw new IllegalArgumentException("maxRecordsInMemory >= 1 and mergeFanIn >= 2 required"); + } + this.workDir = workDir; + this.tag = tag; + this.codec = codec; + this.comparator = comparator; + this.maxRecordsInMemory = maxRecordsInMemory; + this.mergeFanIn = mergeFanIn; + } + + void add(T record) throws IOException { + if (consumed) { + throw new IllegalStateException("Sorter '" + tag + "' already consumed"); + } + buffer.add(record); + size++; + if (buffer.size() >= maxRecordsInMemory) { + spillRun(); + } + } + + /** Total records added. */ + long size() { + return size; + } + + @SuppressWarnings("unchecked") + private T[] sortedBufferArray() { + Object[] arr = buffer.toArray(); + // parallelSort: the comparator (NodeComparator for term records) is the + // dominant cost of a run; use the cores exactly like the RAM writer does. + Arrays.parallelSort(arr, (Comparator) comparator); + return (T[]) arr; + } + + private void spillRun() throws IOException { + if (buffer.isEmpty()) return; + T[] arr = sortedBufferArray(); + Path run = workDir.resolve(tag + ".run" + (runCounter++)); + try (DataOutputStream out = new DataOutputStream( + new BufferedOutputStream(Files.newOutputStream(run), 1 << 16))) { + for (T rec : arr) { + codec.write(out, rec); + } + } + runs.add(run); + logger.debug("Sorter '{}': spilled run {} ({} records)", tag, run.getFileName(), arr.length); + buffer = new ArrayList<>(); + } + + /** + * Finishes ingestion and returns the fully sorted stream. All-in-RAM inputs + * (no spilled run) sort and iterate without touching disk. + */ + SortedStream sorted() throws IOException { + if (consumed) { + throw new IllegalStateException("Sorter '" + tag + "' already consumed"); + } + consumed = true; + if (runs.isEmpty()) { + T[] arr = sortedBufferArray(); + buffer = new ArrayList<>(); + Iterator it = Arrays.asList(arr).iterator(); + return new SortedStream() { + @Override public boolean hasNext() { return it.hasNext(); } + @Override public T next() { return it.next(); } + @Override public void close() {} + }; + } + spillRun(); + // Multi-level merge: collapse groups of fan-in runs until one merge pass + // can stream them all. + while (runs.size() > mergeFanIn) { + List group = new ArrayList<>(runs.subList(0, mergeFanIn)); + runs.subList(0, mergeFanIn).clear(); + Path merged = workDir.resolve(tag + ".run" + (runCounter++)); + logger.debug("Sorter '{}': intermediate merge of {} runs", tag, group.size()); + try (MergeIterator mergeIt = new MergeIterator(group); + DataOutputStream out = new DataOutputStream( + new BufferedOutputStream(Files.newOutputStream(merged), 1 << 16))) { + while (mergeIt.hasNext()) { + codec.write(out, mergeIt.next()); + } + } + runs.add(merged); + } + List finalRuns = new ArrayList<>(runs); + runs.clear(); + return new MergeIterator(finalRuns); + } + + @Override + public void close() { + buffer = new ArrayList<>(); + for (Path run : runs) { + try { + Files.deleteIfExists(run); + } catch (IOException e) { + logger.warn("Failed to delete spill run {}", run, e); + } + } + runs.clear(); + } + + private final class RunReader { + final Path path; + final DataInputStream in; + T head; + + RunReader(Path path) throws IOException { + this.path = path; + this.in = new DataInputStream(new BufferedInputStream(Files.newInputStream(path), 1 << 16)); + } + + /** Loads the next record into {@code head}; false (and cleanup) at run end. */ + boolean advance() throws IOException { + try { + head = codec.read(in); + return true; + } catch (EOFException eof) { + head = null; + closeAndDelete(); + return false; + } + } + + void closeAndDelete() { + try { in.close(); } catch (IOException ignored) {} + try { Files.deleteIfExists(path); } catch (IOException ignored) {} + } + } + + private final class MergeIterator implements SortedStream { + private final PriorityQueue heap; + private final List readers = new ArrayList<>(); + + MergeIterator(List runPaths) throws IOException { + this.heap = new PriorityQueue<>(Math.max(2, runPaths.size()), + (a, b) -> comparator.compare(a.head, b.head)); + try { + for (Path p : runPaths) { + RunReader r = new RunReader(p); + readers.add(r); + if (r.advance()) { + heap.add(r); + } + } + } catch (IOException e) { + close(); + throw e; + } + } + + @Override + public boolean hasNext() { + return !heap.isEmpty(); + } + + @Override + public T next() { + RunReader r = heap.poll(); + if (r == null) { + throw new NoSuchElementException(); + } + T result = r.head; + try { + if (r.advance()) { + heap.add(r); + } + } catch (IOException e) { + close(); + throw new UncheckedIOException("Merge failed for sorter '" + tag + "'", e); + } + return result; + } + + @Override + public void close() { + for (RunReader r : readers) { + r.closeAndDelete(); + } + heap.clear(); + } + } +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/HugeBuildPipeline.java b/src/main/java/com/ebremer/beakgraph/huge/HugeBuildPipeline.java new file mode 100644 index 00000000..5c8bfdc1 --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/HugeBuildPipeline.java @@ -0,0 +1,763 @@ +package com.ebremer.beakgraph.huge; + +import com.ebremer.beakgraph.Params; +import com.ebremer.beakgraph.core.fuseki.BGVoIDSD; +import com.ebremer.beakgraph.core.lib.NodeComparator; +import com.ebremer.beakgraph.core.lib.Stats; +import com.ebremer.beakgraph.hdf5.Index; +import com.ebremer.beakgraph.hdf5.Types; +import com.ebremer.beakgraph.huge.HugeRecords.IdQuad; +import com.ebremer.beakgraph.huge.HugeRecords.RowId; +import com.ebremer.beakgraph.huge.HugeRecords.TermRow; +import static com.ebremer.beakgraph.utils.UTIL.MinBits; +import com.ebremer.ns.GEO; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.nio.file.Path; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.TreeSet; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.zip.GZIPInputStream; +import org.apache.jena.graph.Node; +import org.apache.jena.graph.NodeFactory; +import org.apache.jena.graph.Triple; +import org.apache.jena.irix.IRIx; +import org.apache.jena.riot.Lang; +import org.apache.jena.riot.RDFLanguages; +import org.apache.jena.riot.lang.LabelToNode; +import org.apache.jena.riot.system.AsyncParser; +import org.apache.jena.riot.system.AsyncParserBuilder; +import org.apache.jena.sparql.core.Quad; +import org.apache.jena.vocabulary.RDF; +import org.apache.jena.vocabulary.XSD; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The disk-based BeakGraph build: parse once, spill per-column (term, row) + * records, external-sort them, derive the dictionaries by merge-dedup, assign + * ids by sort-merge join (no random lookups), zip the id columns into encoded + * quads, external-sort those twice for the GSPO/GPOS indexes, and stream every + * buffer into the HDF5 file. RAM stays bounded by the sorter batch sizes plus + * the small in-memory populations (predicates, datatypes, language tags, VoID + * statistics) regardless of quad count. + * + *

    Quad-level transforms (default-graph rewrite, relative-IRI handling, + * numeric canonicalization, spatial/feature augmentation, VoID metadata) mirror + * {@link com.ebremer.beakgraph.hdf5.writers.PositionalDictionaryWriterBuilder}. + * The ONE deliberate divergence: blank nodes are NOT relabelled to + * first-appearance b%020d form (that map is unbounded RAM). Labels only order + * bnodes among themselves - the format stores bnodes by dictionary rank and + * readers regenerate labels from ids - so the output is isomorphic, not + * byte-identical, to the RAM writer's. + * + * @author Erich Bremer + */ +final class HugeBuildPipeline implements AutoCloseable { + + private static final Logger logger = LoggerFactory.getLogger(HugeBuildPipeline.class); + + // Same sentinel base as the RAM builder: relative references resolve against + // it during parsing and are stripped back to relative form for storage. + private static final String REL_BASE = "http://beakgraph.invalid/document"; + private static final String REL_BASE_PREFIX = "http://beakgraph.invalid/"; + private static final IRIx REL_BASE_IRIX = IRIx.create(REL_BASE); + + private final File src; + private final boolean spatial; + private final boolean features; + private final Path workDir; + private final int mergeFanIn; + + // ---- Pass A state ---- + private final Stats stats = new Stats(); + private final TreeSet dataTypes = new TreeSet<>(); + private final TreeSet langSet = new TreeSet<>(); + // Predicates are the one population kept in RAM (real-world predicate counts + // are tiny next to entities/literals); they get temp ids during the parse + // and final rank ids once the set is complete. + private final HashMap predTempIds = new HashMap<>(); + private final ArrayList predByTempId = new ArrayList<>(); + private final BGVoIDSD xvoid = new BGVoIDSD("https://ebremer.com/void/"); + private ExternalSorter gSorter; + private ExternalSorter sSorter; + private ExternalSorter oSorter; + private RecordFile pTempFile; + private final int idSpillBatch; + private long rows = 0; + private long parsedQuads = 0; + + // ---- Build products (owned; released in close()) ---- + private final List resources = new ArrayList<>(); + + HugeBuildPipeline(File src, boolean spatial, boolean features, Path workDir, + int termSpillBatch, int idSpillBatch, int mergeFanIn) { + this.src = src; + this.spatial = spatial; + this.features = features; + this.workDir = workDir; + this.mergeFanIn = mergeFanIn; + this.gSorter = track(new ExternalSorter<>(workDir, "gcol", HugeRecords.TERM_ROW_CODEC, + HugeRecords.TERM_ORDER, termSpillBatch, mergeFanIn)); + this.sSorter = track(new ExternalSorter<>(workDir, "scol", HugeRecords.TERM_ROW_CODEC, + HugeRecords.TERM_ORDER, termSpillBatch, mergeFanIn)); + this.oSorter = track(new ExternalSorter<>(workDir, "ocol", HugeRecords.TERM_ROW_CODEC, + HugeRecords.TERM_ORDER, termSpillBatch, mergeFanIn)); + this.idSpillBatch = idSpillBatch; + } + + private T track(T resource) { + resources.add(resource); + return resource; + } + + /** Runs the whole build, producing the finished HDF5 file at {@code tmpH5}. */ + void run(Path tmpH5) throws IOException { + ingest(); + + // ---- Predicates: final rank ids from the in-RAM population ---- + Node[] sortedPreds = predByTempId.toArray(Node[]::new); + Arrays.parallelSort(sortedPreds, NodeComparator.INSTANCE); + long numPredicates = sortedPreds.length; + long[] tempToFinal = new long[(int) Math.min(Integer.MAX_VALUE, predByTempId.size())]; + { + HashMap finalIds = new HashMap<>(); + for (int i = 0; i < sortedPreds.length; i++) { + finalIds.put(sortedPreds[i], (long) i + 1); // 1-based + } + for (int t = 0; t < predByTempId.size(); t++) { + tempToFinal[t] = finalIds.get(predByTempId.get(t)); + } + } + + // ---- Materialize the sorted columns (each is re-read several times) ---- + logger.info("Sorting {} rows per column (external merge sort)...", rows); + RecordFile gSorted = materialize(gSorter, "gcol.sorted"); + gSorter = null; + RecordFile sSorted = materialize(sSorter, "scol.sorted"); + sSorter = null; + RecordFile oSorted = materialize(oSorter, "ocol.sorted"); + oSorter = null; + + // ---- Distinct sorted dictionaries on disk ---- + RecordFile entFile = new RecordFile<>(workDir.resolve("entities.sorted"), NodeCodec.INSTANCE); + mergeDistinctEntities(entFile, gSorted, sSorted, oSorted); + long numEntities = entFile.count(); + + RecordFile litFile = new RecordFile<>(workDir.resolve("literals.sorted"), NodeCodec.INSTANCE); + distinctLiterals(litFile, oSorted); + long numLiterals = litFile.count(); + long numObjects = numEntities + numLiterals; + logger.info("Dictionary populations: {} entities, {} predicates, {} literals", + numEntities, numPredicates, numLiterals); + + // ---- Encode the three dictionary sections ---- + StreamingDictionaryWriter entitiesDict = null; + StreamingDictionaryWriter predicatesDict = null; + StreamingDictionaryWriter literalsDict = null; + if (numEntities > 0) { + entitiesDict = track(new StreamingDictionaryWriter(workDir, "entities", numEntities, stats, + Set.of(Types.IRI, Types.BNODE), new TreeSet<>(), new TreeSet<>())); + try (var s = entFile.read()) { + entitiesDict.encode(s); + } + } + if (numPredicates > 0) { + predicatesDict = track(new StreamingDictionaryWriter(workDir, "predicates", numPredicates, stats, + Set.of(Types.IRI), new TreeSet<>(), new TreeSet<>())); + predicatesDict.encode(Arrays.asList(sortedPreds).iterator()); + } + if (numLiterals > 0) { + literalsDict = track(new StreamingDictionaryWriter(workDir, "literals", numLiterals, stats, + Set.of(Types.DOUBLE, Types.FLOAT, Types.LONG, Types.INTEGER, Types.STRING), + dataTypes, langSet)); + try (var s = litFile.read()) { + literalsDict.encode(s); + } + } + + // ---- Columnar unique-id lists (same widths as PositionalDictionaryWriter) ---- + int gBits = (int) (Math.ceil(MinBits(numEntities + 1) / 8.0) * 8); + int sBits = (int) (Math.ceil(MinBits(numEntities + 1) / 8.0) * 8); + int oBits = (int) (Math.ceil(MinBits(numObjects + 1) / 8.0) * 8); + SpillBitPackedBuffer graphsList = track(new SpillBitPackedBuffer(workDir.resolve("columnar.graphs"), gBits)); + SpillBitPackedBuffer subjectsList = track(new SpillBitPackedBuffer(workDir.resolve("columnar.subjects"), sBits)); + SpillBitPackedBuffer objectsList = track(new SpillBitPackedBuffer(workDir.resolve("columnar.objects"), oBits)); + + // ---- Sort-merge id joins ---- + logger.info("Assigning ids (sort-merge joins)..."); + ExternalSorter gIds = track(new ExternalSorter<>(workDir, "gid", HugeRecords.ROW_ID_CODEC, + HugeRecords.ROW_ORDER, idSpillBatch, mergeFanIn)); + joinColumn(gSorted, "Graph", entityCursor(entFile, null, numEntities), graphsList, gIds); + gSorted.delete(); + + ExternalSorter sIds = track(new ExternalSorter<>(workDir, "sid", HugeRecords.ROW_ID_CODEC, + HugeRecords.ROW_ORDER, idSpillBatch, mergeFanIn)); + joinColumn(sSorted, "Subject", entityCursor(entFile, null, numEntities), subjectsList, sIds); + sSorted.delete(); + + ExternalSorter oIds = track(new ExternalSorter<>(workDir, "oid", HugeRecords.ROW_ID_CODEC, + HugeRecords.ROW_ORDER, idSpillBatch, mergeFanIn)); + joinColumn(oSorted, "Object", entityCursor(entFile, litFile, numEntities), objectsList, oIds); + oSorted.delete(); + entFile.delete(); + litFile.delete(); + + // ---- Predicate column: temp ids -> final ids, already in row order ---- + RecordFile pFinal = new RecordFile<>(workDir.resolve("pcol.final"), HugeRecords.VAR_LONG_CODEC); + try (var s = pTempFile.read()) { + while (s.hasNext()) { + pFinal.append(tempToFinal[Math.toIntExact(s.next())]); + } + } + pFinal.finish(); + pTempFile.delete(); + if (pFinal.count() != rows) { + throw new IllegalStateException("Predicate column has " + pFinal.count() + " entries for " + rows + " rows"); + } + + // ---- Zip id columns into encoded quads, feeding both index sorters ---- + logger.info("Encoding {} quads...", rows); + ExternalSorter gspoSorter = track(new ExternalSorter<>(workDir, "gspo", HugeRecords.ID_QUAD_CODEC, + HugeRecords.GSPO_ORDER, idSpillBatch, mergeFanIn)); + ExternalSorter gposSorter = track(new ExternalSorter<>(workDir, "gpos", HugeRecords.ID_QUAD_CODEC, + HugeRecords.GPOS_ORDER, idSpillBatch, mergeFanIn)); + try (var gs = gIds.sorted(); var ss = sIds.sorted(); var os = oIds.sorted(); var ps = pFinal.read()) { + for (long row = 0; row < rows; row++) { + RowId g = gs.next(); + RowId s = ss.next(); + RowId o = os.next(); + long p = ps.next(); + if (g.row() != row || s.row() != row || o.row() != row) { + throw new IllegalStateException("Row misalignment at " + row + ": g=" + g.row() + + " s=" + s.row() + " o=" + o.row()); + } + IdQuad q = new IdQuad(g.id(), s.id(), p, o.id()); + gspoSorter.add(q); + gposSorter.add(q); + } + } + pFinal.delete(); + + // ---- Indexes ---- + HugeIndexWriter gspo = track(new HugeIndexWriter(workDir, Index.GSPO, + numEntities, numEntities, numPredicates, numObjects, rows)); + try (var it = gspoSorter.sorted()) { + gspo.build(it); + } + HugeIndexWriter gpos = track(new HugeIndexWriter(workDir, Index.GPOS, + numEntities, numEntities, numPredicates, numObjects, rows)); + try (var it = gposSorter.sorted()) { + gpos.build(it); + } + + // ---- Assemble the HDF5 file (same names/attributes as HDF5Writer) ---- + logger.info("Writing HDF5 file {}", tmpH5); + try (StreamingHdf5File hdf = StreamingHdf5.create(tmpH5)) { + StreamingHdf5Group hdt = hdf.rootGroup().putGroup(Params.BG); + hdt.putAttribute("numQuads", parsedQuads); + hdt.putAttribute("formatVersion", Params.FORMAT_VERSION); + StreamingHdf5Group dictionary = hdt.putGroup(Params.DICTIONARY); + if (entitiesDict != null) entitiesDict.transferTo(dictionary); + if (predicatesDict != null) predicatesDict.transferTo(dictionary); + if (literalsDict != null) literalsDict.transferTo(dictionary); + if (graphsList.getNumEntries() > 0) { + graphsList.transferTo(dictionary, "graphs"); + subjectsList.transferTo(dictionary, "subjects"); + objectsList.transferTo(dictionary, "objects"); + } + gspo.transferTo(hdt); + gpos.transferTo(hdt); + } + logger.info("HDF5 assembly complete"); + } + + // ------------------------------------------------------------------ + // Pass A: parse + transforms + spills + // ------------------------------------------------------------------ + + private void ingest() throws IOException { + logger.info("Parsing {} (disk-based build)", src); + this.pTempFile = new RecordFile<>(workDir.resolve("pcol.tmpids"), HugeRecords.VAR_LONG_CODEC); + try (InputStream xis = src.toString().endsWith(".gz") + ? new GZIPInputStream(new FileInputStream(src)) + : new FileInputStream(src)) { + String fname = src.getName(); + if (fname.endsWith(".gz")) { + fname = fname.substring(0, fname.length() - 3); + } + Lang lang = RDFLanguages.filenameToLang(fname, Lang.TURTLE); + AsyncParserBuilder parserBuilder = AsyncParser.of(xis, lang, REL_BASE); + parserBuilder.mutateSources(rdfBuilder -> + rdfBuilder.labelToNode(LabelToNode.createUseLabelAsGiven())); + SpatialAugmenter augmenter = new SpatialAugmenter(features); + // Spatial tasks run concurrently exactly like the RAM writer, but the + // completion window is BOUNDED: results are drained and spilled as + // soon as the window fills instead of accumulating until end of parse. + final int maxInFlight = Math.max(8, Runtime.getRuntime().availableProcessors() * 4); + final ArrayDeque>> inFlight = new ArrayDeque<>(); + try (ExecutorService scope = Executors.newVirtualThreadPerTaskExecutor()) { + parserBuilder.streamQuads() + .map(quad -> quad.isDefaultGraph() + ? new Quad(Quad.defaultGraphIRI, quad.getSubject(), quad.getPredicate(), quad.getObject()) + : quad) + .map(this::relativize) + .map(this::canonicalizeNumericObject) + .forEach(quad -> { + parsedQuads++; + if (parsedQuads % 1_000_000 == 0) { + logger.info("Loaded {} quads...", parsedQuads); + } + try { + acceptRow(quad); + xvoid.add(quad); + if (spatial && isGeoLiteral(quad)) { + inFlight.add(scope.submit(() -> augmenter.addSpatial(quad))); + while (inFlight.size() >= maxInFlight) { + drainOne(inFlight); + } + } + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + }); + while (!inFlight.isEmpty()) { + drainOne(inFlight); + } + } catch (UncheckedIOException ex) { + throw new IOException("Failed while parsing/processing RDF source: " + src, ex.getCause()); + } catch (Exception ex) { + throw new IOException("Failed while parsing/processing RDF source: " + src, ex); + } + // VoID/SD metadata quads (mirrors the RAM writer; the model's + // namespace prefixes are presentation-only and irrelevant to quads). + for (Iterator it = xvoid.getModel().listStatements(); it.hasNext(); ) { + Triple ff = it.next().asTriple(); + Quad qqq = canonicalizeNumericObject(Quad.create(Params.BGVOID, ff)); + acceptRow(qqq); + } + } + pTempFile.finish(); + logger.info("Parse complete: {} source quads, {} total rows", parsedQuads, rows); + } + + private void drainOne(ArrayDeque>> inFlight) throws IOException { + Future> task = inFlight.poll(); + if (task == null) return; + ArrayList extraQuads; + try { + extraQuads = task.get(); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + throw new IOException("Interrupted while collecting spatial results: " + src, ex); + } catch (ExecutionException ex) { + throw new IOException("Spatial processing failed for " + src, ex.getCause()); + } + for (Quad q : extraQuads) { + acceptRow(canonicalizeNumericObject(q)); + } + } + + /** One row of the store: spill each column and account stats (mirrors ProcessQuad). */ + private void acceptRow(Quad quad) throws IOException { + Node g = quad.getGraph(); + Node s = quad.getSubject(); + Node p = quad.getPredicate(); + Node o = quad.getObject(); + countEntityKind(g, "graph"); + countEntityKind(s, "subject"); + if (o.isLiteral()) { + collectLiteralStats(o); + } else { + countEntityKind(o, "object"); + } + stats.numIRI++; // the predicate (RAM counts distinct; only >0 gates buffer allocation) + + long row = rows++; + gSorter.add(new TermRow(g, row)); + sSorter.add(new TermRow(s, row)); + oSorter.add(new TermRow(o, row)); + pTempFile.append(predTempIds.computeIfAbsent(p, k -> { + predByTempId.add(k); + return (long) (predByTempId.size() - 1); + })); + } + + private void countEntityKind(Node n, String position) { + if (n.isBlank()) { + stats.numBlankNodes++; + } else if (n.isURI()) { + stats.numIRI++; + } else { + // Same guard as ProcessQuad: an unstorable node kind aborts the build. + throw new IllegalStateException("Unexpected " + position + " node type: " + n); + } + } + + /** + * Literal stats accounting, mirroring ProcessQuad's branches. RAM counts + * distinct literals; per-occurrence counting yields identical min/max and + * identical zero-ness of every count, which is all the dictionary widths + * and buffer-allocation gates consume. + */ + private void collectLiteralStats(Node o) { + String dt = o.getLiteralDatatypeURI(); + dataTypes.add(dt); + String lang = o.getLiteralLanguage(); + if (lang != null && !lang.isEmpty()) { + langSet.add(lang); + } + if (dt.equals(XSD.xlong.getURI())) { + if (literalValueOrNull(o) instanceof Number n) { + stats.maxLong = Math.max(stats.maxLong, n.longValue()); + stats.minLong = Math.min(stats.minLong, n.longValue()); + stats.numLong++; + } else { + countStringStored(o.getLiteralLexicalForm()); + } + } else if (dt.equals(XSD.xint.getURI())) { + if (literalValueOrNull(o) instanceof Number n) { + stats.maxInteger = Math.max(stats.maxInteger, n.intValue()); + stats.minInteger = Math.min(stats.minInteger, n.intValue()); + stats.numInteger++; + } else { + countStringStored(o.getLiteralLexicalForm()); + } + } else if (dt.equals(XSD.xfloat.getURI())) { + if (literalValueOrNull(o) instanceof Number n) { + stats.maxFloat = Math.max(stats.maxFloat, n.floatValue()); + stats.minFloat = Math.min(stats.minFloat, n.floatValue()); + stats.numFloat++; + } else { + countStringStored(o.getLiteralLexicalForm()); + } + } else if (dt.equals(XSD.xdouble.getURI())) { + if (literalValueOrNull(o) instanceof Number n) { + stats.maxDouble = Math.max(stats.maxDouble, n.doubleValue()); + stats.minDouble = Math.min(stats.minDouble, n.doubleValue()); + stats.numDouble++; + } else { + countStringStored(o.getLiteralLexicalForm()); + } + } else if (dt.equals(XSD.xstring.getURI()) || dt.equals(GEO.wktLiteral.getURI()) + || dt.equals(XSD.xboolean.getURI()) || dt.equals(RDF.langString.getURI())) { + countStringStored(o.getLiteralLexicalForm()); + } else if (dt.equals(XSD.dateTime.getURI())) { + String lex = o.getLiteralLexicalForm(); + int t = lex.indexOf('T'); + countStringStored((t > 0) ? lex.substring(0, t) : lex); + } else { + countStringStored(o.getLiteralLexicalForm()); + } + } + + private void countStringStored(String lex) { + stats.longestStringLength = Math.max(stats.longestStringLength, lex.length()); + stats.shortestStringLength = Math.min(stats.shortestStringLength, lex.length()); + stats.numStrings++; + } + + private static Object literalValueOrNull(Node o) { + try { + return o.getLiteralValue(); + } catch (RuntimeException e) { + return null; + } + } + + private static boolean isGeoLiteral(Quad quad) { + return SpatialAugmenter.isGeoLiteral(quad); + } + + // ------------------------------------------------------------------ + // Quad transforms (mirrors of PositionalDictionaryWriterBuilder) + // ------------------------------------------------------------------ + + private Quad relativize(Quad q) { + Node qg = q.getGraph(); + Node qs = q.getSubject(); + Node qp = q.getPredicate(); + Node qo = q.getObject(); + Node g = relativizeNode(qg); + Node s = relativizeNode(qs); + Node p = relativizeNode(qp); + Node o = relativizeNode(qo); + if (g == qg && s == qs && p == qp && o == qo) { + return q; + } + return new Quad(g, s, p, o); + } + + private Node relativizeNode(Node n) { + if (n == null || !n.isURI() || !n.getURI().startsWith(REL_BASE_PREFIX)) { + return n; + } + String u = n.getURI(); + try { + IRIx rel = REL_BASE_IRIX.relativize(IRIx.create(u)); + if (rel != null && rel.isRelative()) { + return NodeFactory.createURI(rel.str()); + } + } catch (RuntimeException ignore) { + // fall through to textual stripping + } + return NodeFactory.createURI( + u.equals(REL_BASE) ? "" : u.substring(REL_BASE_PREFIX.length())); + } + + private Quad canonicalizeNumericObject(Quad quad) { + Node o = quad.getObject(); + if (!o.isLiteral()) return quad; + String dt = o.getLiteralDatatypeURI(); + try { + Node canonical = null; + if (XSD.xint.getURI().equals(dt)) { + if (o.getLiteralValue() instanceof Number n) canonical = NodeFactory.createLiteralByValue(n.intValue()); + } else if (XSD.xlong.getURI().equals(dt)) { + if (o.getLiteralValue() instanceof Number n) canonical = NodeFactory.createLiteralByValue(n.longValue()); + } else if (XSD.xfloat.getURI().equals(dt)) { + if (o.getLiteralValue() instanceof Number n) canonical = NodeFactory.createLiteralByValue(n.floatValue()); + } else if (XSD.xdouble.getURI().equals(dt)) { + if (o.getLiteralValue() instanceof Number n) canonical = NodeFactory.createLiteralByValue(n.doubleValue()); + } + if (canonical == null || canonical.equals(o)) return quad; + return new Quad(quad.getGraph(), quad.getSubject(), quad.getPredicate(), canonical); + } catch (RuntimeException e) { + return quad; + } + } + + // ------------------------------------------------------------------ + // Phase helpers + // ------------------------------------------------------------------ + + private RecordFile materialize(ExternalSorter sorter, String name) throws IOException { + RecordFile rf = new RecordFile<>(workDir.resolve(name), HugeRecords.TERM_ROW_CODEC); + try (ExternalSorter.SortedStream s = sorter.sorted()) { + while (s.hasNext()) { + rf.append(s.next()); + } + } + rf.finish(); + sorter.close(); + return rf; + } + + /** + * Entities = distinct {G union S union non-literal O} in NodeComparator + * order: a 3-way merge of the sorted columns with consecutive-dedup. The + * object stream stops at its first literal - NodeComparator's macro order + * (bnode < URI < literal) makes literals a contiguous suffix. + */ + private void mergeDistinctEntities(RecordFile out, RecordFile g, + RecordFile s, RecordFile o) throws IOException { + try (var gs = g.read(); var ss = s.read(); var os = o.read()) { + List> streams = List.of( + termsOf(gs), termsOf(ss), nonLiteralPrefix(termsOf(os))); + PriorityQueue heap = new PriorityQueue<>( + Comparator.comparing(pi -> pi.head, NodeComparator.INSTANCE)); + for (Iterator it : streams) { + PeekedIterator pi = new PeekedIterator(it); + if (pi.head != null) heap.add(pi); + } + Node last = null; + while (!heap.isEmpty()) { + PeekedIterator pi = heap.poll(); + Node term = pi.head; + if (pi.advance()) heap.add(pi); + // equals() is the cheap equivalent of compare()==0 here: the + // comparator tie-breaks on the exact RDF term, so it returns 0 + // only for term-equal nodes. + if (last == null || !last.equals(term)) { + out.append(term); + last = term; + } + } + } + out.finish(); + } + + /** Distinct literals = dedup of the literal suffix of the sorted object column. */ + private void distinctLiterals(RecordFile out, RecordFile o) throws IOException { + try (var os = o.read()) { + Node last = null; + while (os.hasNext()) { + Node term = os.next().term(); + if (!term.isLiteral()) continue; // pre-literal prefix + if (last == null || !last.equals(term)) { + out.append(term); + last = term; + } + } + } + out.finish(); + } + + private static Iterator termsOf(Iterator rows) { + return new Iterator<>() { + @Override public boolean hasNext() { return rows.hasNext(); } + @Override public Node next() { return rows.next().term(); } + }; + } + + private static Iterator nonLiteralPrefix(Iterator in) { + return new Iterator<>() { + private Node next = advance(); + + private Node advance() { + if (in.hasNext()) { + Node n = in.next(); + // Sorted stream: the first literal ends the entity prefix. + return n.isLiteral() ? null : n; + } + return null; + } + + @Override public boolean hasNext() { return next != null; } + + @Override public Node next() { + if (next == null) throw new NoSuchElementException(); + Node n = next; + next = advance(); + return n; + } + }; + } + + private static final class PeekedIterator { + private final Iterator it; + Node head; + + PeekedIterator(Iterator it) { + this.it = it; + advance(); + } + + /** Loads the next head; false at stream end. */ + final boolean advance() { + head = it.hasNext() ? it.next() : null; + return head != null; + } + } + + /** + * A monotone cursor over the sorted dictionary (entities, optionally + * followed by literals): the id of a term is its 1-based rank in the + * concatenated stream - exactly locateGraph/locateSubject/locateObject + * semantics, computed without random access. + */ + private DictCursor entityCursor(RecordFile entities, RecordFile literals, long numEntities) + throws IOException { + var entStream = entities.read(); + var litStream = (literals == null) ? null : literals.read(); + Iterator concat = new Iterator<>() { + @Override + public boolean hasNext() { + return entStream.hasNext() || (litStream != null && litStream.hasNext()); + } + + @Override + public Node next() { + return entStream.hasNext() ? entStream.next() : litStream.next(); + } + }; + return new DictCursor(concat, () -> { + entStream.close(); + if (litStream != null) litStream.close(); + }); + } + + private static final class DictCursor implements AutoCloseable { + private final Iterator stream; + private final Runnable onClose; + private Node current = null; + private long id = 0; + + DictCursor(Iterator stream, Runnable onClose) { + this.stream = stream; + this.onClose = onClose; + } + + /** 1-based id of {@code term}; the cursor only moves forward. */ + long locate(Node term, String role) { + // Cheap term-equality fast path before any comparator work. + if (current != null && current.equals(term)) { + return id; + } + while (current == null || NodeComparator.INSTANCE.compare(current, term) < 0) { + if (!stream.hasNext()) { + throw new IllegalStateException("Cannot resolve " + role + " (not in dictionary): " + term); + } + current = stream.next(); + id++; + if (current.equals(term)) { + return id; + } + } + if (!current.equals(term)) { + throw new IllegalStateException("Cannot resolve " + role + " (not in dictionary): " + term); + } + return id; + } + + @Override + public void close() { + onClose.run(); + } + } + + /** + * Walks a sorted column against the dictionary cursor, emitting (row, id) + * for every row and the id of each DISTINCT term - in term order, i.e. + * ascending id order - into the columnar list. + */ + private void joinColumn(RecordFile column, String role, DictCursor cursor, + SpillBitPackedBuffer columnar, ExternalSorter out) throws IOException { + try (cursor; var col = column.read()) { + Node prevTerm = null; + long prevId = -1; + while (col.hasNext()) { + TermRow tr = col.next(); + long id; + // equals() suffices for the repeat check (compare()==0 iff term-equal). + if (prevTerm != null && prevTerm.equals(tr.term())) { + id = prevId; + } else { + id = cursor.locate(tr.term(), role); + columnar.writeLong(id); + prevTerm = tr.term(); + prevId = id; + } + out.add(new RowId(tr.row(), id)); + } + } + } + + @Override + public void close() { + if (pTempFile != null) pTempFile.delete(); + for (AutoCloseable r : resources) { + try { + r.close(); + } catch (Exception e) { + logger.warn("Cleanup failure", e); + } + } + resources.clear(); + } +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/HugeHDF5Writer.java b/src/main/java/com/ebremer/beakgraph/huge/HugeHDF5Writer.java new file mode 100644 index 00000000..30201611 --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/HugeHDF5Writer.java @@ -0,0 +1,165 @@ +package com.ebremer.beakgraph.huge; + +import com.ebremer.beakgraph.Params; +import com.ebremer.beakgraph.core.AbstractGraphBuilder; +import com.ebremer.beakgraph.core.BeakGraphWriter; +import java.io.IOException; +import java.nio.file.AtomicMoveNotSupportedException; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.StandardCopyOption; +import java.nio.file.attribute.BasicFileAttributes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Disk-based BeakGraph writer for very large graphs. Produces the same HDF5 + * format as {@link com.ebremer.beakgraph.hdf5.writers.HDF5Writer} (readable by + * the existing {@code HDF5Reader}), but sorts and indexes on disk: quads are + * spilled to a temp workspace, dictionaries are derived by external merge sort, + * ids are assigned by sort-merge joins, and every dataset streams into the file + * through the {@link StreamingHdf5} backend. Peak heap stays bounded by the + * configured spill batch sizes; the size ceiling moves from RAM to free disk in + * the workspace (roughly a few times the source size, transiently). + * + *

    Usage mirrors HDF5Writer: + *

    {@code
    + * HugeHDF5Writer.Builder()
    + *     .setSource(new File("data.nq.gz"))
    + *     .setDestination(new File("data.h5"))
    + *     .setSpatial(true)
    + *     .build()
    + *     .write();
    + * }
    + * + *

    Output is semantically identical to the RAM writer's (same dictionaries, + * indexes, VoID metadata, spatial augmentation); the only divergence is blank + * node ordering (labels are kept as parsed rather than relabelled), which + * yields an isomorphic - not byte-identical - store. + * + * @author Erich Bremer + */ +public class HugeHDF5Writer implements BeakGraphWriter { + + private static final Logger logger = LoggerFactory.getLogger(HugeHDF5Writer.class); + + private final Builder builder; + + private HugeHDF5Writer(Builder builder) { + this.builder = builder; + } + + @Override + public void write() throws IOException { + logger.info("Writing BeakGraph (huge/disk-based) to {}", builder.getDestination()); + Path dest = builder.getDestination().toPath(); + // Same publish discipline as HDF5Writer: build into a sibling temp file, + // swap in atomically on success, never disturb a previous good artifact. + Path tmp = dest.resolveSibling(dest.getFileName() + ".tmp"); + Path workBase = (builder.workDir != null) ? builder.workDir + : (dest.toAbsolutePath().getParent() != null ? dest.toAbsolutePath().getParent() : Path.of(".")); + Path workspace = Files.createTempDirectory(workBase, ".bghuge-"); + try { + try (HugeBuildPipeline pipeline = new HugeBuildPipeline( + builder.getSource(), builder.getSpatial(), builder.getFeatures(), + workspace, builder.termSpillBatch, builder.idSpillBatch, builder.mergeFanIn)) { + pipeline.run(tmp); + } + try { + Files.move(tmp, dest, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); + } catch (AtomicMoveNotSupportedException e) { + Files.move(tmp, dest, StandardCopyOption.REPLACE_EXISTING); + } + } catch (IOException | RuntimeException ex) { + try { + Files.deleteIfExists(tmp); + } catch (IOException cleanup) { + logger.warn("Failed to remove temp output {}", tmp, cleanup); + } + throw ex; + } finally { + deleteRecursively(workspace); + } + logger.info("Write complete: {}", builder.getDestination()); + } + + private static void deleteRecursively(Path dir) { + try { + Files.walkFileTree(dir, new SimpleFileVisitor<>() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.deleteIfExists(file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path d, IOException exc) throws IOException { + Files.deleteIfExists(d); + return FileVisitResult.CONTINUE; + } + }); + } catch (IOException e) { + logger.warn("Failed to remove workspace {}", dir, e); + } + } + + public static class Builder extends AbstractGraphBuilder { + + private Path workDir; + private int termSpillBatch = 1 << 18; // 262144 (term, row) records per column before a run spills + private int idSpillBatch = 1 << 21; // 2M numeric records per run for the id/quad sorts + private int mergeFanIn = 64; + + /** + * Directory for the build workspace (spill runs, staged buffers). + * Defaults to the destination's directory - the workspace transiently + * needs disk on the order of a few times the (uncompressed) source. + */ + public Builder setWorkDirectory(Path dir) { + this.workDir = dir; + return this; + } + + /** Records buffered in RAM per term column before spilling a sorted run. */ + public Builder setTermSpillBatch(int records) { + if (records < 1) throw new IllegalArgumentException("termSpillBatch must be >= 1"); + this.termSpillBatch = records; + return this; + } + + /** Records buffered in RAM per numeric (id/quad) sorter before spilling. */ + public Builder setIdSpillBatch(int records) { + if (records < 1) throw new IllegalArgumentException("idSpillBatch must be >= 1"); + this.idSpillBatch = records; + return this; + } + + /** Maximum spill runs merged in one pass. */ + public Builder setMergeFanIn(int fanIn) { + if (fanIn < 2) throw new IllegalArgumentException("mergeFanIn must be >= 2"); + this.mergeFanIn = fanIn; + return this; + } + + @Override + protected Builder self() { + return this; + } + + @Override + public String getName() { + return Params.BG; + } + + @Override + public HugeHDF5Writer build() { + return new HugeHDF5Writer(this); + } + } + + public static Builder Builder() { + return new Builder(); + } +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/HugeIO.java b/src/main/java/com/ebremer/beakgraph/huge/HugeIO.java new file mode 100644 index 00000000..a62e20f8 --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/HugeIO.java @@ -0,0 +1,73 @@ +package com.ebremer.beakgraph.huge; + +import java.io.BufferedInputStream; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; + +/** + * Small shared I/O helpers for the huge writer: temp-file-to-dataset streaming + * and unsigned varint coding for the spill record formats. + * + * @author Erich Bremer + */ +final class HugeIO { + + /** Copy buffer for temp-file-to-HDF5 streaming; bounds writer RAM per transfer. */ + static final int TRANSFER_BUFFER_BYTES = 8 * 1024 * 1024; + + private HugeIO() {} + + /** Streams an entire temp file into an already-created dataset. */ + static void copyFileIntoDataset(Path file, StreamingHdf5Dataset ds) throws IOException { + try (InputStream in = new BufferedInputStream(Files.newInputStream(file), 1 << 20)) { + byte[] buf = new byte[TRANSFER_BUFFER_BYTES]; + int n; + while ((n = in.read(buf)) > 0) { + ds.write(buf, 0, n); + } + } + } + + /** Unsigned LEB128-style varint (7 bits per byte, high bit = continuation). */ + static void writeVarLong(DataOutput out, long value) throws IOException { + if (value < 0) { + throw new IllegalArgumentException("varint value must be non-negative: " + value); + } + while ((value & ~0x7FL) != 0) { + out.writeByte((int) ((value & 0x7F) | 0x80)); + value >>>= 7; + } + out.writeByte((int) value); + } + + static long readVarLong(DataInput in) throws IOException { + long result = 0; + int shift = 0; + while (true) { + byte b = in.readByte(); + result |= (long) (b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + if (shift >= 64) { + throw new IOException("Malformed varint (too long)"); + } + } + } + + /** + * Reads exactly {@code len} bytes or throws {@link EOFException}; DataInput's + * readFully equivalent, factored for symmetry with the writers here. + */ + static byte[] readBytes(DataInput in, int len) throws IOException { + byte[] data = new byte[len]; + in.readFully(data); + return data; + } +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/HugeIndexWriter.java b/src/main/java/com/ebremer/beakgraph/huge/HugeIndexWriter.java new file mode 100644 index 00000000..00b3242d --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/HugeIndexWriter.java @@ -0,0 +1,264 @@ +package com.ebremer.beakgraph.huge; + +import static com.ebremer.beakgraph.Params.BLOCKSIZE; +import static com.ebremer.beakgraph.Params.SUPERBLOCKSIZE; +import com.ebremer.beakgraph.hdf5.Index; +import com.ebremer.beakgraph.huge.HugeRecords.IdQuad; +import static com.ebremer.beakgraph.utils.UTIL.MinBits; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Iterator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Streaming twin of {@link com.ebremer.beakgraph.hdf5.writers.BGIndex}: builds + * one quad index (GSPO or GPOS) - S/B id+bitmap levels plus the SB/BB + * rank/select directory - from an externally sorted stream of + * dictionary-encoded quads. Because dictionary ids are rank-assigned in + * {@code NodeComparator} order, numeric id order equals the term order BGIndex + * sorts with, and this writer's output is identical to BGIndex's for the same + * data. The level/padding/dedup logic mirrors BGIndex line for line; keep the + * two in lockstep. + * + * @author Erich Bremer + */ +final class HugeIndexWriter implements AutoCloseable { + + private static final Logger logger = LoggerFactory.getLogger(HugeIndexWriter.class); + + private final SpillBitPackedBuffer B1, B2, B3; + private final SpillBitPackedBuffer S1, S2, S3; + private final SpillBitPackedBuffer SB1, SB2, SB3; + private final SpillBitPackedBuffer BB1, BB2, BB3; + private final Index type; + private final char[] positions; + private final String[] names; + private final long numGraphs, numSubjects, numPredicates, numObjects; + + private static final class LevelState { + long bitsProcessed = 0; + long onesSoFar = 0; + long onesInCurrentSuperblock = 0; + // Same seeding as BGIndex: start at 0, paired with the seeded BB[0]=0, + // so BB[k] = ones-before-block-k within its superblock. + long lastSuperblockWritten = 0; + long lastBlockWritten = 0; + } + + /** + * @param totalRows total encoded quads INCLUDING duplicates - BGIndex sizes + * the superblock width from the full pre-dedup quad array + */ + HugeIndexWriter(Path workDir, Index type, long numGraphs, long numSubjects, + long numPredicates, long numObjects, long totalRows) throws IOException { + logger.info("Creating index {} (disk-backed)", type); + this.type = type; + this.numGraphs = numGraphs; + this.numSubjects = numSubjects; + this.numPredicates = numPredicates; + this.numObjects = numObjects; + String indexName = type.name(); + this.positions = new char[]{indexName.charAt(0), indexName.charAt(1), indexName.charAt(2), indexName.charAt(3)}; + this.names = new String[4]; + for (int i = 0; i < 4; i++) { + names[i] = String.valueOf(Character.toLowerCase(positions[i])); + } + + Path dir = Files.createDirectories(workDir.resolve("index." + indexName)); + + long maxCumulativeOnes = totalRows + maxL0Id() + 128L; + int sbBits = MinBits(maxCumulativeOnes); + sbBits = (int) (Math.ceil(sbBits / 8.0) * 8); + int bbBits = MinBits(SUPERBLOCKSIZE); + bbBits = (int) (Math.ceil(bbBits / 8.0) * 8); + + B1 = new SpillBitPackedBuffer(dir.resolve("B" + names[1]), 1); + B2 = new SpillBitPackedBuffer(dir.resolve("B" + names[2]), 1); + B3 = new SpillBitPackedBuffer(dir.resolve("B" + names[3]), 1); + + S1 = new SpillBitPackedBuffer(dir.resolve("S" + names[1]), bitSize(positions[1])); + S2 = new SpillBitPackedBuffer(dir.resolve("S" + names[2]), bitSize(positions[2])); + S3 = new SpillBitPackedBuffer(dir.resolve("S" + names[3]), bitSize(positions[3])); + + SB1 = new SpillBitPackedBuffer(dir.resolve("SB" + names[1]), sbBits); + SB2 = new SpillBitPackedBuffer(dir.resolve("SB" + names[2]), sbBits); + SB3 = new SpillBitPackedBuffer(dir.resolve("SB" + names[3]), sbBits); + + BB1 = new SpillBitPackedBuffer(dir.resolve("BB" + names[1]), bbBits); + BB2 = new SpillBitPackedBuffer(dir.resolve("BB" + names[2]), bbBits); + BB3 = new SpillBitPackedBuffer(dir.resolve("BB" + names[3]), bbBits); + + // Seed the "ones before the first superblock/block" directory entries to 0. + SB1.writeLong(0); SB2.writeLong(0); SB3.writeLong(0); + BB1.writeLong(0); BB2.writeLong(0); BB3.writeLong(0); + } + + private long count(char component) { + return switch (component) { + case 'G' -> numGraphs; + case 'S' -> numSubjects; + case 'P' -> numPredicates; + case 'O' -> numObjects; + default -> throw new IllegalStateException("Unknown component: " + component); + }; + } + + /** Mirror of BGIndex.IndexPosition.getBitSize: byte-rounded MinBits(count+1), 0 -> 8. */ + private int bitSize(char component) { + int needed = MinBits(count(component) + 1); + if (needed == 0) return 8; + return (int) (Math.ceil(needed / 8.0) * 8); + } + + private long maxL0Id() { + return count(positions[0]); + } + + private static long component(IdQuad q, char c) { + return switch (c) { + case 'G' -> q.g(); + case 'S' -> q.s(); + case 'P' -> q.p(); + case 'O' -> q.o(); + default -> throw new IllegalStateException(); + }; + } + + /** Consumes the id-quads, which MUST be sorted in this index's order. */ + void build(Iterator sorted) throws IOException { + LevelState l1 = new LevelState(), l2 = new LevelState(), l3 = new LevelState(); + IdQuad lastUnique = null; + long count = 0; + long maxL0Id = maxL0Id(); + long currentL0 = 1; + + while (sorted.hasNext()) { + IdQuad curr = sorted.next(); + if (++count % 1_000_000 == 0) { + logger.info("{} processed {} quads...", type.name(), count); + } + // 1. Duplicate check (numeric id equality == term equality) + if (lastUnique != null + && component(lastUnique, positions[0]) == component(curr, positions[0]) + && component(lastUnique, positions[1]) == component(curr, positions[1]) + && component(lastUnique, positions[2]) == component(curr, positions[2]) + && component(lastUnique, positions[3]) == component(curr, positions[3])) { + continue; + } + + boolean changeL0 = (lastUnique == null) || component(lastUnique, positions[0]) != component(curr, positions[0]); + boolean changeL1 = (lastUnique == null) || changeL0 || component(lastUnique, positions[1]) != component(curr, positions[1]); + boolean changeL2 = (lastUnique == null) || changeL1 || component(lastUnique, positions[2]) != component(curr, positions[2]); + + long thisL0 = component(curr, positions[0]); + + // 2. Pad missing L0 ids with empty lists (see BGIndex) + if (changeL0) { + long skipped = (lastUnique == null) ? (thisL0 - 1) : (thisL0 - currentL0 - 1); + padEmptyL0(skipped, l1, l2, l3); + currentL0 = thisL0; + } + + // 3. Level 3 + S3.writeLong(component(curr, positions[3])); + int bit3 = changeL2 ? 1 : 0; + B3.writeInteger(bit3); + advanceLevel(l3, bit3, SB3, BB3); + + // 4. Level 2 + if (changeL2) { + S2.writeLong(component(curr, positions[2])); + int bit2 = changeL1 ? 1 : 0; + B2.writeInteger(bit2); + advanceLevel(l2, bit2, SB2, BB2); + } + + // 5. Level 1 + if (changeL1) { + S1.writeLong(component(curr, positions[1])); + int bit1 = changeL0 ? 1 : 0; + B1.writeInteger(bit1); + advanceLevel(l1, bit1, SB1, BB1); + } + + lastUnique = curr; + } + + // Pad remaining ids up to the dictionary's maximum + long skipped = maxL0Id - currentL0; + padEmptyL0(skipped, l1, l2, l3); + + completeAll(); + } + + private void padEmptyL0(long count, LevelState l1, LevelState l2, LevelState l3) { + for (long k = 0; k < count; k++) { + S1.writeLong(0); + B1.writeInteger(1); + advanceLevel(l1, 1, SB1, BB1); + + S2.writeLong(0); + B2.writeInteger(1); + advanceLevel(l2, 1, SB2, BB2); + + S3.writeLong(0); + B3.writeInteger(1); + advanceLevel(l3, 1, SB3, BB3); + } + } + + private void advanceLevel(LevelState state, int bitValue, SpillBitPackedBuffer SB, SpillBitPackedBuffer BB) { + if (bitValue == 1) { + state.onesSoFar++; + state.onesInCurrentSuperblock++; + } + state.bitsProcessed++; + + long currentSuperblock = state.bitsProcessed / SUPERBLOCKSIZE; + if (currentSuperblock != state.lastSuperblockWritten) { + SB.writeLong(state.onesSoFar); + state.lastSuperblockWritten = currentSuperblock; + state.onesInCurrentSuperblock = 0; + } + + long currentBlock = state.bitsProcessed / BLOCKSIZE; + if (currentBlock != state.lastBlockWritten) { + BB.writeLong(state.onesInCurrentSuperblock); + state.lastBlockWritten = currentBlock; + } + } + + private void completeAll() throws IOException { + B1.complete(); B2.complete(); B3.complete(); + S1.complete(); S2.complete(); S3.complete(); + SB1.complete(); SB2.complete(); SB3.complete(); + BB1.complete(); BB2.complete(); BB3.complete(); + } + + /** Writes the index group, mirroring BGIndex.add() (names and order). */ + void transferTo(StreamingHdf5Group hdt) throws IOException { + StreamingHdf5Group index = hdt.putGroup(type.name()); + S1.transferTo(index, "S" + names[1]); + S2.transferTo(index, "S" + names[2]); + S3.transferTo(index, "S" + names[3]); + B1.transferTo(index, "B" + names[1]); + B2.transferTo(index, "B" + names[2]); + B3.transferTo(index, "B" + names[3]); + SB1.transferTo(index, "SB" + names[1]); + SB2.transferTo(index, "SB" + names[2]); + SB3.transferTo(index, "SB" + names[3]); + BB1.transferTo(index, "BB" + names[1]); + BB2.transferTo(index, "BB" + names[2]); + BB3.transferTo(index, "BB" + names[3]); + } + + @Override + public void close() throws IOException { + B1.close(); B2.close(); B3.close(); + S1.close(); S2.close(); S3.close(); + SB1.close(); SB2.close(); SB3.close(); + BB1.close(); BB2.close(); BB3.close(); + } +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/HugeRecords.java b/src/main/java/com/ebremer/beakgraph/huge/HugeRecords.java new file mode 100644 index 00000000..8dc09473 --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/HugeRecords.java @@ -0,0 +1,114 @@ +package com.ebremer.beakgraph.huge; + +import com.ebremer.beakgraph.core.lib.NodeComparator; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.util.Comparator; +import org.apache.jena.graph.Node; + +/** + * Record types flowing through the huge writer's spill files, with their + * codecs and orderings. + * + *

    {@code TermRow} carries one quad component (a term) plus the row number of + * its quad; sorted by term it drives both dictionary construction (dedup) and + * the sort-merge id join. {@code RowId} is the join output (row -> id), sorted + * back into row order. {@code IdQuad} is a fully dictionary-encoded quad; its + * two orderings are exactly the {@link com.ebremer.beakgraph.hdf5.Index} + * comparators, because dictionary ids are rank-assigned from the same + * {@link NodeComparator} order the RAM writer sorts quads with - numeric id + * order and term order agree component-wise. + * + * @author Erich Bremer + */ +final class HugeRecords { + + private HugeRecords() {} + + record TermRow(Node term, long row) {} + + record RowId(long row, long id) {} + + record IdQuad(long g, long s, long p, long o) {} + + /** Term order only; equal terms may interleave rows arbitrarily (the join maps them to one id). */ + static final Comparator TERM_ORDER = + (a, b) -> NodeComparator.INSTANCE.compare(a.term(), b.term()); + + static final Comparator ROW_ORDER = Comparator.comparingLong(RowId::row); + + static final Comparator GSPO_ORDER = Comparator + .comparingLong(IdQuad::g) + .thenComparingLong(IdQuad::s) + .thenComparingLong(IdQuad::p) + .thenComparingLong(IdQuad::o); + + static final Comparator GPOS_ORDER = Comparator + .comparingLong(IdQuad::g) + .thenComparingLong(IdQuad::p) + .thenComparingLong(IdQuad::o) + .thenComparingLong(IdQuad::s); + + static final ExternalSorter.Codec TERM_ROW_CODEC = new ExternalSorter.Codec<>() { + @Override + public void write(DataOutput out, TermRow record) throws IOException { + NodeCodec.writeNode(out, record.term()); + HugeIO.writeVarLong(out, record.row()); + } + + @Override + public TermRow read(DataInput in) throws IOException { + Node term = NodeCodec.readNode(in); + long row = HugeIO.readVarLong(in); + return new TermRow(term, row); + } + }; + + static final ExternalSorter.Codec ROW_ID_CODEC = new ExternalSorter.Codec<>() { + @Override + public void write(DataOutput out, RowId record) throws IOException { + HugeIO.writeVarLong(out, record.row()); + HugeIO.writeVarLong(out, record.id()); + } + + @Override + public RowId read(DataInput in) throws IOException { + long row = HugeIO.readVarLong(in); + long id = HugeIO.readVarLong(in); + return new RowId(row, id); + } + }; + + /** Bare non-negative longs (the per-row predicate temp/final id files). */ + static final ExternalSorter.Codec VAR_LONG_CODEC = new ExternalSorter.Codec<>() { + @Override + public void write(DataOutput out, Long record) throws IOException { + HugeIO.writeVarLong(out, record); + } + + @Override + public Long read(DataInput in) throws IOException { + return HugeIO.readVarLong(in); + } + }; + + static final ExternalSorter.Codec ID_QUAD_CODEC = new ExternalSorter.Codec<>() { + @Override + public void write(DataOutput out, IdQuad record) throws IOException { + HugeIO.writeVarLong(out, record.g()); + HugeIO.writeVarLong(out, record.s()); + HugeIO.writeVarLong(out, record.p()); + HugeIO.writeVarLong(out, record.o()); + } + + @Override + public IdQuad read(DataInput in) throws IOException { + long g = HugeIO.readVarLong(in); + long s = HugeIO.readVarLong(in); + long p = HugeIO.readVarLong(in); + long o = HugeIO.readVarLong(in); + return new IdQuad(g, s, p, o); + } + }; +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/NativeHdf5File.java b/src/main/java/com/ebremer/beakgraph/huge/NativeHdf5File.java new file mode 100644 index 00000000..74360caa --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/NativeHdf5File.java @@ -0,0 +1,282 @@ +package com.ebremer.beakgraph.huge; + +import hdf.hdf5lib.H5; +import hdf.hdf5lib.HDF5Constants; +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.Deque; + +/** + * {@link StreamingHdf5File} backed by the HDF Group's native HDF5 library + * (https://github.com/HDFGroup/hdf5) through the official {@code hdf.hdf5lib} + * Java API. This is the only backend that can write a dataset piecewise today; + * jHDF's writer needs the whole dataset in memory. + * + *

    This class is written against the official {@code hdf.hdf5lib.H5} API and + * is binding-agnostic: which jar supplies that API is a build-time choice (the + * {@code hdf5-backend-*} profiles in the POM). The default is the JavaCPP + * preset ({@code org.bytedeco:hdf5-platform}), which bundles the classes AND + * the native library for the common platforms - nothing to install. Building + * with {@code -Dhdf5.ffm} swaps in the HDF Group's own + * {@code org.hdfgroup:hdf5-java-ffm} bindings (HDF5 2.1.x, Java 25 FFM, no + * JNI), which come from GitHub Packages (authenticated) and require a system + * HDF5 install; see the profile comments in pom.xml. The two provide identical + * class names, so they are mutually exclusive on the classpath - this is a + * dependency swap, not a runtime switch. + * + *

    Reader compatibility (see {@link StreamingHdf5File}): datasets are created + * with a fixed 1-D dataspace and the library-default CONTIGUOUS layout, then + * filled by sequential hyperslab {@code H5Dwrite} calls; attributes are scalar + * {@code H5T_STD_I32LE} / {@code H5T_STD_I64LE}. jHDF maps these to + * {@code ContiguousDataset} and {@link Integer}/{@link Long} attribute values, + * exactly what the existing BeakGraph readers expect. + * + *

    Not thread-safe; the huge writer drives it from a single thread. + * + * @author Erich Bremer + */ +public final class NativeHdf5File implements StreamingHdf5File { + + private static volatile Throwable unavailableCause; + + private final long fileId; + private final NativeGroup root; + // Every open native handle (groups, datasets) is tracked so close() can + // release them all before H5Fclose even if a caller leaked one. + private final Deque openHandles = new ArrayDeque<>(); + private boolean closed = false; + + private NativeHdf5File(long fileId) { + this.fileId = fileId; + this.root = new NativeGroup(fileId, "/", false); + } + + /** + * True when the native HDF5 library can be loaded on this platform. Tests + * use this to skip rather than fail where no natives exist. + */ + public static boolean isAvailable() { + try { + H5.loadH5Lib(); + H5.H5open(); + return true; + } catch (Throwable t) { + unavailableCause = t; + return false; + } + } + + /** The reason {@link #isAvailable()} answered false, if it did. */ + public static Throwable getUnavailableCause() { + return unavailableCause; + } + + /** Creates a new HDF5 file at {@code path}, truncating any existing file. */ + public static NativeHdf5File create(Path path) throws IOException { + try { + H5.loadH5Lib(); + } catch (Throwable t) { + throw new IOException( + "Native HDF5 library unavailable (needed by the huge writer backend). " + + "Ensure org.bytedeco:hdf5-platform natives are on the classpath for this platform.", t); + } + try { + long fid = H5.H5Fcreate(path.toString(), HDF5Constants.H5F_ACC_TRUNC, + HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); + return new NativeHdf5File(fid); + } catch (Exception e) { + throw new IOException("H5Fcreate failed for " + path, e); + } + } + + @Override + public StreamingHdf5Group rootGroup() { + return root; + } + + @Override + public void close() throws IOException { + if (closed) return; + closed = true; + // Release children before the file: HDF5 keeps a file alive while any + // object handle in it is open, and a leaked handle would strand the file. + while (!openHandles.isEmpty()) { + openHandles.pop().run(); + } + try { + H5.H5Fclose(fileId); + } catch (Exception e) { + throw new IOException("H5Fclose failed", e); + } + } + + private static void quietly(Runnable r) { + try { r.run(); } catch (RuntimeException ignored) {} + } + + /** Scalar int attribute: file type I32LE, so jHDF reads an Integer. */ + private static void writeIntAttribute(long objId, String name, int value) throws IOException { + try { + long space = H5.H5Screate(HDF5Constants.H5S_SCALAR); + try { + long attr = H5.H5Acreate(objId, name, HDF5Constants.H5T_STD_I32LE, space, + HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); + try { + H5.H5Awrite_int(attr, HDF5Constants.H5T_NATIVE_INT, new int[]{value}); + } finally { + H5.H5Aclose(attr); + } + } finally { + H5.H5Sclose(space); + } + } catch (Exception e) { + throw new IOException("Failed to write int attribute '" + name + "'", e); + } + } + + /** Scalar long attribute: file type I64LE, so jHDF reads a Long. */ + private static void writeLongAttribute(long objId, String name, long value) throws IOException { + try { + long space = H5.H5Screate(HDF5Constants.H5S_SCALAR); + try { + long attr = H5.H5Acreate(objId, name, HDF5Constants.H5T_STD_I64LE, space, + HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); + try { + H5.H5Awrite_long(attr, HDF5Constants.H5T_NATIVE_INT64, new long[]{value}); + } finally { + H5.H5Aclose(attr); + } + } finally { + H5.H5Sclose(space); + } + } catch (Exception e) { + throw new IOException("Failed to write long attribute '" + name + "'", e); + } + } + + private final class NativeGroup implements StreamingHdf5Group { + private final long groupId; + private final boolean ownsHandle; + + NativeGroup(long groupId, String name, boolean ownsHandle) { + this.groupId = groupId; + this.ownsHandle = ownsHandle; + } + + @Override + public StreamingHdf5Group putGroup(String name) throws IOException { + try { + long gid = H5.H5Gcreate(groupId, name, HDF5Constants.H5P_DEFAULT, + HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); + NativeGroup g = new NativeGroup(gid, name, true); + openHandles.push(() -> quietly(() -> { + try { H5.H5Gclose(gid); } catch (Exception e) { throw new RuntimeException(e); } + })); + return g; + } catch (Exception e) { + throw new IOException("H5Gcreate failed for group '" + name + "'", e); + } + } + + @Override + public void putAttribute(String name, int value) throws IOException { + writeIntAttribute(groupId, name, value); + } + + @Override + public void putAttribute(String name, long value) throws IOException { + writeLongAttribute(groupId, name, value); + } + + @Override + public StreamingHdf5Dataset createByteDataset(String name, long length) throws IOException { + if (length <= 0) { + // The RAM writer never emits empty datasets (BitPacked/DataOutput + // buffers skip them), and jHDF's getBuffer() cannot map one. + throw new IOException("Refusing to create empty dataset '" + name + "'"); + } + try { + long space = H5.H5Screate_simple(1, new long[]{length}, null); + long dset = H5.H5Dcreate(groupId, name, HDF5Constants.H5T_STD_I8LE, space, + HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); + NativeDataset d = new NativeDataset(dset, space, name, length); + openHandles.push(() -> quietly(d::releaseHandles)); + return d; + } catch (Exception e) { + throw new IOException("H5Dcreate failed for dataset '" + name + "'", e); + } + } + } + + private static final class NativeDataset implements StreamingHdf5Dataset { + private final long datasetId; + private final long fileSpaceId; + private final String name; + private final long length; + private long position = 0; + private boolean released = false; + + NativeDataset(long datasetId, long fileSpaceId, String name, long length) { + this.datasetId = datasetId; + this.fileSpaceId = fileSpaceId; + this.name = name; + this.length = length; + } + + @Override + public void write(byte[] buf, int off, int len) throws IOException { + if (len == 0) return; + if (position + len > length) { + throw new IOException("Dataset '" + name + "' overflow: " + (position + len) + + " > declared length " + length); + } + // H5Dwrite reads elements from the START of the Java array, so a + // non-zero offset needs a compact copy of just the slice. + byte[] data = (off == 0) ? buf : Arrays.copyOfRange(buf, off, off + len); + try { + H5.H5Sselect_hyperslab(fileSpaceId, HDF5Constants.H5S_SELECT_SET, + new long[]{position}, null, new long[]{len}, null); + long memSpace = H5.H5Screate_simple(1, new long[]{len}, null); + try { + H5.H5Dwrite(datasetId, HDF5Constants.H5T_NATIVE_INT8, memSpace, fileSpaceId, + HDF5Constants.H5P_DEFAULT, data); + } finally { + H5.H5Sclose(memSpace); + } + } catch (Exception e) { + throw new IOException("H5Dwrite failed for dataset '" + name + "' at offset " + position, e); + } + position += len; + } + + @Override + public void putAttribute(String name, int value) throws IOException { + writeIntAttribute(datasetId, name, value); + } + + @Override + public void putAttribute(String name, long value) throws IOException { + writeLongAttribute(datasetId, name, value); + } + + @Override + public void close() throws IOException { + if (released) return; + boolean complete = (position == length); + releaseHandles(); + if (!complete) { + throw new IOException("Dataset '" + name + "' closed after " + position + + " of " + length + " bytes - refusing to leave undefined data"); + } + } + + private void releaseHandles() { + if (released) return; + released = true; + try { H5.H5Sclose(fileSpaceId); } catch (Exception ignored) {} + try { H5.H5Dclose(datasetId); } catch (Exception ignored) {} + } + } +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/NodeCodec.java b/src/main/java/com/ebremer/beakgraph/huge/NodeCodec.java new file mode 100644 index 00000000..a7309d8a --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/NodeCodec.java @@ -0,0 +1,105 @@ +package com.ebremer.beakgraph.huge; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import org.apache.jena.datatypes.TypeMapper; +import org.apache.jena.graph.Node; +import org.apache.jena.graph.NodeFactory; + +/** + * Compact, exact round-trip serialization of RDF terms for the spill files. + * Term identity is preserved: URIs and blank node labels verbatim; literals as + * lexical form + datatype URI (or + language tag), reconstructed through the + * same {@code TypeMapper} path the HDF5 readers use, so a deserialized node is + * {@code equals()} to - and {@code NodeComparator}-orders identically to - the + * parsed original. + * + *

    Node kinds the BeakGraph format cannot store (RDF-star triple terms, + * variables) fail loudly here, matching the RAM writer's ProcessQuad guards. + * + * @author Erich Bremer + */ +final class NodeCodec implements ExternalSorter.Codec { + + static final NodeCodec INSTANCE = new NodeCodec(); + + private static final TypeMapper TM = TypeMapper.getInstance(); + private static final byte T_URI = 0; + private static final byte T_BNODE = 1; + private static final byte T_LITERAL_DT = 2; + private static final byte T_LITERAL_LANG = 3; + + private NodeCodec() {} + + @Override + public void write(DataOutput out, Node n) throws IOException { + writeNode(out, n); + } + + @Override + public Node read(DataInput in) throws IOException { + return readNode(in); + } + + static void writeNode(DataOutput out, Node n) throws IOException { + if (n.isURI()) { + out.writeByte(T_URI); + writeString(out, n.getURI()); + } else if (n.isBlank()) { + out.writeByte(T_BNODE); + writeString(out, n.getBlankNodeLabel()); + } else if (n.isLiteral()) { + String lang = n.getLiteralLanguage(); + if (lang != null && !lang.isEmpty()) { + out.writeByte(T_LITERAL_LANG); + writeString(out, n.getLiteralLexicalForm()); + writeString(out, lang); + } else { + out.writeByte(T_LITERAL_DT); + writeString(out, n.getLiteralLexicalForm()); + writeString(out, n.getLiteralDatatypeURI()); + } + } else { + // Same stance as ProcessQuad: a node kind the store cannot represent + // must abort the build, not silently skew it. + throw new IllegalStateException("Unsupported node kind in huge writer spill: " + n); + } + } + + static Node readNode(DataInput in) throws IOException { + byte tag = in.readByte(); + return switch (tag) { + case T_URI -> NodeFactory.createURI(readString(in)); + case T_BNODE -> NodeFactory.createBlankNode(readString(in)); + case T_LITERAL_DT -> { + String lex = readString(in); + String dt = readString(in); + yield NodeFactory.createLiteralDT(lex, TM.getSafeTypeByName(dt)); + } + case T_LITERAL_LANG -> { + String lex = readString(in); + String lang = readString(in); + yield NodeFactory.createLiteralLang(lex, lang); + } + default -> throw new IOException("Corrupt spill record: unknown node tag " + tag); + }; + } + + static void writeString(DataOutput out, String s) throws IOException { + // Explicit varint + UTF-8 bytes: DataOutput.writeUTF caps at 65535 bytes, + // far too small for WKT literals. + byte[] bytes = s.getBytes(StandardCharsets.UTF_8); + HugeIO.writeVarLong(out, bytes.length); + out.write(bytes); + } + + static String readString(DataInput in) throws IOException { + long len = HugeIO.readVarLong(in); + if (len < 0 || len > Integer.MAX_VALUE - 8) { + throw new IOException("Corrupt spill record: string length " + len); + } + return new String(HugeIO.readBytes(in, (int) len), StandardCharsets.UTF_8); + } +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/RecordFile.java b/src/main/java/com/ebremer/beakgraph/huge/RecordFile.java new file mode 100644 index 00000000..8d2f8b8a --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/RecordFile.java @@ -0,0 +1,123 @@ +package com.ebremer.beakgraph.huge; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.EOFException; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.NoSuchElementException; + +/** + * A flat temp file of codec-encoded records that is written once and can be + * streamed any number of times. The huge writer materializes each sorted + * column / dictionary stream this way because several later phases re-read it + * (dedup count, dictionary encode, id join) - an {@link ExternalSorter} stream + * is single-shot. + * + * @author Erich Bremer + */ +final class RecordFile { + + private final Path path; + private final ExternalSorter.Codec codec; + private DataOutputStream out; + private long count = 0; + private boolean finished = false; + + RecordFile(Path path, ExternalSorter.Codec codec) { + this.path = path; + this.codec = codec; + } + + void append(T record) throws IOException { + if (finished) { + throw new IllegalStateException("RecordFile already finished: " + path); + } + if (out == null) { + out = new DataOutputStream(new BufferedOutputStream(Files.newOutputStream(path), 1 << 16)); + } + codec.write(out, record); + count++; + } + + void finish() throws IOException { + if (finished) return; + finished = true; + if (out != null) { + out.close(); + out = null; + } else { + // Zero records: create the empty file so readers see a valid stream. + Files.deleteIfExists(path); + Files.createFile(path); + } + } + + long count() { + return count; + } + + /** A fresh sequential stream over all records; close it when done. */ + ExternalSorter.SortedStream read() throws IOException { + if (!finished) { + throw new IllegalStateException("RecordFile not finished: " + path); + } + DataInputStream in = new DataInputStream( + new BufferedInputStream(Files.newInputStream(path), 1 << 16)); + return new ExternalSorter.SortedStream() { + private T head = advance(); + private boolean closed = false; + + private T advance() { + try { + return codec.read(in); + } catch (EOFException eof) { + closeStream(); + return null; + } catch (IOException e) { + closeStream(); + throw new UncheckedIOException("Failed reading " + path, e); + } + } + + private void closeStream() { + if (!closed) { + closed = true; + try { in.close(); } catch (IOException ignored) {} + } + } + + @Override + public boolean hasNext() { + return head != null; + } + + @Override + public T next() { + if (head == null) throw new NoSuchElementException(); + T result = head; + head = advance(); + return result; + } + + @Override + public void close() { + closeStream(); + } + }; + } + + void delete() { + try { + if (out != null) { + out.close(); + out = null; + } + Files.deleteIfExists(path); + } catch (IOException ignored) {} + } +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/SpatialAugmenter.java b/src/main/java/com/ebremer/beakgraph/huge/SpatialAugmenter.java new file mode 100644 index 00000000..7b847137 --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/SpatialAugmenter.java @@ -0,0 +1,198 @@ +package com.ebremer.beakgraph.huge; + +import com.ebremer.beakgraph.Params; +import com.ebremer.beakgraph.features.MajorMinor; +import com.ebremer.beakgraph.features.pyradiomics.Gen2DFeatures; +import static com.ebremer.beakgraph.hdf5.writers.PositionalDictionaryWriterBuilder.HILBERT_CELL_NS; +import static com.ebremer.beakgraph.hdf5.writers.PositionalDictionaryWriterBuilder.MAX_INDEX_CELLS; +import static com.ebremer.beakgraph.hdf5.writers.PositionalDictionaryWriterBuilder.MAX_INDEX_SCALE; +import com.ebremer.beakgraph.utils.ImageTools; +import com.ebremer.halcyon.hilbert.HilbertSpace; +import com.ebremer.halcyon.hilbert.PolygonScaler; +import com.ebremer.halcyon.hilbert.WKTDatatype; +import com.ebremer.ns.GEO; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import org.apache.jena.graph.Node; +import org.apache.jena.graph.NodeFactory; +import org.apache.jena.sparql.core.Quad; +import org.locationtech.jts.geom.Envelope; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Polygon; +import org.locationtech.jts.geom.Polygonal; +import org.locationtech.jts.io.WKTReader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Spatial index + derived-feature quad generation for the huge writer: a + * faithful port of the spatial half of + * {@link com.ebremer.beakgraph.hdf5.writers.PositionalDictionaryWriterBuilder} + * (addSpatial / addSpatialScales / addSpatialIndexCells / generateGridURNs / + * addFeatures), sharing that class's public tuning constants so the two writers + * index geometry identically. Stateless and thread-safe: instances of the JTS + * readers/factories are created per call, matching the original. + * + * @author Erich Bremer + */ +final class SpatialAugmenter { + + private static final Logger logger = LoggerFactory.getLogger(SpatialAugmenter.class); + + /** hal:asWKT0..14, generated instead of hand-enumerated (same URIs as the RAM writer). */ + private static final Node[] asWKT = new Node[15]; + static { + for (int i = 0; i < asWKT.length; i++) { + asWKT[i] = NodeFactory.createURI("https://halcyon.is/ns/asWKT" + i); + } + } + + private final boolean features; + + SpatialAugmenter(boolean features) { + this.features = features; + } + + static boolean isGeoLiteral(Quad quad) { + Node o = quad.getObject(); + return o.isLiteral() && GEO.wktLiteral.getURI().equals(o.getLiteralDatatypeURI()); + } + + /** + * Generates all derived quads for one geometry-carrying quad. A bad + * geometry never aborts the build - it is logged and skipped, exactly like + * the RAM writer. + */ + ArrayList addSpatial(Quad quad) { + final ArrayList qqq = new ArrayList<>(); + String wkt = ImageTools.stripCrs(quad.getObject().getLiteralLexicalForm()); + if (features) { + try { + addFeatures(qqq, quad, wkt); + } catch (Exception ex) { + logger.warn("Failed to generate features for {}: {}", quad.getSubject(), ex.toString()); + } + } + try { + Geometry g = new WKTReader().read(wkt); + if (g.isEmpty()) { + return qqq; + } + // Index EVERY polygonal part, and every non-areal member via its + // expanded envelope (see the RAM writer for the full rationale). + List parts = new ArrayList<>(ImageTools.wktToPolygons(wkt)); + GeometryFactory gf = new GeometryFactory(); + for (int i = 0; i < g.getNumGeometries(); i++) { + Geometry member = g.getGeometryN(i); + if (!(member instanceof Polygonal) && !member.isEmpty()) { + Envelope env = member.getEnvelopeInternal(); + env.expandBy(0.5); + parts.add((Polygon) gf.toGeometry(env)); + } + } + for (Polygon part : parts) { + addSpatialIndexCells(qqq, quad, part); + addSpatialScales(qqq, quad, wkt, PolygonScaler.toPolygons(part)); + } + } catch (Exception ex) { + logger.warn("Skipping spatial indexing for {}: {} ({})", + quad.getSubject(), ex.toString(), abbrevWkt(wkt)); + } + return qqq; + } + + private void addSpatialScales(ArrayList qqq, Quad quad, String wkt, Polygon[] scales) { + if (scales == null) { + return; + } + final String[] wktScales = PolygonScaler.toWKT(scales); + for (int s = 0; s < Math.min(scales.length, asWKT.length); s++) { + List tiles = generateGridURNs(scales[s], s); + try { + for (int ii = 0; ii < tiles.size(); ii++) { + qqq.add(Quad.create(tiles.get(ii), quad.getSubject(), asWKT[s], + NodeFactory.createLiteralDT(wktScales[s], WKTDatatype.INSTANCE))); + } + } catch (Exception ex) { + logger.error("Failed to add spatial tile quads for {}", abbrevWkt(wkt), ex); + } + try { + qqq.add(Quad.create(Params.SPATIAL, quad.getSubject(), asWKT[s], + NodeFactory.createLiteralDT(wktScales[s], WKTDatatype.INSTANCE))); + } catch (Exception ex) { + logger.error("Failed to add scaled WKT quad for {}", abbrevWkt(wkt), ex); + } + } + } + + private void addSpatialIndexCells(ArrayList qqq, Quad quad, Polygon part) { + Envelope env = part.getEnvelopeInternal(); + long minX = HilbertSpace.clampToDomain((long) Math.floor(env.getMinX())); + long maxX = HilbertSpace.clampToDomain((long) Math.floor(env.getMaxX())); + long minY = HilbertSpace.clampToDomain((long) Math.floor(env.getMinY())); + long maxY = HilbertSpace.clampToDomain((long) Math.floor(env.getMaxY())); + int s = 0; + while (s < MAX_INDEX_SCALE && cellCount(minX, maxX, minY, maxY, s) > MAX_INDEX_CELLS) { + s++; + } + long cell = 1L << s; + Node pred = NodeFactory.createURI(HILBERT_CELL_NS + s); + HashSet cells = new HashSet<>(); + for (long x = Math.floorDiv(minX, cell); x <= Math.floorDiv(maxX, cell); x++) { + for (long y = Math.floorDiv(minY, cell); y <= Math.floorDiv(maxY, cell); y++) { + cells.add(HilbertSpace.hc.index(new long[]{x, y})); + } + } + for (Long c : cells) { + qqq.add(Quad.create(Params.SPATIAL, quad.getSubject(), pred, + NodeFactory.createLiteralByValue((long) c))); + } + } + + private static long cellCount(long minX, long maxX, long minY, long maxY, int s) { + long cell = 1L << s; + long nx = Math.floorDiv(maxX, cell) - Math.floorDiv(minX, cell) + 1; + long ny = Math.floorDiv(maxY, cell) - Math.floorDiv(minY, cell) + 1; + return nx * ny; + } + + private List generateGridURNs(Polygon polygon, int resolutionLevel) { + List intersectingURNs = new ArrayList<>(); + Envelope env = polygon.getEnvelopeInternal(); + double cellSize = Params.GRIDTILESIZE; + long minTileX = (long) Math.floor(env.getMinX() / cellSize); + long maxTileX = (long) Math.floor(env.getMaxX() / cellSize); + long minTileY = (long) Math.floor(env.getMinY() / cellSize); + long maxTileY = (long) Math.floor(env.getMaxY() / cellSize); + GeometryFactory gf = polygon.getFactory(); + for (long x = minTileX; x <= maxTileX; x++) { + double tileMinX = x * cellSize; + double tileMaxX = tileMinX + cellSize; + for (long y = minTileY; y <= maxTileY; y++) { + double tileMinY = y * cellSize; + double tileMaxY = tileMinY + cellSize; + Envelope tileEnv = new Envelope(tileMinX, tileMaxX, tileMinY, tileMaxY); + if (env.intersects(tileEnv)) { + Polygon tilePoly = (Polygon) gf.toGeometry(tileEnv); + if (polygon.intersects(tilePoly)) { + intersectingURNs.add(NodeFactory.createURI( + String.format("urn:x-beakgraph:grid:%d:%d:%d", resolutionLevel, x, y))); + } + } + } + } + return intersectingURNs; + } + + private void addFeatures(ArrayList qqq, Quad quad, String wkt) { + Node geo = quad.getSubject(); + Gen2DFeatures.generate(qqq, geo, wkt); + MajorMinor.add(qqq, geo, wkt); + } + + private static String abbrevWkt(String wkt) { + return (wkt != null && wkt.length() > 200) ? wkt.substring(0, 200) + "..." : wkt; + } +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/SpillBitPackedBuffer.java b/src/main/java/com/ebremer/beakgraph/huge/SpillBitPackedBuffer.java new file mode 100644 index 00000000..cbffc024 --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/SpillBitPackedBuffer.java @@ -0,0 +1,127 @@ +package com.ebremer.beakgraph.huge; + +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; + +/** + * Disk-backed, write-only twin of + * {@link com.ebremer.beakgraph.hdf5.BitPackedUnSignedLongBuffer}: identical + * MSB-first bit packing and identical dataset shape ({@code width} / + * {@code numEntries} attributes), but the packed bytes accumulate in a temp + * file instead of a {@code ByteArrayOutputStream}, so the buffer size is + * bounded by disk, not heap. Values must fit their declared width - the same + * silent-truncation guard as the RAM twin. + * + * @author Erich Bremer + */ +final class SpillBitPackedBuffer implements AutoCloseable { + + private final Path file; + private final OutputStream out; + private final int bitWidth; + private long writeAccumulator = 0L; + private int writeAccumulatorCount = 0; + private long numEntries = 0; + private long bytesWritten = 0; + private boolean completed = false; + + SpillBitPackedBuffer(Path file, int bitWidth) throws IOException { + // Same width envelope as the RAM buffer: the pack accumulator carries a + // value plus a <=7-bit sub-byte offset in one long, so 58..63 are unsafe; + // 64 is byte-aligned and fine. + boolean supported = (bitWidth >= 1 && bitWidth <= 57) || bitWidth == 64; + if (!supported) { + throw new IllegalArgumentException( + "Unsupported bit width: " + bitWidth + ". Supported: 1..57, or 64 (byte-aligned)."); + } + this.file = file; + this.bitWidth = bitWidth; + this.out = new BufferedOutputStream(Files.newOutputStream(file), 1 << 16); + } + + void writeInteger(int value) { + if (bitWidth != 32 && bitWidth != 64 && (value < 0 || value > ((1L << bitWidth) - 1))) { + throw new IllegalArgumentException("Value " + value + " does not fit in " + bitWidth + " bits"); + } + putValue(value & ((bitWidth == 64) ? -1L : (1L << bitWidth) - 1)); + numEntries++; + } + + void writeLong(long value) { + if (bitWidth != 64 && (value < 0 || value > ((1L << bitWidth) - 1))) { + throw new IllegalArgumentException("Value " + value + " does not fit in " + bitWidth + " bits"); + } + putValue(value & ((bitWidth == 64) ? -1L : (1L << bitWidth) - 1)); + numEntries++; + } + + private void putValue(long valToPack) { + if (completed) { + throw new IllegalStateException("Buffer already completed: " + file); + } + writeAccumulator = (writeAccumulator << bitWidth) | valToPack; + writeAccumulatorCount += bitWidth; + try { + while (writeAccumulatorCount >= 8) { + int shift = writeAccumulatorCount - 8; + out.write((byte) (writeAccumulator >>> shift)); + bytesWritten++; + writeAccumulator &= (1L << shift) - 1; + writeAccumulatorCount -= 8; + } + } catch (IOException ex) { + throw new UncheckedIOException("Failed writing spill buffer " + file, ex); + } + } + + /** Flushes the trailing partial byte and closes the temp file for writing. */ + void complete() throws IOException { + if (completed) return; + completed = true; + if (writeAccumulatorCount > 0) { + out.write((byte) (writeAccumulator << (8 - writeAccumulatorCount))); + bytesWritten++; + writeAccumulator = 0; + writeAccumulatorCount = 0; + } + out.close(); + } + + long getNumEntries() { + return numEntries; + } + + int getBitWidth() { + return bitWidth; + } + + /** + * Streams the packed bytes into {@code group} as a dataset named + * {@code name} with the {@code width}/{@code numEntries} attributes, then + * deletes the temp file. Mirrors the RAM buffer's {@code add()}: an empty + * buffer writes no dataset at all. + */ + void transferTo(StreamingHdf5Group group, String name) throws IOException { + complete(); + if (bytesWritten == 0) { + Files.deleteIfExists(file); + return; + } + try (StreamingHdf5Dataset ds = group.createByteDataset(name, bytesWritten)) { + HugeIO.copyFileIntoDataset(file, ds); + ds.putAttribute("width", bitWidth); + ds.putAttribute("numEntries", numEntries); + } + Files.deleteIfExists(file); + } + + @Override + public void close() throws IOException { + complete(); + Files.deleteIfExists(file); + } +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/SpillDataBuffer.java b/src/main/java/com/ebremer/beakgraph/huge/SpillDataBuffer.java new file mode 100644 index 00000000..7290c9db --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/SpillDataBuffer.java @@ -0,0 +1,92 @@ +package com.ebremer.beakgraph.huge; + +import java.io.BufferedOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +/** + * Disk-backed twin of {@link com.ebremer.beakgraph.hdf5.DataOutputBuffer}: + * big-endian primitive stream (via {@link DataOutputStream}, exactly like the + * RAM twin) accumulated in a temp file, transferred to a dataset with the + * {@code numEntries} attribute. + * + * @author Erich Bremer + */ +final class SpillDataBuffer implements AutoCloseable { + + private final Path file; + private final DataOutputStream dos; + private long numEntries = 0; + private long bytesWritten = 0; + private boolean completed = false; + + SpillDataBuffer(Path file) throws IOException { + this.file = file; + this.dos = new DataOutputStream(new BufferedOutputStream(Files.newOutputStream(file), 1 << 16)); + } + + void writeInt(int v) throws IOException { + numEntries++; + bytesWritten += Integer.BYTES; + dos.writeInt(v); + } + + void writeLong(long v) throws IOException { + numEntries++; + bytesWritten += Long.BYTES; + dos.writeLong(v); + } + + void writeFloat(float v) throws IOException { + numEntries++; + bytesWritten += Float.BYTES; + dos.writeFloat(v); + } + + void writeDouble(double v) throws IOException { + numEntries++; + bytesWritten += Double.BYTES; + dos.writeDouble(v); + } + + long getNumEntries() { + return numEntries; + } + + void complete() throws IOException { + if (completed) return; + completed = true; + dos.close(); + } + + /** + * Streams the bytes into a dataset named {@code name} with the + * {@code numEntries} attribute, then deletes the temp file. An empty buffer + * (never produced by the writer for a dataset that is actually added, same + * as the RAM path) is skipped. + */ + void transferTo(StreamingHdf5Group group, String name) throws IOException { + complete(); + if (bytesWritten == 0) { + if (numEntries > 0) { + throw new IllegalStateException( + "CRITICAL ERROR: dataset " + name + " has no bytes but numEntries is " + numEntries); + } + Files.deleteIfExists(file); + return; + } + try (StreamingHdf5Dataset ds = group.createByteDataset(name, bytesWritten)) { + HugeIO.copyFileIntoDataset(file, ds); + ds.putAttribute("numEntries", numEntries); + } + Files.deleteIfExists(file); + } + + @Override + public void close() throws IOException { + complete(); + Files.deleteIfExists(file); + } +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/SpillFCDWriter.java b/src/main/java/com/ebremer/beakgraph/huge/SpillFCDWriter.java new file mode 100644 index 00000000..66f5e4a5 --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/SpillFCDWriter.java @@ -0,0 +1,142 @@ +package com.ebremer.beakgraph.huge; + +import static com.ebremer.beakgraph.Params.COMPRESSION_THRESHOLD; +import com.ebremer.beakgraph.core.lib.VByte; +import com.ebremer.beakgraph.utils.StringUtils; +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; + +/** + * Disk-backed twin of {@link com.ebremer.beakgraph.hdf5.writers.FCDWriter}: the + * same front-coded block format (block heads, VByte prefix lengths, Zstd + * compression above {@code COMPRESSION_THRESHOLD}, surrogate-safe prefixes) and + * the same HDF5 group shape (stringbuffer/offsets/compressed datasets plus + * blockSize/numBlocks/numEntries/compression_threshold attributes), but the + * string buffer grows in a temp file, so dictionary size is bounded by disk. + * + * @author Erich Bremer + */ +final class SpillFCDWriter implements AutoCloseable { + + private final String name; + private final int blockSize; + private int stringsInCurrentBlock = 0; + private String prevString = null; + private final Path stringFile; + private final OutputStream stringOut; + private long numBlocks = 0; + private long numEntries = 0; + private long position = 0; + private final SpillDataBuffer offsets; + private final SpillBitPackedBuffer compressed; + private final StringUtils su = new StringUtils(); + private boolean completed = false; + + SpillFCDWriter(Path workDir, String name, int blockSize) throws IOException { + if (blockSize < 2) { + // Same guard as FCDWriter: blockSize 1 never closes a block and the + // offsets dataset would be unreadable. + throw new IllegalArgumentException("FCD blockSize must be >= 2, got " + blockSize); + } + this.name = name; + this.blockSize = blockSize; + this.stringFile = workDir.resolve(name + ".fcd.strings"); + this.stringOut = new BufferedOutputStream(Files.newOutputStream(stringFile), 1 << 16); + this.offsets = new SpillDataBuffer(workDir.resolve(name + ".fcd.offsets")); + this.compressed = new SpillBitPackedBuffer(workDir.resolve(name + ".fcd.compressed"), 1); + } + + private void writeFragment(byte[] data) throws IOException { + boolean shouldCompress = data.length >= COMPRESSION_THRESHOLD; + byte[] finalData; + if (shouldCompress) { + // Byte-identical to FCDWriter: decode to String, Zstd-compress that. + finalData = su.compress(new String(data, StandardCharsets.UTF_8)); + compressed.writeLong(1); + } else { + finalData = data; + compressed.writeLong(0); + } + position += VByte.encode(stringOut, finalData.length); + stringOut.write(finalData); + position += finalData.length; + } + + void add(String item) throws IOException { + numEntries++; + if (stringsInCurrentBlock == 0) { + offsets.writeLong(position); + writeFragment(item.getBytes(StandardCharsets.UTF_8)); + prevString = item; + stringsInCurrentBlock = 1; + } else { + int prefixLength = commonPrefixLength(prevString, item); + position += VByte.encode(stringOut, prefixLength); + String suffix = item.substring(prefixLength); + writeFragment(suffix.getBytes(StandardCharsets.UTF_8)); + prevString = item; + stringsInCurrentBlock++; + if (stringsInCurrentBlock == blockSize) { + stringsInCurrentBlock = 0; + numBlocks++; + } + } + } + + private int commonPrefixLength(String s1, String s2) { + int minLength = Math.min(s1.length(), s2.length()); + int i = 0; + while (i < minLength && s1.charAt(i) == s2.charAt(i)) i++; + // Never split a UTF-16 surrogate pair (see FCDWriter). + if (i > 0 && Character.isHighSurrogate(s1.charAt(i - 1))) i--; + return i; + } + + long getNumEntries() { + return numEntries; + } + + private void complete() throws IOException { + if (completed) return; + completed = true; + stringOut.close(); + offsets.complete(); + compressed.complete(); + } + + /** + * Writes the whole dictionary as a subgroup named after this writer, + * mirroring {@code FCDWriter.add()} exactly (attribute set, dataset names, + * numBlocks accounting). Temp files are deleted afterwards. + */ + void transferTo(StreamingHdf5Group parent) throws IOException { + complete(); + StreamingHdf5Group strings = parent.putGroup(name); + strings.putAttribute("blockSize", blockSize); + long validBlocks = (stringsInCurrentBlock == 0 && numEntries > 0) ? numBlocks : numBlocks + 1; + strings.putAttribute("numBlocks", (numEntries == 0) ? 0 : validBlocks); + strings.putAttribute("numEntries", numEntries); + strings.putAttribute("compression_threshold", COMPRESSION_THRESHOLD); + long size = Files.size(stringFile); + if (size > 0) { + try (StreamingHdf5Dataset ds = strings.createByteDataset("stringbuffer", size)) { + HugeIO.copyFileIntoDataset(stringFile, ds); + } + } + Files.deleteIfExists(stringFile); + offsets.transferTo(strings, "offsets"); + compressed.transferTo(strings, "compressed"); + } + + @Override + public void close() throws IOException { + complete(); + Files.deleteIfExists(stringFile); + offsets.close(); + compressed.close(); + } +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/StreamingDictionaryWriter.java b/src/main/java/com/ebremer/beakgraph/huge/StreamingDictionaryWriter.java new file mode 100644 index 00000000..3cd26e1e --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/StreamingDictionaryWriter.java @@ -0,0 +1,274 @@ +package com.ebremer.beakgraph.huge; + +import com.ebremer.beakgraph.core.lib.DataType; +import com.ebremer.beakgraph.core.lib.Stats; +import com.ebremer.beakgraph.hdf5.Types; +import static com.ebremer.beakgraph.utils.UTIL.MinBits; +import static com.ebremer.beakgraph.utils.UTIL.isRelativeIRI; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Set; +import java.util.SortedSet; +import org.apache.jena.graph.Node; +import org.apache.jena.vocabulary.XSD; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Streaming twin of + * {@link com.ebremer.beakgraph.hdf5.writers.MultiTypeDictionaryWriter}: encodes + * an already-sorted, already-distinct node stream into the identical dictionary + * group layout (offsets / datatypes / typedLiterals / value stores / FCDs / + * langs), with every buffer disk-backed. Where the RAM writer sorts a HashSet + * of all nodes in memory, this writer receives the stream from an external + * sort-merge, so dictionary size is bounded by disk. + * + *

    The per-node encoding logic (buffer choice, offset bookkeeping, error + * stance) is a line-for-line mirror of {@code MultiTypeDictionaryWriter.addNodeInternal}; + * any change there needs a matching change here to keep the two writers + * producing identical files. + * + * @author Erich Bremer + */ +final class StreamingDictionaryWriter implements AutoCloseable { + + private static final Logger logger = LoggerFactory.getLogger(StreamingDictionaryWriter.class); + private static final int FCD_BLOCK_SIZE = 16; + + private final String name; + private final long nodeCount; + private final SpillBitPackedBuffer offsets; + private final SpillBitPackedBuffer nativedatatypes; + private final SpillBitPackedBuffer typedLiterals; + private final SpillBitPackedBuffer integers; + private final SpillBitPackedBuffer longs; + private final SpillDataBuffer floats; + private final SpillDataBuffer doubles; + private final SpillFCDWriter iri; + private final SpillFCDWriter strings; + private final SpillFCDWriter typedLiteralsDictionary; + private final SpillFCDWriter langs; + private final SpillBitPackedBuffer langTags; + private final HashMap dataTypesLookUp = new HashMap<>(); + private final HashMap langLookUp = new HashMap<>(); + private final boolean literalsPresent; + private long encoded = 0; + + /** + * @param nodeCount the exact number of distinct nodes {@link #encode} will + * deliver; fixes the offsets bit width, exactly like the + * RAM writer's {@code builder.getNodes().size()} + * @param dataTypes distinct literal datatype IRIs (natural String order), + * empty for dictionaries without literals + * @param langSet distinct language tags among the literals, natural order + */ + StreamingDictionaryWriter(Path workDir, String name, long nodeCount, Stats stats, + Set et, SortedSet dataTypes, SortedSet langSet) + throws IOException { + this.name = name; + this.nodeCount = nodeCount; + logger.info("Building dictionary '{}' ({} nodes, disk-backed)", name, nodeCount); + + // Per-dictionary temp subdirectory: FCD writers use their name both for + // temp files and for the HDF5 group they emit, so the isolation must + // come from the directory, not a name prefix. + Path dictDir = Files.createDirectories(workDir.resolve("dict." + name)); + this.offsets = new SpillBitPackedBuffer(dictDir.resolve("offsets"), 1 + MinBits(nodeCount)); + this.nativedatatypes = new SpillBitPackedBuffer(dictDir.resolve("datatypes"), + 1 + MinBits(DataType.values().length)); + + this.integers = (!et.contains(Types.INTEGER) || (stats.numInteger == 0)) ? null + : new SpillBitPackedBuffer(dictDir.resolve("integers"), + (stats.minInteger < 0) ? 32 : (1 + MinBits(stats.maxInteger))); + int longWidth = 0; + if (et.contains(Types.LONG) && stats.numLong > 0) { + longWidth = (stats.minLong < 0) ? 64 : (1 + MinBits(stats.maxLong)); + // Same rounding as the RAM writer: the bit-packed format supports + // widths 1..57 and 64 only. + if (longWidth > 57) longWidth = 64; + } + this.longs = (longWidth == 0) ? null + : new SpillBitPackedBuffer(dictDir.resolve("longs"), longWidth); + + this.doubles = (!et.contains(Types.DOUBLE) || (stats.numDouble == 0)) ? null + : new SpillDataBuffer(dictDir.resolve("doubles")); + this.floats = (!et.contains(Types.FLOAT) || (stats.numFloat == 0)) ? null + : new SpillDataBuffer(dictDir.resolve("floats")); + + this.literalsPresent = et.contains(Types.DOUBLE) || et.contains(Types.FLOAT) + || et.contains(Types.INTEGER) || et.contains(Types.LONG) || et.contains(Types.STRING); + if (literalsPresent) { + this.typedLiteralsDictionary = new SpillFCDWriter(dictDir, "typedLiteralsDictionary", FCD_BLOCK_SIZE); + this.typedLiterals = new SpillBitPackedBuffer(dictDir.resolve("typedLiterals"), + 1 + MinBits(dataTypes.size())); + for (String dt : dataTypes) { + typedLiteralsDictionary.add(dt); + dataTypesLookUp.put(dt, typedLiteralsDictionary.getNumEntries()); + } + } else { + this.typedLiteralsDictionary = null; + this.typedLiterals = null; + } + + this.iri = (!et.contains(Types.IRI) || (stats.numIRI == 0)) ? null + : new SpillFCDWriter(dictDir, "iri", FCD_BLOCK_SIZE); + this.strings = (!et.contains(Types.STRING) || (stats.numStrings == 0)) ? null + : new SpillFCDWriter(dictDir, "strings", FCD_BLOCK_SIZE); + + if (literalsPresent && !langSet.isEmpty()) { + this.langs = new SpillFCDWriter(dictDir, "langs", FCD_BLOCK_SIZE); + for (String lang : langSet) { + langs.add(lang); + langLookUp.put(lang, langs.getNumEntries()); // 1-based id + } + this.langTags = new SpillBitPackedBuffer(dictDir.resolve("langTags"), + 1 + MinBits(langSet.size())); + } else { + this.langs = null; + this.langTags = null; + } + } + + /** Encodes the sorted distinct node stream; must deliver exactly {@code nodeCount} nodes. */ + void encode(Iterator sortedDistinct) throws IOException { + while (sortedDistinct.hasNext()) { + addNodeInternal(sortedDistinct.next()); + } + if (encoded != nodeCount) { + throw new IllegalStateException("Dictionary '" + name + "': expected " + nodeCount + + " nodes but encoded " + encoded); + } + completeAll(); + } + + private void addNodeInternal(Node node) { + if (node.isBlank()) { + // Rank-based BNodes: offset 0, label regenerated from ID on read. + nativedatatypes.writeInteger(DataType.BNODE.ordinal()); + offsets.writeLong(0); + if (literalsPresent) typedLiterals.writeLong(0); + if (langTags != null) langTags.writeLong(0); + } else if (node.isURI()) { + try { + boolean relative = isRelativeIRI(node.getURI()); + offsets.writeLong(iri.getNumEntries()); + nativedatatypes.writeInteger((relative ? DataType.RELATIVE_IRI : DataType.IRI).ordinal()); + iri.add(node.getURI()); + if (literalsPresent) typedLiterals.writeLong(0); + if (langTags != null) langTags.writeLong(0); + } catch (IOException ex) { + throw new UncheckedIOException("Failed to add IRI to dictionary: " + node, ex); + } + } else if (node.isLiteral()) { + String dt = node.getLiteralDatatypeURI(); + long dtId = dataTypesLookUp.getOrDefault(dt, 0L); + if (literalsPresent) typedLiterals.writeLong(dtId); + if (langTags != null) { + String lang = node.getLiteralLanguage(); + langTags.writeLong((lang == null || lang.isEmpty()) ? 0L : langLookUp.getOrDefault(lang, 0L)); + } + Object val; + try { + val = node.getLiteralValue(); + } catch (RuntimeException ex) { + val = null; // ill-typed literal: strings branch below + } + if (dt.equals(XSD.xlong.getURI()) && longs != null && val instanceof Number num) { + offsets.writeLong(longs.getNumEntries()); + nativedatatypes.writeInteger(DataType.LONG.ordinal()); + longs.writeLong(num.longValue()); + } else if (dt.equals(XSD.xint.getURI()) && integers != null && val instanceof Number num) { + offsets.writeLong(integers.getNumEntries()); + nativedatatypes.writeInteger(DataType.INTEGER.ordinal()); + integers.writeInteger(num.intValue()); + } else if (dt.equals(XSD.xdouble.getURI()) && doubles != null && val instanceof Number num) { + offsets.writeLong(doubles.getNumEntries()); + nativedatatypes.writeInteger(DataType.DOUBLE.ordinal()); + try { + doubles.writeDouble(num.doubleValue()); + } catch (IOException ex) { + throw new UncheckedIOException("Failed to add double literal to dictionary", ex); + } + } else if (dt.equals(XSD.xfloat.getURI()) && floats != null && val instanceof Number num) { + offsets.writeLong(floats.getNumEntries()); + nativedatatypes.writeInteger(DataType.FLOAT.ordinal()); + try { + floats.writeFloat(num.floatValue()); + } catch (IOException ex) { + throw new UncheckedIOException("Failed to add float literal to dictionary", ex); + } + } else if (strings != null) { + String lex = node.getLiteralLexicalForm(); + offsets.writeLong(strings.getNumEntries()); + nativedatatypes.writeInteger(DataType.STRING.ordinal()); + try { + strings.add(lex); + } catch (IOException ex) { + throw new UncheckedIOException("Failed to add string literal to dictionary", ex); + } + } else { + throw new IllegalStateException( + "No writer buffer for literal datatype " + dt + " (strings buffer not allocated); " + + "refusing to write a misaligned dictionary entry."); + } + } else { + throw new IllegalStateException("Unsupported node kind in dictionary '" + name + "': " + node); + } + encoded++; + if (encoded % 1_000_000 == 0) { + logger.info("Dictionary '{}': encoded {} / {} nodes", name, encoded, nodeCount); + } + } + + private void completeAll() throws IOException { + offsets.complete(); + nativedatatypes.complete(); + if (typedLiterals != null) typedLiterals.complete(); + if (integers != null) integers.complete(); + if (longs != null) longs.complete(); + if (floats != null) floats.complete(); + if (doubles != null) doubles.complete(); + if (langTags != null) langTags.complete(); + } + + long getNumberOfNodes() { + return nodeCount; + } + + /** Writes this dictionary as a subgroup, mirroring MultiTypeDictionaryWriter.add(). */ + void transferTo(StreamingHdf5Group group) throws IOException { + StreamingHdf5Group subGroup = group.putGroup(name); + if (typedLiterals != null) typedLiterals.transferTo(subGroup, "typedLiterals"); + offsets.transferTo(subGroup, "offsets"); + if (typedLiteralsDictionary != null) typedLiteralsDictionary.transferTo(subGroup); + if (integers != null) integers.transferTo(subGroup, "integers"); + if (longs != null) longs.transferTo(subGroup, "longs"); + if (floats != null) floats.transferTo(subGroup, "floats"); + if (doubles != null) doubles.transferTo(subGroup, "doubles"); + if (iri != null && iri.getNumEntries() > 0) iri.transferTo(subGroup); + if (strings != null) strings.transferTo(subGroup); + if (langs != null && langs.getNumEntries() > 0) langs.transferTo(subGroup); + if (langTags != null) langTags.transferTo(subGroup, "langTags"); + if (nativedatatypes.getNumEntries() > 0) nativedatatypes.transferTo(subGroup, "datatypes"); + } + + @Override + public void close() throws IOException { + offsets.close(); + nativedatatypes.close(); + if (typedLiterals != null) typedLiterals.close(); + if (integers != null) integers.close(); + if (longs != null) longs.close(); + if (floats != null) floats.close(); + if (doubles != null) doubles.close(); + if (iri != null) iri.close(); + if (strings != null) strings.close(); + if (typedLiteralsDictionary != null) typedLiteralsDictionary.close(); + if (langs != null) langs.close(); + if (langTags != null) langTags.close(); + } +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5.java b/src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5.java new file mode 100644 index 00000000..72bed54d --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5.java @@ -0,0 +1,38 @@ +package com.ebremer.beakgraph.huge; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.Objects; + +/** + * Factory for {@link StreamingHdf5File} backends. + * + *

    The default provider is {@link NativeHdf5File} (the HDF Group's native + * hdf5 library, the only backend that currently supports writing datasets in + * chunks). A different backend - e.g. jHDF once it supports chunked/streaming + * writes - is installed with {@link #setProvider}. + * + * @author Erich Bremer + */ +public final class StreamingHdf5 { + + /** Creates a new writable HDF5 file at the given path (truncating). */ + @FunctionalInterface + public interface Provider { + StreamingHdf5File create(Path path) throws IOException; + } + + private static volatile Provider provider = NativeHdf5File::create; + + private StreamingHdf5() {} + + /** Replaces the backend used for all subsequently created files. */ + public static void setProvider(Provider p) { + provider = Objects.requireNonNull(p, "provider"); + } + + /** Creates a new writable HDF5 file at {@code path} using the current backend. */ + public static StreamingHdf5File create(Path path) throws IOException { + return provider.create(path); + } +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5Dataset.java b/src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5Dataset.java new file mode 100644 index 00000000..54358e8c --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5Dataset.java @@ -0,0 +1,30 @@ +package com.ebremer.beakgraph.huge; + +import java.io.IOException; + +/** + * A 1-D byte dataset being written incrementally. Bytes are appended strictly + * sequentially; the dataset must receive exactly the length declared at + * creation before {@link #close()} (closing an under-filled dataset is an + * error - it would leave undefined bytes for the readers to map). + * + * @author Erich Bremer + */ +public interface StreamingHdf5Dataset extends AutoCloseable { + + /** Appends {@code len} bytes of {@code buf} starting at {@code off}. */ + void write(byte[] buf, int off, int len) throws IOException; + + default void write(byte[] buf) throws IOException { + write(buf, 0, buf.length); + } + + /** Writes a scalar 32-bit integer attribute (jHDF reads it as Integer). */ + void putAttribute(String name, int value) throws IOException; + + /** Writes a scalar 64-bit integer attribute (jHDF reads it as Long). */ + void putAttribute(String name, long value) throws IOException; + + @Override + void close() throws IOException; +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5File.java b/src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5File.java new file mode 100644 index 00000000..47ad601e --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5File.java @@ -0,0 +1,33 @@ +package com.ebremer.beakgraph.huge; + +import java.io.IOException; + +/** + * A writable HDF5 file whose datasets are populated incrementally (piece by + * piece) instead of from a single in-memory array. + * + *

    This is the backend seam of the huge (disk-based) BeakGraph writer. jHDF's + * write API ({@code WritableHdfFile.putDataset(name, data)}) requires the whole + * dataset in RAM, which is exactly the limit the huge writer removes, so the + * default implementation is {@link NativeHdf5File}, backed by the HDF Group's + * native library (https://github.com/HDFGroup/hdf5) which supports writing a + * dataset in chunks. When jHDF gains equivalent streaming/chunked writing, a + * jHDF-backed implementation of these interfaces can be swapped in via + * {@link StreamingHdf5#setProvider} without touching any writer code. + * + *

    Implementations MUST produce files the existing jHDF-based readers can + * open: 1-D 8-bit datasets with CONTIGUOUS layout (the readers cast to + * {@code io.jhdf.api.dataset.ContiguousDataset} and memory-map via + * {@code getBuffer()}), and scalar 32-bit / 64-bit integer attributes that jHDF + * surfaces as {@link Integer} / {@link Long}. + * + * @author Erich Bremer + */ +public interface StreamingHdf5File extends AutoCloseable { + + /** The root group of the file. */ + StreamingHdf5Group rootGroup(); + + @Override + void close() throws IOException; +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5Group.java b/src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5Group.java new file mode 100644 index 00000000..72972487 --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/StreamingHdf5Group.java @@ -0,0 +1,37 @@ +package com.ebremer.beakgraph.huge; + +import java.io.IOException; + +/** + * A group inside a {@link StreamingHdf5File}. + * + *

    Attribute types are deliberately restricted to the two the BeakGraph + * format uses: a 32-bit integer (read back by jHDF as {@link Integer}) and a + * 64-bit integer (read back as {@link Long}). The existing readers cast + * attribute values to exactly those boxed types, so an implementation must + * preserve the width faithfully. + * + * @author Erich Bremer + */ +public interface StreamingHdf5Group { + + /** Creates (and returns) a child group. */ + StreamingHdf5Group putGroup(String name) throws IOException; + + /** Writes a scalar 32-bit integer attribute (jHDF reads it as Integer). */ + void putAttribute(String name, int value) throws IOException; + + /** Writes a scalar 64-bit integer attribute (jHDF reads it as Long). */ + void putAttribute(String name, long value) throws IOException; + + /** + * Creates a 1-D dataset of 8-bit elements with the given total length and + * CONTIGUOUS layout. The returned dataset is populated by sequential + * {@link StreamingHdf5Dataset#write} calls and must be written completely + * (exactly {@code length} bytes) before it is closed. + * + * @param name dataset name within this group + * @param length total number of bytes the dataset will hold; must be > 0 + */ + StreamingHdf5Dataset createByteDataset(String name, long length) throws IOException; +} diff --git a/src/main/java/com/ebremer/beakgraph/huge/package-info.java b/src/main/java/com/ebremer/beakgraph/huge/package-info.java new file mode 100644 index 00000000..79be18b0 --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/huge/package-info.java @@ -0,0 +1,38 @@ +/** + * Disk-based construction of very large BeakGraphs. + * + *

    The RAM writers ({@code com.ebremer.beakgraph.hdf5.writers}) hold every + * quad, every dictionary node and every buffer in memory, which caps the size + * of a buildable store at the heap. This package rebuilds the same pipeline on + * disk: + * + *

      + *
    • {@link com.ebremer.beakgraph.huge.HugeHDF5Writer} - the public entry + * point (a {@code BeakGraphWriter}, drop-in alternative to + * {@code HDF5Writer});
    • + *
    • {@link com.ebremer.beakgraph.huge.HugeBuildPipeline} - parse once, + * spill (term, row) columns, external-sort, merge-dedup into + * dictionaries, sort-merge id joins, external-sort encoded quads for the + * GSPO/GPOS indexes;
    • + *
    • {@code Spill*} buffers - file-backed twins of the bit-packed / + * front-coded / primitive buffers, byte-identical on disk;
    • + *
    • {@link com.ebremer.beakgraph.huge.StreamingHdf5File} and friends - the + * backend seam for writing HDF5 datasets incrementally. The default + * backend is {@link com.ebremer.beakgraph.huge.NativeHdf5File}, the HDF + * Group's native library (https://github.com/HDFGroup/hdf5) via the + * official {@code hdf.hdf5lib} API - today the only implementation that + * supports chunk-at-a-time writing. Which jar supplies {@code hdf.hdf5lib} + * is a build-time choice: the JavaCPP preset with bundled natives by + * default, or the HDF Group's Java 25 FFM bindings with + * {@code -Dhdf5.ffm} (see the {@code hdf5-backend-*} profiles in + * pom.xml). When jHDF (https://github.com/jamesmudd/jhdf) gains + * chunked/streaming writes, a jHDF backend can be installed with + * {@link com.ebremer.beakgraph.huge.StreamingHdf5#setProvider} without + * touching writer code.
    • + *
    + * + *

    Files produced here are read by the existing jHDF-based readers + * ({@code HDF5Reader}); datasets are CONTIGUOUS layout and attributes are + * scalar 32/64-bit integers, exactly as those readers require. + */ +package com.ebremer.beakgraph.huge; diff --git a/src/main/java/com/ebremer/beakgraph/io/ByteBufferBytes.java b/src/main/java/com/ebremer/beakgraph/io/ByteBufferBytes.java new file mode 100644 index 00000000..ccd8fb38 --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/io/ByteBufferBytes.java @@ -0,0 +1,66 @@ +package com.ebremer.beakgraph.io; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * {@link RandomAccessBytes} over a {@link ByteBuffer} - the classic path for + * jHDF-mapped datasets (which are capped at 2 GiB by ByteBuffer's int + * indexing; larger datasets use {@link MemorySegmentBytes}). + * + *

    The source buffer is duplicated at construction (position/limit/order of + * the original are never touched afterwards) and forced BIG-ENDIAN; only + * absolute reads are issued, so instances are safe for concurrent readers. + * + * @author Erich Bremer + */ +public final class ByteBufferBytes implements RandomAccessBytes { + + private final ByteBuffer buffer; + private final long size; + + public ByteBufferBytes(ByteBuffer source) { + // duplicate: shares content, isolates position/limit/order from the caller + this.buffer = source.duplicate().order(ByteOrder.BIG_ENDIAN); + this.size = this.buffer.limit(); + } + + private static int idx(long offset) { + // The wrapped buffer is < 2 GiB by construction; a larger offset is a + // caller bug and surfaces as the same IndexOutOfBounds the reads throw. + if (offset < 0 || offset > Integer.MAX_VALUE) { + throw new IndexOutOfBoundsException("offset " + offset); + } + return (int) offset; + } + + @Override + public long size() { + return size; + } + + @Override + public byte get(long offset) { + return buffer.get(idx(offset)); + } + + @Override + public long getLong(long offset) { + return buffer.getLong(idx(offset)); + } + + @Override + public float getFloat(long offset) { + return buffer.getFloat(idx(offset)); + } + + @Override + public double getDouble(long offset) { + return buffer.getDouble(idx(offset)); + } + + @Override + public void get(long offset, byte[] dst, int dstOffset, int length) { + buffer.get(idx(offset), dst, dstOffset, length); + } +} diff --git a/src/main/java/com/ebremer/beakgraph/io/DatasetBytes.java b/src/main/java/com/ebremer/beakgraph/io/DatasetBytes.java new file mode 100644 index 00000000..24b7e45d --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/io/DatasetBytes.java @@ -0,0 +1,59 @@ +package com.ebremer.beakgraph.io; + +import io.jhdf.api.dataset.ContiguousDataset; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.ByteBuffer; + +/** + * Builds the {@link RandomAccessBytes} view of a jHDF contiguous dataset. + * + *

    Datasets that fit a ByteBuffer keep today's exact path - jHDF's own + * mapped buffer, whose lifetime jHDF manages via {@code HdfFile.close()}. + * Datasets past the 2 GiB ByteBuffer ceiling (which {@code getBuffer()} + * cannot serve at all) are FFM-mapped directly from the underlying file at + * {@code dataAddress + userBlockSize} - the same file offset jHDF itself + * would map - with an automatic arena managing the unmap. + * + *

    The threshold is overridable for testing and operations via the + * {@code beakgraph.ffm.threshold} system property (bytes; datasets strictly + * larger go through FFM). Setting it to 0 forces every dataset onto the FFM + * path. + * + * @author Erich Bremer + */ +public final class DatasetBytes { + + /** Above this many bytes a dataset is FFM-mapped instead of using getBuffer(). */ + private static volatile long ffmThreshold = + Long.getLong("beakgraph.ffm.threshold", Integer.MAX_VALUE); + + private DatasetBytes() {} + + /** Overrides the FFM threshold (tests); returns the previous value. */ + static long setFfmThreshold(long thresholdBytes) { + long previous = ffmThreshold; + ffmThreshold = thresholdBytes; + return previous; + } + + public static RandomAccessBytes of(ContiguousDataset dataset) { + long size = dataset.getSizeInBytes(); + if (size == 0) { + return new ByteBufferBytes(ByteBuffer.allocate(0)); + } + long address = dataset.getDataAddress(); + if (size > ffmThreshold && address >= 0) { + try { + long fileOffset = address + dataset.getHdfFile().getUserBlockSize(); + return MemorySegmentBytes.map(dataset.getFileAsPath(), fileOffset, size); + } catch (IOException e) { + throw new UncheckedIOException( + "Failed to FFM-map dataset '" + dataset.getPath() + "' (" + + size + " bytes) from " + dataset.getFileAsPath(), e); + } + } + // <= 2 GiB: jHDF's own mapped buffer, exactly as before. + return new ByteBufferBytes(dataset.getBuffer()); + } +} diff --git a/src/main/java/com/ebremer/beakgraph/io/MemorySegmentBytes.java b/src/main/java/com/ebremer/beakgraph/io/MemorySegmentBytes.java new file mode 100644 index 00000000..bd3c48fb --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/io/MemorySegmentBytes.java @@ -0,0 +1,83 @@ +package com.ebremer.beakgraph.io; + +import java.io.IOException; +import java.lang.foreign.Arena; +import java.lang.foreign.MemorySegment; +import java.lang.foreign.ValueLayout; +import java.nio.ByteOrder; +import java.nio.channels.FileChannel; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; + +/** + * {@link RandomAccessBytes} over an FFM {@link MemorySegment} - the path for + * datasets past ByteBuffer's 2 GiB ceiling (and, at parity performance, an + * alternative below it). Since JDK 22 a file region of any size can be mapped + * straight to a segment; absolute segment reads JIT to the same machine code + * as direct-ByteBuffer access. + * + *

    Mappings use an automatic {@link Arena}: the region unmaps when the + * segment becomes unreachable, so no close() plumbing is needed through the + * reader stack (the file channel is closed immediately after mapping - the + * mapping survives it). Windows caveat: as with any mapping, the file stays + * in-use until the unmap actually happens. + * + *

    All reads are absolute and the layouts are unaligned BIG-ENDIAN (the + * bit-packed data honors no alignment). Auto arenas are shared, so instances + * are safe for concurrent readers. + * + * @author Erich Bremer + */ +public final class MemorySegmentBytes implements RandomAccessBytes { + + private static final ValueLayout.OfLong LONG_BE = + ValueLayout.JAVA_LONG_UNALIGNED.withOrder(ByteOrder.BIG_ENDIAN); + private static final ValueLayout.OfFloat FLOAT_BE = + ValueLayout.JAVA_FLOAT_UNALIGNED.withOrder(ByteOrder.BIG_ENDIAN); + private static final ValueLayout.OfDouble DOUBLE_BE = + ValueLayout.JAVA_DOUBLE_UNALIGNED.withOrder(ByteOrder.BIG_ENDIAN); + + private final MemorySegment segment; + + public MemorySegmentBytes(MemorySegment segment) { + this.segment = segment; + } + + /** Maps {@code size} bytes of {@code file} starting at {@code offset}, read-only. */ + public static MemorySegmentBytes map(Path file, long offset, long size) throws IOException { + try (FileChannel fc = FileChannel.open(file, StandardOpenOption.READ)) { + MemorySegment seg = fc.map(FileChannel.MapMode.READ_ONLY, offset, size, Arena.ofAuto()); + return new MemorySegmentBytes(seg); + } + } + + @Override + public long size() { + return segment.byteSize(); + } + + @Override + public byte get(long offset) { + return segment.get(ValueLayout.JAVA_BYTE, offset); + } + + @Override + public long getLong(long offset) { + return segment.get(LONG_BE, offset); + } + + @Override + public float getFloat(long offset) { + return segment.get(FLOAT_BE, offset); + } + + @Override + public double getDouble(long offset) { + return segment.get(DOUBLE_BE, offset); + } + + @Override + public void get(long offset, byte[] dst, int dstOffset, int length) { + MemorySegment.copy(segment, ValueLayout.JAVA_BYTE, offset, dst, dstOffset, length); + } +} diff --git a/src/main/java/com/ebremer/beakgraph/io/RandomAccessBytes.java b/src/main/java/com/ebremer/beakgraph/io/RandomAccessBytes.java new file mode 100644 index 00000000..d5e62b0e --- /dev/null +++ b/src/main/java/com/ebremer/beakgraph/io/RandomAccessBytes.java @@ -0,0 +1,43 @@ +package com.ebremer.beakgraph.io; + +/** + * Absolute-offset random access over an immutable byte region - the seam + * between BeakGraph's readers and whatever holds the bytes. + * + *

    All offsets are {@code long} (no 2 GiB ceiling) and all multi-byte reads + * are BIG-ENDIAN, matching the on-disk format (DataOutputStream primitives and + * MSB-first bit packing). The API is deliberately position-free: every read is + * absolute, so one instance may be shared by concurrent query threads - the + * same contract the readers previously relied on with absolute ByteBuffer + * reads. + * + *

    Implementations: {@link ByteBufferBytes} (wraps the jHDF-mapped buffer, + * the default for datasets under 2 GiB), {@link MemorySegmentBytes} (an FFM + * mapped segment for datasets beyond ByteBuffer's reach). A future chunked + * implementation (e.g. Zarr with a decompressed-chunk cache) plugs in here + * without touching the readers. + * + *

    Out-of-range offsets throw {@link IndexOutOfBoundsException}. + * + * @author Erich Bremer + */ +public interface RandomAccessBytes { + + /** Total number of readable bytes. */ + long size(); + + /** The byte at {@code offset}. */ + byte get(long offset); + + /** The big-endian 64-bit value at {@code offset} (unaligned allowed). */ + long getLong(long offset); + + /** The big-endian 32-bit float at {@code offset} (unaligned allowed). */ + float getFloat(long offset); + + /** The big-endian 64-bit double at {@code offset} (unaligned allowed). */ + double getDouble(long offset); + + /** Copies {@code length} bytes starting at {@code offset} into {@code dst}. */ + void get(long offset, byte[] dst, int dstOffset, int length); +} diff --git a/src/test/java/com/ebremer/beakgraph/cmdline/BeakGraphCLIConversionTest.java b/src/test/java/com/ebremer/beakgraph/cmdline/BeakGraphCLIConversionTest.java index 2822a037..bf3eb119 100644 --- a/src/test/java/com/ebremer/beakgraph/cmdline/BeakGraphCLIConversionTest.java +++ b/src/test/java/com/ebremer/beakgraph/cmdline/BeakGraphCLIConversionTest.java @@ -45,6 +45,38 @@ void failedConversionsAreCountedAndGoodFilesStillConvert() throws Exception { "the well-formed source must still convert"); } + @Test + void hugeFlagConvertsThroughDiskBasedWriter() throws Exception { + org.junit.jupiter.api.Assumptions.assumeTrue( + com.ebremer.beakgraph.huge.NativeHdf5File.isAvailable(), + "native HDF5 library unavailable"); + Path src = Files.createDirectories(dir.resolve("srchuge")); + Files.write(src.resolve("data.ttl"), + " .\n".getBytes(StandardCharsets.UTF_8)); + + Parameters p = new Parameters(); + p.src = src.toFile(); + p.dest = dir.resolve("outhuge").toFile(); + p.huge = true; + p.workdir = dir.resolve("workhuge").toFile(); // exercised even when absent: CLI creates it + + BeakGraphCLI cli = new BeakGraphCLI(p); + cli.traverse(); + + assertEquals(0, cli.getFileCounter().getFailedConversionFileCount(), + "the -huge conversion must succeed"); + File h5 = dir.resolve("outhuge").resolve("data.h5").toFile(); + assertTrue(h5.exists() && h5.length() > 0, "the -huge writer must produce the .h5 file"); + // The produced store must be readable by the standard reader stack. + try (com.ebremer.beakgraph.core.BeakGraph bg = new com.ebremer.beakgraph.core.BeakGraph( + new com.ebremer.beakgraph.hdf5.readers.HDF5Reader(h5))) { + assertTrue(bg.find(org.apache.jena.graph.NodeFactory.createURI("http://ex.org/a"), + org.apache.jena.graph.NodeFactory.createURI("http://ex.org/p"), + org.apache.jena.graph.NodeFactory.createURI("http://ex.org/b")).hasNext(), + "the converted triple must be queryable"); + } + } + @Test void missingDestinationFailsEveryFileLoudlyInsteadOfSilently() throws Exception { // main() refuses to start without -dest; if a processor is ever reached diff --git a/src/test/java/com/ebremer/beakgraph/huge/ExternalSorterTest.java b/src/test/java/com/ebremer/beakgraph/huge/ExternalSorterTest.java new file mode 100644 index 00000000..5e1a234b --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/huge/ExternalSorterTest.java @@ -0,0 +1,76 @@ +package com.ebremer.beakgraph.huge; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Random; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * External merge sort correctness: tiny in-RAM batches and a small fan-in force + * many spill runs and multi-level merges; the output must be a permutation of + * the input in exact comparator order, and every spill file must be gone + * afterwards. + */ +class ExternalSorterTest { + + @TempDir + Path dir; + + private static final ExternalSorter.Codec LONGS = new ExternalSorter.Codec<>() { + @Override public void write(DataOutput out, Long record) throws IOException { out.writeLong(record); } + @Override public Long read(DataInput in) throws IOException { return in.readLong(); } + }; + + @Test + void multiLevelMergeSortsAndCleansUp() throws Exception { + Random rnd = new Random(7); + int n = 100_000; + List expected = new ArrayList<>(n); + try (ExternalSorter sorter = new ExternalSorter<>(dir, "t", LONGS, Comparator.naturalOrder(), 1_000, 4)) { + for (int i = 0; i < n; i++) { + long v = rnd.nextLong(1_000_000); // duplicates likely + expected.add(v); + sorter.add(v); + } + expected.sort(Comparator.naturalOrder()); + assertEquals(n, sorter.size()); + List actual = new ArrayList<>(n); + try (ExternalSorter.SortedStream s = sorter.sorted()) { + while (s.hasNext()) { + actual.add(s.next()); + } + } + assertEquals(expected, actual, "sorted output must be the exact sorted multiset of the input"); + } + try (var files = Files.list(dir)) { + assertTrue(files.findAny().isEmpty(), "all spill runs must be deleted after consumption"); + } + } + + @Test + void allInMemoryPathSkipsDisk() throws Exception { + try (ExternalSorter sorter = new ExternalSorter<>(dir, "m", LONGS, Comparator.naturalOrder(), 1_000_000, 8)) { + for (long v : new long[]{5, 3, 9, 1, 3}) { + sorter.add(v); + } + List actual = new ArrayList<>(); + try (ExternalSorter.SortedStream s = sorter.sorted()) { + s.forEachRemaining(actual::add); + } + assertEquals(List.of(1L, 3L, 3L, 5L, 9L), actual); + } + try (var files = Files.list(dir)) { + assertFalse(files.findAny().isPresent(), "in-memory sort must not create files"); + } + } +} diff --git a/src/test/java/com/ebremer/beakgraph/huge/HugeWriterParityTest.java b/src/test/java/com/ebremer/beakgraph/huge/HugeWriterParityTest.java new file mode 100644 index 00000000..0c443be9 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/huge/HugeWriterParityTest.java @@ -0,0 +1,277 @@ +package com.ebremer.beakgraph.huge; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import io.jhdf.HdfFile; +import io.jhdf.api.Attribute; +import io.jhdf.api.Dataset; +import io.jhdf.api.Group; +import io.jhdf.api.Node; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.QuerySolution; +import org.apache.jena.query.ResultSet; +import org.apache.jena.rdf.model.Model; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeTrue; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * End-to-end parity: the disk-based writer must produce a store that reads + * back (through the UNMODIFIED jHDF-based readers) semantically identical to + * the RAM writer's - same graphs, isomorphic per-graph content (blank node + * labels legitimately differ), same query answers through both indexes, and + * structurally identical HDF5 metadata (same dataset tree, same numEntries / + * width / FCD attributes everywhere). + */ +class HugeWriterParityTest { + + @TempDir + static Path dir; + + @BeforeAll + static void requireNative() { + assumeTrue(NativeHdf5File.isAvailable(), + "native HDF5 library unavailable: " + NativeHdf5File.getUnavailableCause()); + } + + // ------------------------------------------------------------------ + // helpers + // ------------------------------------------------------------------ + + private static Path writeBoth(String name, String content, boolean spatial, boolean features) throws Exception { + File src = dir.resolve(name).toFile(); + Files.write(src.toPath(), content.getBytes(StandardCharsets.UTF_8)); + return writeBoth(name, src, spatial, features); + } + + /** Writes src with both writers; returns the directory holding {name}.ram.h5 / {name}.huge.h5. */ + private static Path writeBoth(String name, File src, boolean spatial, boolean features) throws Exception { + File ram = dir.resolve(name + ".ram.h5").toFile(); + File huge = dir.resolve(name + ".huge.h5").toFile(); + HDF5Writer.Builder().setSource(src).setDestination(ram) + .setSpatial(spatial).setFeatures(features).build().write(); + HugeHDF5Writer.Builder().setSource(src).setDestination(huge) + .setSpatial(spatial).setFeatures(features) + // deliberately tiny batches: force spill runs and multi-level merges + .setTermSpillBatch(512).setIdSpillBatch(1024).setMergeFanIn(4) + .build().write(); + return dir; + } + + private static Set graphNames(org.apache.jena.query.Dataset ds) { + Set names = new TreeSet<>(); + ds.asDatasetGraph().listGraphNodes().forEachRemaining(g -> names.add(g.toString())); + return names; + } + + private static Model graphModel(org.apache.jena.query.Dataset ds, String graphUri) { + String q = (graphUri == null) + ? "CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o }" + : "CONSTRUCT { ?s ?p ?o } WHERE { GRAPH <" + graphUri + "> { ?s ?p ?o } }"; + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create(q)).build()) { + return qe.execConstruct(); + } + } + + private static java.util.List select(org.apache.jena.query.Dataset ds, String query) { + java.util.List rows = new java.util.ArrayList<>(); + try (QueryExecution qe = QueryExecution.dataset(ds).query(QueryFactory.create(query)).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + QuerySolution qs = rs.next(); + StringBuilder sb = new StringBuilder(); + rs.getResultVars().forEach(v -> sb.append(v).append('=').append(qs.get(v)).append('|')); + rows.add(sb.toString()); + } + } + rows.sort(String::compareTo); + return rows; + } + + /** Semantic equality of the two stores, graph by graph. */ + private static void assertStoresEquivalent(Path ramH5, Path hugeH5, String... probes) throws Exception { + try (BeakGraph a = new BeakGraph(new HDF5Reader(ramH5.toFile())); + BeakGraph b = new BeakGraph(new HDF5Reader(hugeH5.toFile()))) { + org.apache.jena.query.Dataset da = a.getDataset(); + org.apache.jena.query.Dataset db = b.getDataset(); + + Set graphsA = graphNames(da); + Set graphsB = graphNames(db); + assertEquals(graphsA, graphsB, "graph lists must match"); + + Model defA = graphModel(da, null); + Model defB = graphModel(db, null); + assertTrue(defA.isIsomorphicWith(defB), + "default graphs must be isomorphic (ram=" + defA.size() + ", huge=" + defB.size() + ")"); + for (String g : graphsA) { + if (!g.startsWith("http") && !g.startsWith("urn")) continue; // skip any non-URI form + Model ga = graphModel(da, g); + Model gb = graphModel(db, g); + assertTrue(ga.isIsomorphicWith(gb), + "graph <" + g + "> must be isomorphic (ram=" + ga.size() + ", huge=" + gb.size() + ")"); + } + for (String probe : probes) { + assertEquals(select(da, probe), select(db, probe), "probe results must match: " + probe); + } + } + } + + /** + * Structural parity of the HDF5 trees: identical group/dataset names and + * identical attribute values everywhere. Counts and bit widths are + * bnode-order independent, so this must hold exactly even though raw bytes + * may differ (blank node ranks differ between the writers). + */ + private static void assertSameStructure(Path ramH5, Path hugeH5) { + try (HdfFile ram = new HdfFile(ramH5); HdfFile huge = new HdfFile(hugeH5)) { + compareGroups("/", (Group) ram.getChild(".BG"), (Group) huge.getChild(".BG")); + } + } + + private static void compareGroups(String path, Group a, Group b) { + assertEquals(a != null, b != null, "group presence at " + path); + if (a == null) return; + compareAttributes(path, a, b); + Map ca = a.getChildren(); + Map cb = b.getChildren(); + assertEquals(new TreeSet<>(ca.keySet()), new TreeSet<>(cb.keySet()), "children of " + path); + for (String name : ca.keySet()) { + Node na = ca.get(name); + Node nb = cb.get(name); + assertEquals(na instanceof Group, nb instanceof Group, "node kind of " + path + name); + if (na instanceof Group ga) { + compareGroups(path + name + "/", ga, (Group) nb); + } else { + compareAttributes(path + name, na, nb); + assertEquals(((Dataset) na).getSize(), ((Dataset) nb).getSize(), + "dataset size of " + path + name); + } + } + } + + private static void compareAttributes(String path, Node a, Node b) { + Map attrsA = new HashMap<>(); + Map attrsB = new HashMap<>(); + for (Map.Entry e : a.getAttributes().entrySet()) { + attrsA.put(e.getKey(), e.getValue().getData()); + } + for (Map.Entry e : b.getAttributes().entrySet()) { + attrsB.put(e.getKey(), e.getValue().getData()); + } + assertEquals(attrsA, attrsB, "attributes of " + path); + } + + // ------------------------------------------------------------------ + // tests + // ------------------------------------------------------------------ + + @Test + void mixedTypesAndNamedGraphs() throws Exception { + String longStr = "y".repeat(150); + String trig = """ + @prefix ex: . + @prefix xsd: . + + ex:s0 ex:p0 ex:o0 . + ex:s0 ex:p0 ex:o0 . + ex:s0 ex:name "Alice" . + ex:s0 ex:name "Alice"@en . + ex:s0 ex:name "Alicia"@fr-CA . + ex:s0 ex:count "42"^^xsd:int . + ex:s0 ex:count "042"^^xsd:int . + ex:s0 ex:count2 "-7"^^xsd:int . + ex:s0 ex:big "9223372036854775806"^^xsd:long . + ex:s0 ex:neg "-9007199254740993"^^xsd:long . + ex:s0 ex:f "1.5"^^xsd:float . + ex:s0 ex:d "-2.25E8"^^xsd:double . + ex:s0 ex:unbounded "123456789012345678901234567890"^^xsd:integer . + ex:s0 ex:flag true . + ex:s0 ex:when "2024-05-06T07:08:09Z"^^xsd:dateTime . + ex:s0 ex:longstr "%s" . + ex:s0 ex:uni "h\\u00e9llo \\u00fcrld" . + ex:s0 ex:ill "abc"^^xsd:int . + <> ex:self . + _:b1 ex:p0 _:b2 . + _:b2 ex:knows ex:s0 . + ex:g1 { + ex:s1 ex:p0 ex:o0 . + ex:s1 ex:num "10"^^xsd:int . + _:b1 ex:inGraph ex:g1 . + } + ex:g2 { ex:s0 ex:p0 ex:s1 . } + """.formatted(longStr); + writeBoth("mixed.trig", trig, false, false); + Path ram = dir.resolve("mixed.trig.ram.h5"); + Path huge = dir.resolve("mixed.trig.huge.h5"); + assertStoresEquivalent(ram, huge, + "SELECT ?p ?o WHERE { ?p ?o }", + "SELECT ?s WHERE { ?s }", + "SELECT ?s ?o WHERE { GRAPH { ?s ?o } }", + "SELECT ?o WHERE { ?o }", + "SELECT ?g ?s WHERE { GRAPH ?g { ?s } }"); + assertSameStructure(ram, huge); + } + + @Test + void spatialAndFeaturesParity() throws Exception { + String trig = """ + @prefix ex: . + @prefix geo: . + + ex:geo1 geo:asWKT "POLYGON((0 0, 100 0, 100 100, 0 100, 0 0))"^^geo:wktLiteral . + ex:geo2 geo:asWKT "MULTIPOLYGON(((200 200, 300 200, 300 300, 200 200)),((600 600, 700 600, 700 700, 600 600)))"^^geo:wktLiteral . + ex:geo3 geo:asWKT "POINT(5000 6000)"^^geo:wktLiteral . + ex:geo4 geo:asWKT " POLYGON((10 10, 60 10, 60 60, 10 60, 10 10))"^^geo:wktLiteral . + ex:geo5 geo:asWKT "POLYGON((0 0, 1 0))"^^geo:wktLiteral . + ex:geo1 ex:label "region one" . + """; + writeBoth("spatial.trig", trig, true, true); + Path ram = dir.resolve("spatial.trig.ram.h5"); + Path huge = dir.resolve("spatial.trig.huge.h5"); + assertStoresEquivalent(ram, huge, + "SELECT ?s ?p ?o WHERE { GRAPH { ?s ?p ?o } }", + "SELECT ?g WHERE { GRAPH ?g { ?p ?o } }"); + assertSameStructure(ram, huge); + } + + @Test + void stressManySpillRunsMatchesRamWriter() throws Exception { + StringBuilder nq = new StringBuilder(1 << 22); + for (int i = 0; i < 30_000; i++) { + String s = ""; + String p = ""; + String o = switch (i % 4) { + case 0 -> ""; + case 1 -> "\"str" + (i % 1000) + "\""; + case 2 -> "\"" + (i % 1000 - 500) + "\"^^"; + default -> "\"" + ((i % 100) / 8.0) + "\"^^"; + }; + nq.append(s).append(' ').append(p).append(' ').append(o); + if (i % 3 != 0) { + nq.append(" '); + } + nq.append(" .\n"); + } + writeBoth("stress.nq", nq.toString(), false, false); + Path ram = dir.resolve("stress.nq.ram.h5"); + Path huge = dir.resolve("stress.nq.huge.h5"); + assertStoresEquivalent(ram, huge, + "SELECT ?s ?o WHERE { ?s ?o }", + "SELECT ?g (COUNT(*) AS ?n) WHERE { GRAPH ?g { ?s ?p ?o } } GROUP BY ?g ORDER BY ?g", + "SELECT ?s WHERE { GRAPH { ?s \"str101\" } }"); + assertSameStructure(ram, huge); + } +} diff --git a/src/test/java/com/ebremer/beakgraph/huge/NativeHdf5SmokeTest.java b/src/test/java/com/ebremer/beakgraph/huge/NativeHdf5SmokeTest.java new file mode 100644 index 00000000..7b16acaa --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/huge/NativeHdf5SmokeTest.java @@ -0,0 +1,79 @@ +package com.ebremer.beakgraph.huge; + +import io.jhdf.HdfFile; +import io.jhdf.api.Group; +import io.jhdf.api.dataset.ContiguousDataset; +import java.nio.ByteBuffer; +import java.nio.file.Path; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assumptions.assumeTrue; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * The reader-compatibility contract of the native backend, verified against the + * ACTUAL production reader stack (jHDF): contiguous-layout byte datasets + * written in several slabs, groups (including the dot-prefixed .BG name), and + * scalar attributes that come back as exactly Integer / Long - the boxed types + * the BeakGraph readers cast to. + */ +class NativeHdf5SmokeTest { + + @TempDir + Path dir; + + @Test + void nativeWrittenFileReadsBackThroughJhdf() throws Exception { + assumeTrue(NativeHdf5File.isAvailable(), + "native HDF5 library unavailable: " + NativeHdf5File.getUnavailableCause()); + Path h5 = dir.resolve("smoke.h5"); + + int len = 300_000; + byte[] pattern = new byte[len]; + for (int i = 0; i < len; i++) { + pattern[i] = (byte) (i * 31 + (i >> 8)); + } + + try (StreamingHdf5File f = NativeHdf5File.create(h5)) { + StreamingHdf5Group bg = f.rootGroup().putGroup(".BG"); + bg.putAttribute("numQuads", 42L); + bg.putAttribute("formatVersion", 3); + StreamingHdf5Group dict = bg.putGroup("dictionary"); + try (StreamingHdf5Dataset ds = dict.createByteDataset("offsets", len)) { + // three unequal slabs, one with a non-zero source offset + ds.write(pattern, 0, 100_000); + ds.write(pattern, 100_000, 150_000); + ds.write(pattern, 250_000, 50_000); + ds.putAttribute("width", 7); + ds.putAttribute("numEntries", 999L); + } + } + + try (HdfFile hdf = new HdfFile(h5)) { + Group bg = (Group) hdf.getChild(".BG"); + assertNotNull(bg, "the .BG group must exist"); + Object numQuads = bg.getAttribute("numQuads").getData(); + assertInstanceOf(Long.class, numQuads, "numQuads must read back as Long"); + assertEquals(42L, numQuads); + Object version = bg.getAttribute("formatVersion").getData(); + assertInstanceOf(Integer.class, version, "formatVersion must read back as Integer"); + assertEquals(3, version); + + Group dict = (Group) bg.getChild("dictionary"); + ContiguousDataset ds = (ContiguousDataset) dict.getChild("offsets"); + assertEquals(7, ds.getAttribute("width").getData(), "width attribute (Integer)"); + assertEquals(999L, ds.getAttribute("numEntries").getData(), "numEntries attribute (Long)"); + ByteBuffer buf = ds.getBuffer(); + assertEquals(len, buf.remaining(), "dataset length"); + byte[] readBack = new byte[len]; + buf.get(readBack); + for (int i = 0; i < len; i++) { + if (readBack[i] != pattern[i]) { + assertEquals(pattern[i], readBack[i], "byte mismatch at " + i); + } + } + } + } +} diff --git a/src/test/java/com/ebremer/beakgraph/huge/SpillBitPackedBufferTest.java b/src/test/java/com/ebremer/beakgraph/huge/SpillBitPackedBufferTest.java new file mode 100644 index 00000000..a563d6f7 --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/huge/SpillBitPackedBufferTest.java @@ -0,0 +1,71 @@ +package com.ebremer.beakgraph.huge; + +import com.ebremer.beakgraph.hdf5.BitPackedUnSignedLongBuffer; +import java.nio.ByteBuffer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Random; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** + * The spill bit packer must produce bytes the PRODUCTION reader + * ({@link BitPackedUnSignedLongBuffer} wrapping the dataset buffer, exactly as + * the HDF5 readers construct it) decodes back to the original values - for + * every supported width, including the signed 32/64 escape hatches. + */ +class SpillBitPackedBufferTest { + + @TempDir + Path dir; + + @Test + void roundTripsThroughProductionReaderAtEveryWidth() throws Exception { + Random rnd = new Random(42); + int[] widths = {1, 2, 5, 8, 13, 24, 32, 40, 57, 64}; + for (int w : widths) { + int n = 1000; + long[] values = new long[n]; + Path f = dir.resolve("w" + w); + try (SpillBitPackedBuffer spill = new SpillBitPackedBuffer(f, w)) { + for (int i = 0; i < n; i++) { + long v; + if (w == 64) { + v = rnd.nextLong(); // full pattern incl. negatives + } else if (w == 32) { + v = rnd.nextInt(); // negative ints allowed at width 32 + spill.writeInteger((int) v); + values[i] = ((int) v) & 0xFFFFFFFFL; // reader returns the unsigned pattern + continue; + } else { + v = rnd.nextLong() & ((1L << w) - 1); + } + values[i] = v; + spill.writeLong(v); + } + spill.complete(); + assertEquals(n, spill.getNumEntries()); + byte[] bytes = Files.readAllBytes(f); + assertEquals((n * (long) w + 7) / 8, bytes.length, "width " + w + ": packed length"); + BitPackedUnSignedLongBuffer reader = + new BitPackedUnSignedLongBuffer(null, ByteBuffer.wrap(bytes), n, w); + for (int i = 0; i < n; i++) { + assertEquals(values[i], reader.get(i), "width " + w + " index " + i); + } + } + } + } + + @Test + void rejectsOutOfRangeValuesAndBadWidths() throws Exception { + assertThrows(IllegalArgumentException.class, + () -> new SpillBitPackedBuffer(dir.resolve("bad"), 58)); + try (SpillBitPackedBuffer b = new SpillBitPackedBuffer(dir.resolve("w3"), 3)) { + b.writeLong(7); + assertThrows(IllegalArgumentException.class, () -> b.writeLong(8)); + assertThrows(IllegalArgumentException.class, () -> b.writeLong(-1)); + } + } +} diff --git a/src/test/java/com/ebremer/beakgraph/io/FfmReaderPathTest.java b/src/test/java/com/ebremer/beakgraph/io/FfmReaderPathTest.java new file mode 100644 index 00000000..e750fe0b --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/io/FfmReaderPathTest.java @@ -0,0 +1,121 @@ +package com.ebremer.beakgraph.io; + +import com.ebremer.beakgraph.core.BeakGraph; +import com.ebremer.beakgraph.hdf5.readers.HDF5Reader; +import com.ebremer.beakgraph.hdf5.writers.HDF5Writer; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.QuerySolution; +import org.apache.jena.query.ResultSet; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.CleanupMode; +import org.junit.jupiter.api.io.TempDir; + +/** + * End-to-end proof that the whole reader stack works over FFM-mapped segments: + * the FFM threshold is forced to 0 so EVERY dataset - bit-packed ids and + * bitmaps, rank/select directories, FCD string buffers (compressed and raw + * fragments), float/double value stores, language tags - is read through + * {@link MemorySegmentBytes} instead of jHDF's ByteBuffer, and every query + * answer must match the default (ByteBuffer) path over the same file exactly + * (same file, same ids, so even blank node labels must agree). + */ +class FfmReaderPathTest { + + // NEVER + manual delete: auto-arena mappings unmap at GC, which on Windows + // can outlive JUnit's cleanup and fail the run over a locked temp file. + @TempDir(cleanup = CleanupMode.NEVER) + static Path dir; + + @AfterAll + static void tryCleanup() { + try (var files = Files.walk(dir)) { + files.sorted(java.util.Comparator.reverseOrder()).forEach(p -> { + p.toFile().deleteOnExit(); + try { Files.deleteIfExists(p); } catch (Exception ignored) {} + }); + } catch (Exception ignored) {} + } + + private static final String[] PROBES = { + "SELECT ?p ?o WHERE { ?p ?o }", + "SELECT ?s WHERE { ?s }", + "SELECT ?s ?o WHERE { GRAPH { ?s ?p ?o } }", + "SELECT ?o WHERE { ?o }", + "SELECT ?o WHERE { ?o }", + "SELECT ?o WHERE { ?o }", + "SELECT ?g ?s ?p ?o WHERE { GRAPH ?g { ?s ?p ?o } }", + "SELECT ?s ?p ?o WHERE { ?s ?p ?o }", + }; + + @Test + void allDatasetsReadIdenticallyThroughFfmMappings() throws Exception { + String trig = """ + @prefix ex: . + @prefix xsd: . + ex:s0 ex:p0 ex:o0 . + ex:s0 ex:name "Alice" . + ex:s0 ex:name "Alice"@en . + ex:s0 ex:count "42"^^xsd:int . + ex:s0 ex:big "9007199254740993"^^xsd:long . + ex:s0 ex:f "1.5"^^xsd:float . + ex:s0 ex:d "-2.25E8"^^xsd:double . + ex:s0 ex:when "2024-05-06T07:08:09Z"^^xsd:dateTime . + ex:s0 ex:longstr "%s" . + _:b1 ex:p0 _:b2 . + ex:g1 { ex:s1 ex:p0 ex:o0 . _:b1 ex:inGraph ex:g1 . } + """.formatted("z".repeat(200)); + File src = dir.resolve("ffm.trig").toFile(); + File h5 = dir.resolve("ffm.trig.h5").toFile(); + Files.write(src.toPath(), trig.getBytes(StandardCharsets.UTF_8)); + HDF5Writer.Builder().setSource(src).setDestination(h5) + .setSpatial(false).setFeatures(false).build().write(); + + // Baseline: today's ByteBuffer path. + Set[] expected = runProbes(h5); + + // Forced-FFM: every dataset larger than 0 bytes goes through MemorySegmentBytes. + long previous = DatasetBytes.setFfmThreshold(0); + try { + Set[] actual = runProbes(h5); + for (int i = 0; i < PROBES.length; i++) { + assertFalse(expected[i].isEmpty(), "probe must return rows: " + PROBES[i]); + assertEquals(expected[i], actual[i], + "FFM path must answer identically: " + PROBES[i]); + } + } finally { + DatasetBytes.setFfmThreshold(previous); + } + } + + @SuppressWarnings("unchecked") + private static Set[] runProbes(File h5) throws Exception { + Set[] results = new Set[PROBES.length]; + try (BeakGraph bg = new BeakGraph(new HDF5Reader(h5))) { + for (int i = 0; i < PROBES.length; i++) { + Set rows = new HashSet<>(); + try (QueryExecution qe = QueryExecution.dataset(bg.getDataset()) + .query(QueryFactory.create(PROBES[i])).build()) { + ResultSet rs = qe.execSelect(); + while (rs.hasNext()) { + QuerySolution qs = rs.next(); + StringBuilder sb = new StringBuilder(); + rs.getResultVars().forEach(v -> sb.append(v).append('=').append(qs.get(v)).append('|')); + rows.add(sb.toString()); + } + } + results[i] = rows; + } + } + return results; + } +} diff --git a/src/test/java/com/ebremer/beakgraph/io/RandomAccessBytesParityTest.java b/src/test/java/com/ebremer/beakgraph/io/RandomAccessBytesParityTest.java new file mode 100644 index 00000000..20d7f67d --- /dev/null +++ b/src/test/java/com/ebremer/beakgraph/io/RandomAccessBytesParityTest.java @@ -0,0 +1,110 @@ +package com.ebremer.beakgraph.io; + +import java.nio.ByteBuffer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Random; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.CleanupMode; +import org.junit.jupiter.api.io.TempDir; + +/** + * The two RandomAccessBytes implementations must be observably identical: + * every read (byte, big-endian long/float/double, bulk) at every offset - + * including unaligned and boundary offsets - returns the same value, and + * out-of-range offsets fail the same way. The FFM implementation is exercised + * over a real file mapping, at offset zero and at a non-zero base offset (the + * dataset-address case). + */ +class RandomAccessBytesParityTest { + + // NEVER + manual delete: auto-arena mappings unmap at GC, which on Windows + // can outlive JUnit's cleanup and fail the run over a locked temp file. + @TempDir(cleanup = CleanupMode.NEVER) + static Path dir; + + @AfterAll + static void tryCleanup() { + try (var files = Files.walk(dir)) { + files.sorted(java.util.Comparator.reverseOrder()).forEach(p -> { + p.toFile().deleteOnExit(); + try { Files.deleteIfExists(p); } catch (Exception ignored) {} + }); + } catch (Exception ignored) {} + } + + @Test + void implementationsAgreeAtEveryOffset() throws Exception { + Random rnd = new Random(99); + byte[] data = new byte[64 * 1024 + 13]; // deliberately not power-of-two + rnd.nextBytes(data); + Path f = dir.resolve("parity.bin"); + Files.write(f, data); + + RandomAccessBytes bb = new ByteBufferBytes(ByteBuffer.wrap(data)); + RandomAccessBytes seg = MemorySegmentBytes.map(f, 0, data.length); + + assertEquals(data.length, bb.size()); + assertEquals(data.length, seg.size()); + + // dense sweep near both ends plus random interior offsets + for (int i = 0; i < 512; i++) { + checkAt(bb, seg, i, data.length); + checkAt(bb, seg, data.length - 1 - i, data.length); + } + for (int i = 0; i < 5_000; i++) { + checkAt(bb, seg, rnd.nextLong(data.length), data.length); + } + + // bulk reads, including a full-array read + byte[] a = new byte[1024], b = new byte[1024]; + for (int i = 0; i < 200; i++) { + long off = rnd.nextLong(data.length - a.length); + bb.get(off, a, 0, a.length); + seg.get(off, b, 0, b.length); + assertArrayEquals(a, b, "bulk @" + off); + } + byte[] whole = new byte[data.length]; + seg.get(0, whole, 0, whole.length); + assertArrayEquals(data, whole, "full bulk read through the segment"); + + // identical failure mode out of range + assertThrows(IndexOutOfBoundsException.class, () -> bb.get(data.length)); + assertThrows(IndexOutOfBoundsException.class, () -> seg.get(data.length)); + assertThrows(IndexOutOfBoundsException.class, () -> bb.getLong(data.length - 4)); + assertThrows(IndexOutOfBoundsException.class, () -> seg.getLong(data.length - 4)); + assertThrows(IndexOutOfBoundsException.class, () -> seg.get(-1)); + } + + @Test + void nonZeroBaseOffsetMapsTheRightWindow() throws Exception { + Random rnd = new Random(7); + byte[] data = new byte[4096]; + rnd.nextBytes(data); + Path f = dir.resolve("offset.bin"); + Files.write(f, data); + + int base = 1234; // like a dataset's file address + RandomAccessBytes seg = MemorySegmentBytes.map(f, base, data.length - base); + assertEquals(data.length - base, seg.size()); + for (int i = 0; i < seg.size(); i++) { + assertEquals(data[base + i], seg.get(i), "byte @" + i); + } + } + + private static void checkAt(RandomAccessBytes bb, RandomAccessBytes seg, long off, int len) { + if (off < 0 || off >= len) return; + assertEquals(bb.get(off), seg.get(off), "byte @" + off); + if (off + Long.BYTES <= len) { + assertEquals(bb.getLong(off), seg.getLong(off), "long @" + off); + assertEquals(bb.getDouble(off), seg.getDouble(off), "double @" + off); + } + if (off + Float.BYTES <= len) { + assertEquals(bb.getFloat(off), seg.getFloat(off), "float @" + off); + } + } +}

    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 z%0A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 z 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

    tC`nl-8U9Wrzc6 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