IrTripleLike.java
/*******************************************************************************
* Copyright (c) 2025 Eclipse RDF4J contributors.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Distribution License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*******************************************************************************/
package org.eclipse.rdf4j.queryrender.sparql.ir;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.rdf4j.query.algebra.Var;
import org.eclipse.rdf4j.queryrender.sparql.TupleExprIRRenderer;
/**
* Common abstraction for triple-like IR nodes that have subject/object variables and a textual predicate/path
* representation suitable for alternation merging.
*/
public abstract class IrTripleLike extends IrNode {
final Var subject;
IrNode subjectOverride;
final Var object;
IrNode objectOverride;
public IrTripleLike(Var subject, Var object, boolean newScope) {
super(newScope);
this.subject = subject;
this.object = object;
}
public IrTripleLike(Var subject, IrNode subjectOverride, Var object, IrNode objectOverride, boolean newScope) {
super(newScope);
this.subjectOverride = subjectOverride;
this.subject = subject;
this.object = object;
this.objectOverride = objectOverride;
}
public Var getSubject() {
return subject;
}
public Var getObject() {
return object;
}
public IrNode getSubjectOverride() {
return subjectOverride;
}
public void setSubjectOverride(IrNode subjectOverride) {
this.subjectOverride = subjectOverride;
}
public IrNode getObjectOverride() {
return objectOverride;
}
public void setObjectOverride(IrNode objectOverride) {
this.objectOverride = objectOverride;
}
/**
* Render the predicate or path as compact textual IR suitable for inclusion in a property path.
*
* For simple statement patterns this typically returns a compact IRI (possibly prefixed); for path triples it
* returns the already-rendered path text.
*
* Implementations should return null when no safe textual representation exists (e.g., non-constant predicate in a
* statement pattern).
*/
public abstract String getPredicateOrPathText(TupleExprIRRenderer r);
@Override
public Set<Var> getVars() {
HashSet<Var> out = new HashSet<>();
if (subject != null) {
out.add(subject);
}
if (object != null) {
out.add(object);
}
if (subjectOverride != null) {
out.addAll(subjectOverride.getVars());
}
if (objectOverride != null) {
out.addAll(objectOverride.getVars());
}
return out;
}
}