Skip to content
Snippets Groups Projects
Commit cb6eff4e authored by gmantele's avatar gmantele
Browse files

[TAP] Add a creation function for ADQLParser in the TAP factory.

parent 35d497ae
No related branches found
No related tags found
No related merge requests found
......@@ -44,7 +44,6 @@ import uws.service.log.UWSLog.LogLevel;
import adql.parser.ADQLParser;
import adql.parser.ADQLQueryFactory;
import adql.parser.ParseException;
import adql.parser.QueryChecker;
import adql.query.ADQLQuery;
/**
......@@ -508,18 +507,22 @@ public class ADQLExecutor {
// Log the start of the parsing:
logger.logTAP(LogLevel.INFO, report, "PARSING", "Parsing ADQL: " + tapParams.getQuery().replaceAll("(\t|\r?\n)+", " "), null);
// Get the ADQL factory:
ADQLQueryFactory queryFactory = service.getFactory().createQueryFactory();
// Create the ADQL parser:
ADQLParser parser = service.getFactory().createADQLParser();
if (parser == null){
logger.logTAP(LogLevel.WARNING, null, "PARSING", "No ADQL parser returned by the TAPFactory! The default implementation is used instead.", null);
parser = new ADQLParser();
}
// Set the ADQL factory:
if (parser.getQueryFactory() == null || parser.getQueryFactory().getClass() == ADQLQueryFactory.class)
parser.setQueryFactory(service.getFactory().createQueryFactory());
// Get the query checker:
QueryChecker queryChecker = service.getFactory().createQueryChecker(uploadSchema);
// Set the query checker:
if (parser.getQueryChecker() == null)
parser.setQueryChecker(service.getFactory().createQueryChecker(uploadSchema));
// Parse the ADQL query:
ADQLParser parser;
if (queryFactory == null)
parser = new ADQLParser(queryChecker);
else
parser = new ADQLParser(queryChecker, queryFactory);
ADQLQuery query = parser.parseQuery(tapParams.getQuery());
// Set or check the row limit:
......
......@@ -43,6 +43,7 @@ import uws.service.UWSService;
import uws.service.backup.UWSBackupManager;
import uws.service.error.ServiceErrorWriter;
import adql.db.DBChecker;
import adql.parser.ADQLParser;
import adql.parser.ADQLQueryFactory;
import adql.parser.ParseException;
import adql.parser.QueryChecker;
......@@ -53,7 +54,7 @@ import adql.query.ADQLQuery;
* Only the functions related with the database connection stay abstract.
*
* @author Grégory Mantelet (CDS;ARI)
* @version 2.0 (02/2015)
* @version 2.0 (04/2015)
*/
public abstract class AbstractTAPFactory extends TAPFactory {
......@@ -112,6 +113,16 @@ public abstract class AbstractTAPFactory extends TAPFactory {
return new ADQLExecutor(service);
}
/**
* <p><i>Note:
* This function should be extended if you want to customize the ADQL grammar.
* </i></p>
*/
@Override
public ADQLParser createADQLParser() throws TAPException{
return new ADQLParser();
}
/**
* <p><i>Note:
* This function should be extended if you have customized the creation of any
......
......@@ -42,6 +42,7 @@ import uws.service.backup.UWSBackupManager;
import uws.service.error.ServiceErrorWriter;
import uws.service.file.UWSFileManager;
import uws.service.request.RequestParser;
import adql.parser.ADQLParser;
import adql.parser.ADQLQueryFactory;
import adql.parser.QueryChecker;
import adql.query.ADQLQuery;
......@@ -56,11 +57,13 @@ import adql.query.ADQLQuery;
* <li>whether and how UWS/asynchronous jobs must be backuped and restored? <i>({@link UWSBackupManager})</i></li>
* <li>how to create asynchronous jobs? <i>({@link TAPJob})</i></li>
* <li>whether and how tables must be updated? <i>({@link Uploader})</i></li>
* <li>how to execute an ADQL query? <i>({@link ADQLExecutor})</i>
* <li>how to parser an ADQL query? <i>({@link ADQLParser})</i></li>
* <li>how to check ADQL queries? <i>({@link QueryChecker})</i></li>
* </ul>
*
* @author Gr&eacute;gory Mantelet (CDS;ARI)
* @version 2.0 (02/2015)
* @version 2.0 (04/2015)
*/
public abstract class TAPFactory implements UWSFactory {
......@@ -177,9 +180,37 @@ public abstract class TAPFactory implements UWSFactory {
*/
public abstract ADQLExecutor createADQLExecutor() throws TAPException;
/**
* <p>Create a parser of ADQL query.</p>
*
* <p><i>Warning:
* This parser can be created with a query factory and/or a query checker.
* {@link #createQueryFactory()} will be used only if the default query factory (or none) is set
* in the ADQL parser returned by this function.
* Idem for {@link #createQueryChecker(TAPSchema)}: it will used only if no query checker is set
* in the returned ADQL parser.
* </i></p>
*
* <p><i>Note:
* A default implementation is provided by {@link AbstractTAPFactory}.
* </i></p>
*
* @return An ADQL query parser.
*
* @throws TAPException If any error occurs while creating an ADQL parser.
*
* @since 2.0
*/
public abstract ADQLParser createADQLParser() throws TAPException;
/**
* <p>Create a factory able to build every part of an {@link ADQLQuery} object.</p>
*
* <p><i>Warning:
* This function is used only if the default query factory (or none) is set in the ADQL parser
* returned by {@link #createADQLParser()}.
* </i></p>
*
* <p><i>Note:
* A default implementation is provided by {@link AbstractTAPFactory}
* </i></p>
......@@ -195,6 +226,11 @@ public abstract class TAPFactory implements UWSFactory {
* That's to say, it checks whether the tables and columns used in the query really exist
* in the database.</p>
*
* <p><i>Warning:
* This function is used only if no query checker is set in the ADQL parser
* returned by {@link #createADQLParser()}.
* </i></p>
*
* <p><i>Note:
* A default implementation is provided by {@link AbstractTAPFactory}
* </i></p>
......
......@@ -695,8 +695,12 @@
<td>
<p>Class to use in replacement of the default TAPFactory.</p>
<p>
This property must be a class name (given between {...}). It must reference an extension of the abstract TAPFactory.
This extension must have at least one constructor with exactly one parameter of type ServiceConnection.
This property must be a class name (given between {...}). It must reference an implementation of TAPFactory.
This implementation must have at least one constructor with exactly one parameter of type ServiceConnection.
</p>
<p>
It is recommended to extend an existing implementation such as:
tap.AbstractTAPFactory or tap.config.ConfigurableTAPFactory.
</p>
<p><em>By default, the default TAPFactory (tap.config.ConfigurableTAPFactory) is used and may use all properties related to the backup management,
the database access and the ADQL translation.</em></p>
......
......@@ -2,7 +2,7 @@
# FULL TAP CONFIGURATION FILE #
# #
# TAP Version: 2.0 #
# Date: 8 April 2015 #
# Date: 9 April 2015 #
# Author: Gregory Mantelet (ARI) #
# #
##########################################################
......@@ -519,8 +519,11 @@ additional_resources =
# [OPTIONAL]
# Class to use in replacement of the default TAPFactory.
#
# This property must be a class name (given between {...}). It must reference an extension of the abstract TAPFactory.
# This extension must have at least one constructor with exactly one parameter of type ServiceConnection.
# This property must be a class name (given between {...}). It must reference an implementation of TAPFactory.
# This implementation must have at least one constructor with exactly one parameter of type ServiceConnection.
#
# It is recommended to extend an existing implementation such as:
# tap.AbstractTAPFactory or tap.config.ConfigurableTAPFactory.
#
# By default, the default TAPFactory (tap.config.ConfigurableTAPFactory) is used and may use all properties related to the backup management,
# the database access and the ADQL translation.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment