📄 dbqueryhandler.java
字号:
/*
(c) Copyright 2002, 2003, 2004, 2005, 2006, 2007 Hewlett-Packard Development Company, LP
[See end of file]
$Id: DBQueryHandler.java,v 1.24 2007/01/02 11:50:42 andy_seaborne Exp $
*/
package com.hp.hpl.jena.db.impl;
/**
An extension of SimpleQueryHandler for database-graphs.
@author wkw et al
*/
import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.graph.query.*;
import com.hp.hpl.jena.db.*;
import com.hp.hpl.jena.shared.JenaException;
import java.util.*;
public class DBQueryHandler extends SimpleQueryHandler {
/** the Graph this handler is working for */
private GraphRDB graph;
boolean queryOnlyStmt; // if true, query only asserted stmt (ignore reification)
boolean queryOnlyReif; // if true, query only reified stmt (ignore asserted)
boolean queryFullReif; // if true, ignore partially reified statements
private boolean doFastpath; // if true, enable fastpath optimization
private boolean doImplicitJoin; // if true, optimize (pushdown) implicit joins
// e.g., "(ur1 pred1 ?v1) (uri1 pred2 ?v2)" is an implicit join on uri1
/** make an instance, remember the graph */
public DBQueryHandler( GraphRDB graph )
{
super( graph );
this.graph = graph;
if (graph.reificationBehavior() == GraphRDB.OPTIMIZE_ALL_REIFICATIONS_AND_HIDE_NOTHING)
{
queryFullReif = queryOnlyReif = queryOnlyStmt = false;
}
else
{
queryFullReif = queryOnlyReif = false;
queryOnlyStmt = true;
}
doFastpath = true;
}
public void setDoFastpath ( boolean val )
{ doFastpath = val; }
public boolean getDoFastpath ()
{ return doFastpath; }
public void setDoImplicitJoin ( boolean val )
{ doImplicitJoin = val; }
/**
Answer a Stage that covers the given triple patterns. This may be a
default stage if pastpath is disabled, or a composite database stage
if fastpath is enabled. If we're lucky there will be a single database
stage if the entire triple pattern can be translated into a single SQL
statement.
*/
public Stage patternStage( Mapping varMap, ExpressionSet constraints, Triple[] givenTriples )
{
return avoidFastpath( constraints, givenTriples )
? super.patternStage( varMap, constraints, givenTriples )
: patternStageWithFullpath( varMap, constraints, givenTriples )
;
}
/**
Answer true iff we should avoid the fastpath code and instead fall back
on the default implementation in SimpleQueryHandler. Cases:
<ul>
<li>doFastPath is false [obviously]
<li>givenTriples is empty [establishes a useful invariant]
<li>there's just one givenTriple and the constrains are not Complex
</ul>
*/
private boolean avoidFastpath( ExpressionSet constraints, Triple[] givenTriples )
{
return
doFastpath == false
|| givenTriples.length == 0
|| (givenTriples.length == 1 && !constraints.isComplex())
;
}
/**
<code>givenTriples</code> is not empty.
*/
private Stage patternStageWithFullpath( Mapping varMap, ExpressionSet constraints, Triple[] givenTriples )
{
int i;
List stages = new ArrayList();
List patternsToDo = new ArrayList();
for (i = 0; i < givenTriples.length; i++) patternsToDo.add( new Integer( i ) );
DBPattern[] source = createDBPatterns( varMap, givenTriples );
//
while (patternsToDo.size() > 0)
{
DBPattern src = findCheapPattern( varMap, patternsToDo, source );
// now we have a pattern for the next stage.
List varList = new ArrayList(); // list of VarDesc
ExpressionSet evalCons = new ExpressionSet(); // constraints
// to eval
List queryPatterns = new ArrayList(); // list of DBPattern
queryPatterns.add( src );
boolean pushQueryIntoSQL = false;
// fastpath is only supported for patterns over one table.
if (src.isSingleSource())
{
src.addFreeVars( varList );
boolean didJoin = attemptJoiningOthers( patternsToDo, source, src, varList, queryPatterns );
// push down query if (1) there is a join OR if
// (2) there is no join but there is a constraint to
// eval on a single pattern.
// see if any constraints can be pushed down
if (didJoin)
pushQueryIntoSQL = true;
else
{
for (i = 0; i < varList.size(); i++)
{
VarDesc vx = (VarDesc) varList.get( i );
// see if any constraints on a result var.
// if so, push down constraint.
/*/ UNCOMMENT THE LINES BELOW TO ENABLE CONSTRAINT EVALUATION WITHIN THE DB. */
if ((vx.isArgVar == false) && findConstraints( constraints, evalCons, vx ))
pushQueryIntoSQL = true;
/* UNCOMMENT THE LINES ABOVE TO ENABLE CONSTRAINT EVALUATION WITHIN THE DB. */
}
}
if (pushQueryIntoSQL)
{
// add result vars to reslist for query
for (i = 0; i < varList.size(); i++)
{
VarDesc vx = (VarDesc) varList.get( i );
if (vx.isArgVar == false) vx.bindToVarMap( varMap );
}
}
}
else if (!src.hasSource())
pushQueryIntoSQL = true;
// hack to handle the case when no graphs match the pattern
Stage newStage = pushQueryIntoSQL
? new DBQueryStage( graph, src.hasSource() ? src.singleSource() : null, varList, queryPatterns, evalCons )
: super.patternStage( varMap, constraints, new Triple[] { src.pattern } )
;
// stages[stageCount++] = newStage;
stages.add( newStage );
}
return stages.size() == 1 ? (Stage) stages.get(0) : new StageSequence( stages );
}
/**
@param patternsToDo
@param source
@param src
@param varList
@param queryPatterns
@return
*/
private boolean attemptJoiningOthers( List patternsToDo, DBPattern[] source, DBPattern src, List varList, List queryPatterns )
{
boolean didJoin = false;
// see if other patterns can join with it.
while (true)
{
boolean foundJoin = false;
for (int i = 0; i < patternsToDo.size(); i++)
{
DBPattern candidate = source[((Integer) patternsToDo.get( i )).intValue()];
if (candidate.joinsWith( src, varList, queryOnlyStmt, queryOnlyReif, doImplicitJoin ))
{
queryPatterns.add( candidate );
patternsToDo.remove( i );
candidate.addFreeVars( varList );
candidate.setBusy();
foundJoin = didJoin = true;
}
}
if (foundJoin == false || patternsToDo.size() == 0) break;
}
// while (foundJoin && patternsToDo.size() > 0);
return didJoin;
}
/**
find the minimum cost pattern ... but always choose a connected
pattern over a disconnected pattern (to avoid cross-products).
There will always be a minimal cost pattern (because <code>sources</code>
is never empty).
*/
private DBPattern findCheapPattern( Mapping varMap, List patternsToDo, DBPattern[] sources )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -