Hi Alexandre,
I neglected to mention that we are using SPRING and HIBERNATE on the backend. Below is the code for our SchedQryHelper:
package gov.faa.aim.domain.dao;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.LogFactory;
/*
* If you need a SQL where clause, call the getWhere() method
* If you need a CQL clause for ach time band, call the getCQL()method
*/
* If you need a SQL where clause, call the getWhere() method
* If you need a CQL clause for ach time band, call the getCQL()method
*/
public class SchedQryHelper {
protected final Log logger = LogFactory.getLog(getClass());
private final String ALT_SUR10K = "(low_altitude>-1 AND low_altitude<101)";
private final String ALT_10K18K = "((low_altitude>99 AND low_altitude<180) OR (high_altitude>99 AND high_altitude<180) OR (low_altitude<99 AND high_altitude>180))";
private final String ALT_18K28K = "((low_altitude>179 AND low_altitude<290) OR (high_altitude>179 AND high_altitude<290) OR (low_altitude<179 AND high_altitude>290))";
private final String ALT_29K34K = "((low_altitude>289 AND low_altitude<350) OR (high_altitude>289 AND high_altitude<350) OR (low_altitude<289 AND high_altitude>350))";
private final String ALT_35K60K = "((low_altitude>349 AND low_altitude<1000) OR (high_altitude>349 AND high_altitude<1000))";
/*
* The following snippets of SQL are used to generate a SQL query that match the parameter selection arrays
*/
private final String TIM_ACTNOW = "(START_TIME<NOW() AND end_time>NOW())";
private final String TIM_1H = "(START_TIME>NOW() AND START_TIME<(NOW()+ interval '1 hour'))";
private final String TIM_1H2H = "(START_TIME>(NOW()+ interval '1 hour') AND START_TIME<(NOW()+ interval '2 hours'))";
private final String TIM_2H4H = "(START_TIME>(NOW()+ interval '2 hours') AND START_TIME<(NOW()+ interval '4 hours'))";
private final String TIM_4H8H = "(START_TIME>(NOW()+ interval '4 hours') AND START_TIME<(NOW()+ interval '8 hours'))";
//below was: private final String TIM_8H24H = "(START_TIME>(NOW()+ interval '8 hours') AND START_TIME<(NOW()+ interval '1 day'))";
//allow start times > 24 hrs away to be included
private final String TIM_8H24H = "(START_TIME>(NOW()+ interval '8 hours'))";
private final String TIM_NONE = "(START_TIME is null)";
private final String ALT_10K18K = "((low_altitude>99 AND low_altitude<180) OR (high_altitude>99 AND high_altitude<180) OR (low_altitude<99 AND high_altitude>180))";
private final String ALT_18K28K = "((low_altitude>179 AND low_altitude<290) OR (high_altitude>179 AND high_altitude<290) OR (low_altitude<179 AND high_altitude>290))";
private final String ALT_29K34K = "((low_altitude>289 AND low_altitude<350) OR (high_altitude>289 AND high_altitude<350) OR (low_altitude<289 AND high_altitude>350))";
private final String ALT_35K60K = "((low_altitude>349 AND low_altitude<1000) OR (high_altitude>349 AND high_altitude<1000))";
/*
* The following snippets of SQL are used to generate a SQL query that match the parameter selection arrays
*/
private final String TIM_ACTNOW = "(START_TIME<NOW() AND end_time>NOW())";
private final String TIM_1H = "(START_TIME>NOW() AND START_TIME<(NOW()+ interval '1 hour'))";
private final String TIM_1H2H = "(START_TIME>(NOW()+ interval '1 hour') AND START_TIME<(NOW()+ interval '2 hours'))";
private final String TIM_2H4H = "(START_TIME>(NOW()+ interval '2 hours') AND START_TIME<(NOW()+ interval '4 hours'))";
private final String TIM_4H8H = "(START_TIME>(NOW()+ interval '4 hours') AND START_TIME<(NOW()+ interval '8 hours'))";
//below was: private final String TIM_8H24H = "(START_TIME>(NOW()+ interval '8 hours') AND START_TIME<(NOW()+ interval '1 day'))";
//allow start times > 24 hrs away to be included
private final String TIM_8H24H = "(START_TIME>(NOW()+ interval '8 hours'))";
private final String TIM_NONE = "(START_TIME is null)";
/*
* The folowing variables are used to generate a CQL query that is passed to geoserver
* and then used to generate the images with time based color realization
*/
private String QTIM_ACTNOW = null;
private String QTIM_1H = null;
private String QTIM_1H2H = null;
private String QTIM_2H4H = null;
private String QTIM_4H8H = null;
private String QTIM_8H24H = null;
private String QTIM_NONE = null;
* The folowing variables are used to generate a CQL query that is passed to geoserver
* and then used to generate the images with time based color realization
*/
private String QTIM_ACTNOW = null;
private String QTIM_1H = null;
private String QTIM_1H2H = null;
private String QTIM_2H4H = null;
private String QTIM_4H8H = null;
private String QTIM_8H24H = null;
private String QTIM_NONE = null;
private LinkedHashMap<String, String> altQry = null;
private LinkedHashMap<String, String> actQry = null;
private LinkedHashMap<String, String> qactQry = null;
private LinkedHashMap<String, String> typeRef = null;
private LinkedHashMap<String, String> actQry = null;
private LinkedHashMap<String, String> qactQry = null;
private LinkedHashMap<String, String> typeRef = null;
// provide default values
private String[] alts = {
"surf_10",
"10_17",
"FL180_FL280"};
private String[] d_alts = new String[alts.length];
private String[] times = {
"active",
"_1hour",
"1h_2h",
"2h_4h",
"4h_8h" };
private String[] d_times = new String[times.length];
private String[] alts = {
"surf_10",
"10_17",
"FL180_FL280"};
private String[] d_alts = new String[alts.length];
private String[] times = {
"active",
"_1hour",
"1h_2h",
"2h_4h",
"4h_8h" };
private String[] d_times = new String[times.length];
private String[] types = {
"atcaa",
"aerial_rr",
"alert",
"moa",
"other",
"prohibited",
"restricted",
"warning"};
private String[] d_types = new String[types.length];
"atcaa",
"aerial_rr",
"alert",
"moa",
"other",
"prohibited",
"restricted",
"warning"};
private String[] d_types = new String[types.length];
private static SimpleDateFormat fmtY = new SimpleDateFormat("yyyy-MM-dd");
private static SimpleDateFormat fmtT = new SimpleDateFormat("HH:mm:ss");
private GregorianCalendar time = null;
public SchedQryHelper() {
time =new GregorianCalendar();
String now0 = fmtY.format(time.getTime())+"T"+fmtT.format(time.getTime())+"Z";
time.add(Calendar.HOUR, 1);
String now1 = fmtY.format(time.getTime())+"T"+fmtT.format(time.getTime())+"Z";
time.add(Calendar.HOUR, 1);
String now2 = fmtY.format(time.getTime())+"T"+fmtT.format(time.getTime())+"Z";
time.add(Calendar.HOUR, 2);
String now4 = fmtY.format(time.getTime())+"T"+fmtT.format(time.getTime())+"Z";
time.add(Calendar.HOUR, 4);
String now8 = fmtY.format(time.getTime())+"T"+fmtT.format(time.getTime())+"Z";
private static SimpleDateFormat fmtT = new SimpleDateFormat("HH:mm:ss");
private GregorianCalendar time = null;
public SchedQryHelper() {
time =new GregorianCalendar();
String now0 = fmtY.format(time.getTime())+"T"+fmtT.format(time.getTime())+"Z";
time.add(Calendar.HOUR, 1);
String now1 = fmtY.format(time.getTime())+"T"+fmtT.format(time.getTime())+"Z";
time.add(Calendar.HOUR, 1);
String now2 = fmtY.format(time.getTime())+"T"+fmtT.format(time.getTime())+"Z";
time.add(Calendar.HOUR, 2);
String now4 = fmtY.format(time.getTime())+"T"+fmtT.format(time.getTime())+"Z";
time.add(Calendar.HOUR, 4);
String now8 = fmtY.format(time.getTime())+"T"+fmtT.format(time.getTime())+"Z";
altQry = new LinkedHashMap<String, String>(5);
altQry.put("surf_10", ALT_SUR10K);
altQry.put("10_17", ALT_10K18K);
altQry.put("FL180_FL280", ALT_18K28K);
altQry.put("FL290_FL340", ALT_29K34K);
altQry.put("FL350_FL600", ALT_35K60K);
altQry.put("surf_10", ALT_SUR10K);
altQry.put("10_17", ALT_10K18K);
altQry.put("FL180_FL280", ALT_18K28K);
altQry.put("FL290_FL340", ALT_29K34K);
altQry.put("FL350_FL600", ALT_35K60K);
actQry = new LinkedHashMap<String, String>(7);
actQry.put("active", TIM_ACTNOW);
actQry.put("_1hour", TIM_1H);
actQry.put("1h_2h", TIM_1H2H);
actQry.put("2h_4h", TIM_2H4H);
actQry.put("4h_8h", TIM_4H8H);
actQry.put("8h_24h", TIM_8H24H);
actQry.put("notsched", TIM_NONE);
actQry.put("active", TIM_ACTNOW);
actQry.put("_1hour", TIM_1H);
actQry.put("1h_2h", TIM_1H2H);
actQry.put("2h_4h", TIM_2H4H);
actQry.put("4h_8h", TIM_4H8H);
actQry.put("8h_24h", TIM_8H24H);
actQry.put("notsched", TIM_NONE);
QTIM_ACTNOW = "(start_time before "+now0+" AND end_time after "+now0+" )";
QTIM_1H = "(start_time after "+now0+" and start_time before "+now1+" )";
QTIM_1H2H = "(start_time after "+now1+" and start_time before "+now2+" )";
QTIM_2H4H = "(start_time after "+now2+" and start_time before "+now4+" )";
QTIM_4H8H = "(start_time after "+now4+" and start_time before "+now8+" )";
//below was: private final String TIM_8H24H = "(start_time>(NOW()+ interval '8 hours') AND start_time<(NOW()+ interval '1 day'))";
//allow start times > 24 hrs away to be included
QTIM_8H24H = "(start_time after "+now8+" )";
QTIM_NONE = "(start_time is null)";
QTIM_1H = "(start_time after "+now0+" and start_time before "+now1+" )";
QTIM_1H2H = "(start_time after "+now1+" and start_time before "+now2+" )";
QTIM_2H4H = "(start_time after "+now2+" and start_time before "+now4+" )";
QTIM_4H8H = "(start_time after "+now4+" and start_time before "+now8+" )";
//below was: private final String TIM_8H24H = "(start_time>(NOW()+ interval '8 hours') AND start_time<(NOW()+ interval '1 day'))";
//allow start times > 24 hrs away to be included
QTIM_8H24H = "(start_time after "+now8+" )";
QTIM_NONE = "(start_time is null)";
qactQry = new LinkedHashMap<String, String>(7);
qactQry.put("active", QTIM_ACTNOW);
qactQry.put("_1hour", QTIM_1H);
qactQry.put("1h_2h", QTIM_1H2H);
qactQry.put("2h_4h", QTIM_2H4H);
qactQry.put("4h_8h", QTIM_4H8H);
qactQry.put("8h_24h", QTIM_8H24H);
qactQry.put("notsched", QTIM_NONE);
typeRef = new LinkedHashMap<String, String>(18);
typeRef.put("atcaa", "A");
typeRef.put("aerial_rr", "AR");
typeRef.put("alert", "L");
typeRef.put("moa", "M");
typeRef.put("other", "O");
typeRef.put("prohibited", "P");
typeRef.put("restricted", "R");
typeRef.put("warning", "W");
typeRef.put("inst_rte", "IR");
typeRef.put("visual_rte", "VR");
typeRef.put("slow_rte", "SR");
typeRef.put("spaceflight", "SPC");
typeRef.put("airshow_spevt", "EVT");
typeRef.put("hazards", "HAZ");
typeRef.put("hidis", "HID");
typeRef.put("security", "SEC");
typeRef.put("srch_res", "SAR");
typeRef.put("vip", "VIP");
typeRef.put("special", "SPL");
System.arraycopy(alts, 0, d_alts, 0, alts.length);
System.arraycopy(times, 0, d_times, 0, times.length);
System.arraycopy(types, 0, d_types, 0, types.length);
}
qactQry.put("active", QTIM_ACTNOW);
qactQry.put("_1hour", QTIM_1H);
qactQry.put("1h_2h", QTIM_1H2H);
qactQry.put("2h_4h", QTIM_2H4H);
qactQry.put("4h_8h", QTIM_4H8H);
qactQry.put("8h_24h", QTIM_8H24H);
qactQry.put("notsched", QTIM_NONE);
typeRef = new LinkedHashMap<String, String>(18);
typeRef.put("atcaa", "A");
typeRef.put("aerial_rr", "AR");
typeRef.put("alert", "L");
typeRef.put("moa", "M");
typeRef.put("other", "O");
typeRef.put("prohibited", "P");
typeRef.put("restricted", "R");
typeRef.put("warning", "W");
typeRef.put("inst_rte", "IR");
typeRef.put("visual_rte", "VR");
typeRef.put("slow_rte", "SR");
typeRef.put("spaceflight", "SPC");
typeRef.put("airshow_spevt", "EVT");
typeRef.put("hazards", "HAZ");
typeRef.put("hidis", "HID");
typeRef.put("security", "SEC");
typeRef.put("srch_res", "SAR");
typeRef.put("vip", "VIP");
typeRef.put("special", "SPL");
System.arraycopy(alts, 0, d_alts, 0, alts.length);
System.arraycopy(times, 0, d_times, 0, times.length);
System.arraycopy(types, 0, d_types, 0, types.length);
}
public String[] getAlts() {
return alts;
}
return alts;
}
public void setAlts(String[] alts) {
if(alts != null ) {
this.alts = alts;
logger.info("setting altitudes to: "+alts);
} else {
this.alts = d_alts;
}
}
if(alts != null ) {
this.alts = alts;
logger.info("setting altitudes to: "+alts);
} else {
this.alts = d_alts;
}
}
public String[] getTimes() {
return times;
}
return times;
}
public void setTimes(String[] times) {
if(times != null) {
this.times = times;
logger.info("setting times to: " + times);
} else {
this.times = d_times;
}
}
public String[] getTypes() {
return types;
}
if(times != null) {
this.times = times;
logger.info("setting times to: " + times);
} else {
this.times = d_times;
}
}
public String[] getTypes() {
return types;
}
public void setTypes(String[] types) {
if(types != null) {
this.types = types;
logger.info("setting as types to: "+types);
} else {
this.types = d_types;
}
}
if(types != null) {
this.types = types;
logger.info("setting as types to: "+types);
} else {
this.types = d_types;
}
}
public String getWhere(String[] alt, String[] time, String[] type) {
logger.info("setting alts, times and types in getWhere(a,ti,ty).");
alts = alt;
times = time;
types = type;
return getWhere();
}
logger.info("setting alts, times and types in getWhere(a,ti,ty).");
alts = alt;
times = time;
types = type;
return getWhere();
}
public String getWhere() {
StringBuffer retQ = new StringBuffer(1000);
boolean or = false;
retQ.append(" where ( ");
StringBuffer retQ = new StringBuffer(1000);
boolean or = false;
retQ.append(" where ( ");
try {
logger.info("Building Theme Query... ");
logger.info("Building Theme Query... ");
Iterator<String> t = Arrays.asList(times).iterator();
while (t.hasNext()) { // work through time bands
// logger.info("Top of active loop query is: "+retQ.toString());
String act = (String) t.next();
String actStr = ((String) actQry.get(act));
logger.info("Active Band " + act + " query segment is: "
+ actStr);
if (act.equals("notsched")) { /* No alt or time with not sched */
if (or) {
retQ.append(" OR ");
}
retQ.append(" (start_time is null) ");
logger.info(act + " enabled");
} else {
Iterator<String> a = Arrays.asList(alts).iterator();
while (a.hasNext()) { // work through altitude bands
String alt = (String) a.next();
String altStr = ((String) altQry.get(alt));
if (or) {
retQ.append(" OR ");
}
retQ.append("(" + actStr + " AND " + altStr + ")");
or = true;
logger.info(alt + " enabled. query segment is:" + altStr );
}
}
}
retQ.append(" ) AND airspace_type in ('XX',");
logger.info("adding types next...");
t = Arrays.asList(types).iterator();
while (t.hasNext()) {
String type = (String) t.next();
logger.info("looking at type" + type);
retQ.append("'" + typeRef.get(type) + "',");
}
retQ.deleteCharAt(retQ.lastIndexOf(","));
retQ.append(")");
while (t.hasNext()) { // work through time bands
// logger.info("Top of active loop query is: "+retQ.toString());
String act = (String) t.next();
String actStr = ((String) actQry.get(act));
logger.info("Active Band " + act + " query segment is: "
+ actStr);
if (act.equals("notsched")) { /* No alt or time with not sched */
if (or) {
retQ.append(" OR ");
}
retQ.append(" (start_time is null) ");
logger.info(act + " enabled");
} else {
Iterator<String> a = Arrays.asList(alts).iterator();
while (a.hasNext()) { // work through altitude bands
String alt = (String) a.next();
String altStr = ((String) altQry.get(alt));
if (or) {
retQ.append(" OR ");
}
retQ.append("(" + actStr + " AND " + altStr + ")");
or = true;
logger.info(alt + " enabled. query segment is:" + altStr );
}
}
}
retQ.append(" ) AND airspace_type in ('XX',");
logger.info("adding types next...");
t = Arrays.asList(types).iterator();
while (t.hasNext()) {
String type = (String) t.next();
logger.info("looking at type" + type);
retQ.append("'" + typeRef.get(type) + "',");
}
retQ.deleteCharAt(retQ.lastIndexOf(","));
retQ.append(")");
logger.info("returning query= "+retQ);
logger.info("returning AS query");
} catch (Exception e) {
logger.info("Exception building schedule theme query", e);
}
return retQ.toString();
}
logger.info("returning AS query");
} catch (Exception e) {
logger.info("Exception building schedule theme query", e);
}
return retQ.toString();
}
public List<String> getCQL(String[] alt, String[] time, String[] type) {
logger.info("setting alts, times and types in getWhere(a,ti,ty).");
alts = alt;
times = time;
types = type;
return getCQL();
}
logger.info("setting alts, times and types in getWhere(a,ti,ty).");
alts = alt;
times = time;
types = type;
return getCQL();
}
public List<String> getCQL() {
ArrayList<String> retArray = new ArrayList<String>(7);
int x = 0;
ArrayList<String> retArray = new ArrayList<String>(7);
int x = 0;
try {
logger.info("Building CQL Theme Queries... ");
logger.info("Building CQL Theme Queries... ");
Iterator<String> t = Arrays.asList(times).iterator();
while (t.hasNext()) { // work through time bands
StringBuffer retQ = new StringBuffer(1000);
boolean or = false;
// logger.info("Top of active loop query is: "+retQ.toString());
String act = (String) t.next();
retQ.append(act + "| ( ");
String actStr = ((String) qactQry.get(act));
logger.info("Active Band " + act + " query segment is: "
+ actStr);
if (act.equals("notsched")) { /* No alt or time with not sched */
if (or) {
retQ.append(" OR ");
}
retQ.append(" (start_time is null) ");
logger.info(act + " enabled");
} else {
Iterator<String> a = Arrays.asList(alts).iterator();
while (a.hasNext()) { // work through altitude bands
String alt = (String) a.next();
String altStr = ((String) altQry.get(alt));
if (or) {
retQ.append(" OR ");
}
retQ.append("(" + actStr + " AND " + altStr + ")");
or = true;
logger.info(alt + " enabled. query segment is:" + altStr );
}
}
retQ.append(" ) AND (");
logger.info("adding types next...");
boolean first = true;
Iterator<String> i = Arrays.asList(types).iterator();
while (i.hasNext()) {
if(first) {
first = false;
}
else {
retQ.append(" OR ");
}
String type = (String) i.next();
logger.info("looking at type" + type);
retQ.append("airspace_type = '" + typeRef.get(type) + "'");
}
retQ.append(")");
retArray.add(retQ.toString());
x++;
logger.info("Position "+x+" in retArray is returning CQL query= "+retQ);
logger.info("returning AS query");
}
} catch (Exception e) {
logger.info("Exception building schedule theme query", e);
}
return retArray;
}
while (t.hasNext()) { // work through time bands
StringBuffer retQ = new StringBuffer(1000);
boolean or = false;
// logger.info("Top of active loop query is: "+retQ.toString());
String act = (String) t.next();
retQ.append(act + "| ( ");
String actStr = ((String) qactQry.get(act));
logger.info("Active Band " + act + " query segment is: "
+ actStr);
if (act.equals("notsched")) { /* No alt or time with not sched */
if (or) {
retQ.append(" OR ");
}
retQ.append(" (start_time is null) ");
logger.info(act + " enabled");
} else {
Iterator<String> a = Arrays.asList(alts).iterator();
while (a.hasNext()) { // work through altitude bands
String alt = (String) a.next();
String altStr = ((String) altQry.get(alt));
if (or) {
retQ.append(" OR ");
}
retQ.append("(" + actStr + " AND " + altStr + ")");
or = true;
logger.info(alt + " enabled. query segment is:" + altStr );
}
}
retQ.append(" ) AND (");
logger.info("adding types next...");
boolean first = true;
Iterator<String> i = Arrays.asList(types).iterator();
while (i.hasNext()) {
if(first) {
first = false;
}
else {
retQ.append(" OR ");
}
String type = (String) i.next();
logger.info("looking at type" + type);
retQ.append("airspace_type = '" + typeRef.get(type) + "'");
}
retQ.append(")");
retArray.add(retQ.toString());
x++;
logger.info("Position "+x+" in retArray is returning CQL query= "+retQ);
logger.info("returning AS query");
}
} catch (Exception e) {
logger.info("Exception building schedule theme query", e);
}
return retArray;
}
}
Thanks,
Jim
[email protected] wrote: -----Jim
To: [email protected]
From: Alexandre Dube <[email protected]>
Sent by: [email protected]
Date: 09/30/2010 09:45AM
Subject: Re: [OpenLayers-Users] OpenLayers - Performance Tuning - Firebug shows 10+ seconds in "blocking" time
Hi Jim,
What kind of layer object are you using ? WMS ? TileCache ? Are the layers coming from the same service (for example, do you have 5 WMS layer objects pointing to 5 layers from the same WMS server) ? If so, you could group them in a single layer object. You could also use 'singleTile' mode to have less requests.
Tell us more (by code sharing, live demo, etc.).
Regards,
Alexandre
On 10-09-30 09:40 AM, [email protected] wrote:Hi,
The Firebug Net Profile for my website, after a few requests, shows significant time "blocking". Has anyone else seen this? What can be done about it?
My sense is that our site is serving up too many tiled images. Functionally, we are coloring airspaces based upon when they'll become "active". So, we have 5+ layers with around 50 tiled images that must be downloaded. The reason we are creating the various layers is that they are styled using different colors. Is there a way to have different styles applied to various airspaces all within one layer so that we can drastically limit the number of images we are serving?
Thanks,
Jim
_______________________________________________
Users mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/openlayers-users
--
Alexandre Dubé
Mapgears
www.mapgears.com
_______________________________________________
Users mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/openlayers-users
_______________________________________________ Users mailing list [email protected] http://lists.osgeo.org/mailman/listinfo/openlayers-users
