Strabon

changeset 1546:9ee6935c722a

Add ASK queries support
author themis
date Tue Mar 06 13:45:29 2018 +0200 (2018-03-06)
parents 88f931e3a407
children 4c2fcc026c4c
files runtime/src/main/java/eu/earthobservatory/runtime/generaldb/Strabon.java
line diff
     1.1 --- a/runtime/src/main/java/eu/earthobservatory/runtime/generaldb/Strabon.java	Wed Oct 25 14:17:39 2017 +0300
     1.2 +++ b/runtime/src/main/java/eu/earthobservatory/runtime/generaldb/Strabon.java	Tue Mar 06 13:45:29 2018 +0200
     1.3 @@ -27,11 +27,13 @@
     1.4  import org.openrdf.query.QueryEvaluationException;
     1.5  import org.openrdf.query.QueryLanguage;
     1.6  import org.openrdf.query.TupleQuery;
     1.7 +import org.openrdf.query.BooleanQuery;
     1.8  import org.openrdf.query.TupleQueryResult;
     1.9  import org.openrdf.query.TupleQueryResultHandlerException;
    1.10  import org.openrdf.query.Update;
    1.11  import org.openrdf.query.UpdateExecutionException;
    1.12  import org.openrdf.query.resultio.TupleQueryResultWriter;
    1.13 +import org.openrdf.query.resultio.BooleanQueryResultWriter;
    1.14  import org.openrdf.repository.RepositoryException;
    1.15  import org.openrdf.repository.sail.SailRepository;
    1.16  import org.openrdf.repository.sail.SailRepositoryConnection;
    1.17 @@ -45,6 +47,8 @@
    1.18  import eu.earthobservatory.utils.Format;
    1.19  import eu.earthobservatory.utils.RDFHandlerFactory;
    1.20  import eu.earthobservatory.utils.stSPARQLQueryResultToFormatAdapter;
    1.21 +import org.openrdf.query.resultio.sparqlxml.SPARQLBooleanXMLWriter;
    1.22 +import org.openrdf.query.resultio.text.BooleanTextWriter;
    1.23  
    1.24  public abstract class Strabon {
    1.25  
    1.26 @@ -218,7 +222,7 @@
    1.27  			
    1.28  		}
    1.29  		
    1.30 -		return ret;	
    1.31 +		return ret;
    1.32  	}
    1.33  
    1.34  	public Object query(String queryString, Format resultsFormat, SailRepositoryConnection con, OutputStream out)
    1.35 @@ -235,62 +239,126 @@
    1.36  		}
    1.37  		
    1.38  		TupleQuery tupleQuery = null;
    1.39 +		BooleanQuery askQuery = null;
    1.40 +		Boolean isAskQuery = false;
    1.41  		try {
    1.42  			tupleQuery = con.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
    1.43 -			
    1.44 -		} catch (RepositoryException e) {
    1.45 -			logger.error("[Strabon.query] Error in preparing tuple query.", e);
    1.46 -			status = false;
    1.47 +		} catch (Exception e1) {
    1.48 +				try {
    1.49 +					askQuery = con.prepareBooleanQuery(QueryLanguage.SPARQL, queryString);
    1.50 +					isAskQuery = true;
    1.51 +				} catch (Exception e2) {
    1.52 +					logger.error("[Strabon.query] Error in preparing tuple or ask query.", e2);
    1.53 +					status = false;
    1.54 +				}
    1.55  		}
    1.56  		
    1.57  		if (logger.isDebugEnabled()) {
    1.58  			logger.debug("Serializing results ({})", resultsFormat.name());
    1.59  		}
    1.60 -		
    1.61 -		TupleQueryResult result = null;
    1.62 -		switch (resultsFormat) {
    1.63 -			case EXP:
    1.64 -				long results = 0;
    1.65 +		if (!isAskQuery) {
    1.66 +			TupleQueryResult result = null;
    1.67 +			switch (resultsFormat) {
    1.68 +				case EXP:
    1.69 +					long results = 0;
    1.70 +					
    1.71 +					long t1 = System.nanoTime();
    1.72 +					result = tupleQuery.evaluate();
    1.73 +					long t2 = System.nanoTime();
    1.74 +					
    1.75 +					while (result.hasNext()) {
    1.76 +						results++;
    1.77 +						result.next();
    1.78 +					}
    1.79 +					
    1.80 +					long t3 = System.nanoTime();
    1.81 +
    1.82 +					logger.info((t2-t1)+" + "+(t3-t2)+" = "+(t3-t1)+" | "+results);
    1.83 +					return new long[]{t2-t1, t3-t2, t3-t1, results};
    1.84 +	//				break;
    1.85  				
    1.86 -				long t1 = System.nanoTime();
    1.87 -				result = tupleQuery.evaluate();
    1.88 -				long t2 = System.nanoTime();
    1.89 -				
    1.90 -				while (result.hasNext()) {
    1.91 -					results++;
    1.92 -					result.next();
    1.93 +				case TUQU:
    1.94 +					
    1.95 +					return tupleQuery;
    1.96 +	//				break;	
    1.97 +				case PIECHART:
    1.98 +					return tupleQuery.evaluate();
    1.99 +					
   1.100 +				case AREACHART:
   1.101 +					return tupleQuery.evaluate();
   1.102 +
   1.103 +				case COLUMNCHART:
   1.104 +					return tupleQuery.evaluate();
   1.105 +					
   1.106 +				default:
   1.107 +					// get the writer for the specified format
   1.108 +					TupleQueryResultWriter resultWriter = stSPARQLQueryResultToFormatAdapter.createstSPARQLQueryResultWriter(resultsFormat, out);
   1.109 +					
   1.110 +					// check for null format
   1.111 +					if (resultWriter == null) {
   1.112 +						logger.error("[Strabon.query] Invalid format.");
   1.113 +						return false;
   1.114 +					}
   1.115 +					
   1.116 +					tupleQuery.evaluate(resultWriter);
   1.117 +			}
   1.118 +		} else {
   1.119 +				Boolean result = false;
   1.120 +				switch (resultsFormat) {
   1.121 +					case EXP:
   1.122 +						long results = 0;
   1.123 +						long t1 = System.nanoTime();
   1.124 +						result = askQuery.evaluate();
   1.125 +						long t2 = System.nanoTime();
   1.126 +						long t3 = System.nanoTime();
   1.127 +
   1.128 +						logger.info((t2-t1)+" + "+(t3-t2)+" = "+(t3-t1)+" | "+"1");
   1.129 +						return new long[]{t2-t1, t3-t2, t3-t1, results};
   1.130 +					case TUQU:
   1.131 +						return askQuery;
   1.132 +					case PIECHART:
   1.133 +						return askQuery.evaluate();
   1.134 +
   1.135 +					case AREACHART:
   1.136 +						return askQuery.evaluate();
   1.137 +
   1.138 +					case COLUMNCHART:
   1.139 +						return askQuery.evaluate();
   1.140 +
   1.141 +					default:
   1.142 +						result = askQuery.evaluate();
   1.143 +						BooleanQueryResultWriter writer = null;
   1.144 +						String output = null;
   1.145 +						switch(resultsFormat) {
   1.146 +							case SESAME_JSON:
   1.147 +								output = "{\n \"head\": {},\n \"boolean\":" + String.valueOf(result) + "\n}";
   1.148 +								out.write(output.getBytes());
   1.149 +								break;
   1.150 +							case XML:
   1.151 +							case SESAME_XML:
   1.152 +								writer = new SPARQLBooleanXMLWriter(out);
   1.153 +								writer.write(result);
   1.154 +								break;
   1.155 +							case TSV:
   1.156 +							case DEFAULT:
   1.157 +							case SESAME_CSV:
   1.158 +							case SESAME_TSV:
   1.159 +								output = "\"bool\"\n" + (result ? "1" : "0") + "\n";
   1.160 +								out.write(output.getBytes());
   1.161 +								break;
   1.162 +							case HTML:
   1.163 +								writer = new BooleanTextWriter(out);
   1.164 +								writer.write(result);
   1.165 +								break;
   1.166 +							case SESAME_BINARY:
   1.167 +								output = (result ? "1" : "0");
   1.168 +								out.write(output.getBytes());
   1.169 +								break;
   1.170 +							default:
   1.171 +								logger.error("[Strabon.query] Invalid format.");
   1.172 +								return false;
   1.173 +						}
   1.174  				}
   1.175 -				
   1.176 -				long t3 = System.nanoTime();
   1.177 -
   1.178 -				logger.info((t2-t1)+" + "+(t3-t2)+" = "+(t3-t1)+" | "+results);
   1.179 -				return new long[]{t2-t1, t3-t2, t3-t1, results};
   1.180 -//				break;
   1.181 -			
   1.182 -			case TUQU:
   1.183 -				
   1.184 -				return tupleQuery;
   1.185 -//				break;	
   1.186 -			case PIECHART:
   1.187 -				return tupleQuery.evaluate();
   1.188 -				
   1.189 -			case AREACHART:
   1.190 -				return tupleQuery.evaluate();
   1.191 -
   1.192 -			case COLUMNCHART:
   1.193 -				return tupleQuery.evaluate();
   1.194 -				
   1.195 -			default:
   1.196 -				// get the writer for the specified format
   1.197 -				TupleQueryResultWriter resultWriter = stSPARQLQueryResultToFormatAdapter.createstSPARQLQueryResultWriter(resultsFormat, out);
   1.198 -				
   1.199 -				// check for null format
   1.200 -				if (resultWriter == null) {
   1.201 -					logger.error("[Strabon.query] Invalid format.");
   1.202 -					return false;
   1.203 -				}
   1.204 -				
   1.205 -				tupleQuery.evaluate(resultWriter);
   1.206  		}
   1.207  
   1.208  		return status;