package com.openMap1.mapper.query; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; import org.eclipse.emf.ecore.EPackage; import com.openMap1.mapper.core.MapperException; public class QueryManager { /** * Evaluate a query against a number of data sources, and set the results in each data source. * @param queryText * @param dataSources * @param errors * @param tracing * @return the query parser used for one of the data sources * @throws MapperException */ public static QueryParser evaluateQuery(String queryText, Vector<DataSource> dataSources, Vector<String[]> errors, boolean tracing, boolean mergeDuplicates) throws MapperException { boolean parsable = true; /* we now use the same query parser for all sources; all data sources must have the same class model, so use the first. */ EPackage classModel = dataSources.get(0).getMappedStructure().getClassModelRoot(); QueryParser queryParser = new QueryParserImpl_Ecore(classModel,"X",errors,tracing); parsable = queryParser.parse(queryText); //writeParserResult(queryParser); QueryStrategy queryStrategy = new QueryStrategyImpl(queryParser); queryStrategy.defineStrategy(); for (Iterator<DataSource> it = dataSources.iterator();it.hasNext();) { DataSource dataSource = it.next(); dataSource.unsetResult(); if (parsable) try { dataSource.setColumnHeaders(queryParser.getColumnHeaders(false)); QueryExecutor queryExecutor = new QueryExecutor(dataSource, queryParser, queryStrategy, false); queryExecutor.executeQuery(queryText,mergeDuplicates); dataSource.setResult(queryExecutor.resultVector(), queryExecutor.countVector()); } catch (Exception ex) { ex.printStackTrace(); recordError(dataSource.getCode(),ex.getMessage(),errors); } } return queryParser; } public static void recordError(String code,String message, Vector<String[]> errors) { String[] errorRow = new String[2]; errorRow[0] = code; errorRow[1] = message; errors.add(errorRow); } static void writeParserResult(QueryParser queryParser) { message("\nQuery classes " + queryParser.queryClasses().size()); for (int i = 0; i < queryParser.queryClasses().size();i++) message(queryParser.queryClasses().get(i).identifier()); message("\nLink associations " + queryParser.linkAssociations().size()); for (Enumeration<LinkAssociation> en = queryParser.linkAssociations().elements();en.hasMoreElements();) { LinkAssociation next = en.nextElement(); message("from " + next.startClass().identifier() + " to " + next.endClass().identifier()); } } static void message(String s) {System.out.println(s);} }