Mercurial > lada > lada-server
diff src/main/java/de/intevation/lada/query/QueryTools.java @ 848:c2725534f08b
Services no use the database based query filter.
author | Raimund Renkert <raimund.renkert@intevation.de> |
---|---|
date | Wed, 27 Jan 2016 14:54:28 +0100 |
parents | 5155b0b375cd |
children | c3a5e1ee63b8 |
line wrap: on
line diff
--- a/src/main/java/de/intevation/lada/query/QueryTools.java Wed Jan 27 14:52:44 2016 +0100 +++ b/src/main/java/de/intevation/lada/query/QueryTools.java Wed Jan 27 14:54:28 2016 +0100 @@ -7,7 +7,6 @@ */ package de.intevation.lada.query; -import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.util.ArrayList; @@ -16,15 +15,26 @@ import java.util.Map; import java.util.Scanner; +import javax.inject.Inject; import javax.json.Json; import javax.json.JsonArray; import javax.json.JsonException; import javax.json.JsonObject; import javax.json.JsonReader; import javax.persistence.EntityManager; -import javax.persistence.Query; import javax.ws.rs.core.MultivaluedMap; +import org.apache.log4j.Logger; + +import de.intevation.lada.model.stamm.Filter; +import de.intevation.lada.model.stamm.Query; +import de.intevation.lada.model.stamm.Result; +import de.intevation.lada.util.annotation.RepositoryConfig; +import de.intevation.lada.util.data.QueryBuilder; +import de.intevation.lada.util.data.Repository; +import de.intevation.lada.util.data.RepositoryType; +import de.intevation.lada.util.rest.Response; + /** * Utility class to handle the SQL query configuration. @@ -33,9 +43,18 @@ */ public class QueryTools { + + @Inject + @RepositoryConfig(type=RepositoryType.RO) + private Repository repository; + private static String PROBE_CONFIG = "/probequery.json"; private static String MESSPROGRAMM_CONFIG = "/messprogrammquery.json"; private static String STAMMDATEN_CONFIG = "/stammdatenquery.json"; + + @Inject + private Logger logger; + /** * Read the config file using the system property * "de.intevation.lada.sqlconfig". @@ -154,33 +173,74 @@ } } - public static Query prepareQuery( + public List<Map<String, Object>> getResultForQuery(MultivaluedMap<String, String> params, Integer qId, String type) { + QueryBuilder<Query> builder = new QueryBuilder<Query>( + repository.entityManager("stamm"), + Query.class + ); + builder.and("id", qId); + Query query = repository.filterPlain(builder.getQuery(), "stamm").get(0); + if (!query.getType().equals(type)) { + return null; + } + + String sql = query.getSql(); + + List<Filter> filters = query.getFilters(); + QueryBuilder<Result> rBuilder = new QueryBuilder<Result>( + repository.entityManager("stamm"), + Result.class + ); + rBuilder.and("query", qId); + rBuilder.orderBy("index", true); + List<Result> results = repository.filterPlain(rBuilder.getQuery(), "stamm"); + Result idResult = new Result(); + idResult.setDataIndex("id"); + results.add(0, idResult); + if (params.containsKey("sort")) { + String sort = params.getFirst("sort"); + logger.debug("Sort parameter: " + sort); + JsonReader reader = Json.createReader(new StringReader(sort)); + JsonObject sortProperties = reader.readArray().getJsonObject(0); + sql += " ORDER BY "; + sql += sortProperties.getJsonString("property").getString() + " "; + sql += sortProperties.getJsonString("direction").getString(); + } + javax.persistence.Query q = prepareQuery( + sql, + filters, + params, + repository.entityManager("land")); + return prepareResult(q.getResultList(), results); + } + + public javax.persistence.Query prepareQuery( String sql, - List<String> filters, + List<Filter> filters, MultivaluedMap<String, String> params, EntityManager manager ) { - Query query = manager.createNativeQuery(sql); - for (String filter: filters) { - List<String> param = params.get(filter); + javax.persistence.Query query = manager.createNativeQuery(sql); + for (Filter filter: filters) { + List<String> param = params.get(filter.getDataIndex()); List<String> clean = new ArrayList<String>(); for(String p : param) { clean.add(p.replace(",", "|")); } - query.setParameter(filter, clean); + query.setParameter(filter.getDataIndex(), clean); } return query; } - public static List<Map<String, Object>> prepareResult( + public List<Map<String, Object>> prepareResult( List<Object[]> result, - List<String> names + List<Result> names ) { List<Map<String, Object>> ret = new ArrayList<Map<String, Object>>(); for (Object[] row: result) { Map<String, Object> set = new HashMap<String, Object>(); for (int i = 0; i < row.length; i++) { - set.put(names.get(i), row[i]); + set.put(names.get(i).getDataIndex(), row[i]); } ret.add(set); }