/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package eu.espas.cql.trans;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;

/**
 * @author gathanas
 */
public class TransformationEngineTest {

    private static Logger _logger  = Logger.getLogger(TransformationEngine.class);
    
    private String obscollectionQuery = "select query from observationcollection";
    private Collection<String> cqlExpressions = new LinkedList<String>();
    
    private static final String[] expressionsArray = new String[]{
        "process=\"http://resources.espas-fp7.eu/acquisition/ROB/SWAPnominal/1\" AND phenomenonTime within/date \"2009-01-01 now\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/iasb/whisper2/1\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/iasb/whisper3/1\"",
//        "process=\"http://resources.espas-fp7.eu/compositeProcess/noa/athDig-artist/1\" AND observedProperty=\"http://ontology.espas-fp7.eu/compositeObservedProperty/noa-sao\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/uoulu/noaa06/1\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/uoulu/noaa17/1\"",
//        "process=\"http://resources.espas-fp7.eu/computation/noa/sirm/1\" AND observedProperty=\"http://ontology.espas-fp7.eu/observedProperty/CriticalFrequency_F2-Layer\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/iasb/whisper4/1\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/uoulu/noaa10/1\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/uoulu/noaa15/1\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/uoulu/noaa07/1\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/uoulu/noaa19/1\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/iasb/whisper1/1\"",
//        "process=\"http://resources.espas-fp7.eu/computation/ubirm/edam/1\"",
        "process=\"http://resources.espas-fp7.eu/acquisition/ROB/SWAPnominal/1\" AND phenomenonTime within \"2009-01-01 now\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/uoulu/metop02/1\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/noa/nasa-isis1/1\"",
//        "process=\"http://resources.espas-fp7.eu/computation/noa/Ne3D/1\"",
//        "process=\"http://resources.espas-fp7.eu/compositeProcess/noa/sirmup-lockwood/1\"",
//        "process=\"http://resources.espas-fp7.eu/computation/noa/sirm/1\" AND observedProperty=\"http://ontology.espas-fp7.eu/observedProperty/M_3000km_F2-Layer\"",
//        "process=\"http://resources.espas-fp7.eu/computation/noa/sirmup/1\" AND observedProperty=\"http://ontology.espas-fp7.eu/observedProperty/M_3000km_F2-Layer\"",
//        "process=\"http://resources.espas-fp7.eu/compositeProcess/noa/athDig-artist/1\" AND observedProperty=\"http://ontology.espas-fp7.eu/compositeObservedProperty/noa-ionogram\"",
//        "process=\"http://resources.espas-fp7.eu/computation/noa/sirmup/1\" AND observedProperty=\"http://ontology.espas-fp7.eu/observedProperty/CriticalFrequency_F2-Layer\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/noa/nasa-isis2/1\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/uoulu/noaa08/1\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/uoulu/noaa12/1\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/uoulu/noaa16/1\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/uoulu/noaa18/1\"",
//        "process=\"http://resources.espas-fp7.eu/acquisition/ucl/uclKEOPSobservatory-FPIgreen/1\"  OR process=\"http://resources.espas-fp7.eu/acquisition/ucl/uclKEOPSobservatory-FPIred/1\" OR process=\"http://resources.espas-fp7.eu/acquisition/ucl/uclSvalbardKHOobservatory-FPIred/1\" OR process=\"http://resources.espas-fp7.eu/acquisition/ucl/uclSvalbardKHOobservatory-FPIgreen/1\" OR process=\"http://resources.espas-fp7.eu/acquisition/ucl/uclSodankylaobservatory-FPI/1\"  OR  process=\"http://resources.espas-fp7.eu/acquisition/ucl/uclSvalbardAdventdalenobservatory-FPIred/1\"",
        "process=\"http://resources.espas-fp7.eu/computation/uleic/mappot/1\""
    };
            
    public TransformationEngineTest() {
//        try {
//            Class.forName("org.postgresql.Driver");
//            Connection dbConnection = DriverManager.getConnection("jdbc:postgresql://dl121.madgik.di.uoa.gr/dnet_espas_v2", "dnet", "dnetPwd");
//            Statement query  = dbConnection.createStatement();
//            ResultSet queryResults = query.executeQuery(obscollectionQuery);
//            while (queryResults.next()){
//                cqlExpressions.add(queryResults.getString("query"));
//            }
//            queryResults.close();
//            dbConnection.close();
//            
//        } catch (Exception ex) {
//            _logger.error("", ex);
//        } 
    }
    
    @Before
    public void setup(){
        if(cqlExpressions.isEmpty())
            cqlExpressions.addAll(Arrays.asList(expressionsArray));
    }
    
    @Test
    public void testGetQueryClause() {
        System.out.println("getQueryClause");
        for(String cql:cqlExpressions){
            try {
                String cqlExpression = cql;

                ESPASTransformationVisitor visitor = new ESPASTransformationVisitor();
                 visitor.setProjectionTerms(new HashSet(Arrays.asList("\"shadow\".observation.startdate")));
                TransformationEngine instance = new TransformationEngine(visitor);
                String result = instance.getQueryClause(cqlExpression);

                _logger.info(result);
            } catch (Exception ex) {
                _logger.error(null, ex);
            }
        }
        assert true;
    }

    @Test
    public void testGetConstraintClause() {
        System.out.println("getConstraintClause");
        for(String cql:cqlExpressions){
            String cqlExpression = cql;
            ESPASTransformationVisitor visitor = new ESPASTransformationVisitor();
             visitor.setProjectionTerms(new HashSet(Arrays.asList(new String[]{"\"shadow\".observation.startdate"})));
            TransformationEngine instance = new TransformationEngine(visitor);
			String result = null;
			try {
				result = instance.getConstraintClause(cqlExpression);
			} catch (CQLProcessingException e) {
				_logger.error(null, e);
			}
			_logger.info(result);
        }
        assert true;
    }
    
}
