Jak jsem slíbil, dávám sem ten dotaz, ať můžete případně přemýšlet, jeslti by se to nedalo udělat lépe.
Popíšu to na příkladu LiveMapy, tam ten výkon bude mít vliv, ale zároveň stejný dotaz použiju i na normální načítání, ať už pro Import nebo jen pro Zobrazení.
Jako vstup berte 4 body (8 hodnot), udávající výsek mapy. V LiveMapě to vypadá takto:
String[] cond = new String[]{
String.valueOf(update.getMapBottomRight().getLatitude()),
String.valueOf(update.getMapTopLeft().getLatitude()),
String.valueOf(update.getMapTopLeft().getLongitude()),
String.valueOf(update.getMapBottomRight().getLongitude()),
String.valueOf(update.getMapBottomRight().getLatitude()),
String.valueOf(update.getMapTopLeft().getLatitude()),
String.valueOf(update.getMapTopLeft().getLongitude()),
String.valueOf(update.getMapBottomRight().getLongitude())
};
update je proměnná, co pošle Locus, resp. jedna část proměnné, ale v podstatě je to definování toho, co aktuálně uživatel vidí v Locusu.
Pro Import a Zobrazení se ty body počítají takto:
Float radius = (float)Settings.filter_radius / 70;
String[] cond1 = new String[]{
String.valueOf(mapCenter.getLatitude() - radius),
String.valueOf(mapCenter.getLatitude() + radius),
String.valueOf(mapCenter.getLongitude() - radius),
String.valueOf(mapCenter.getLongitude() + radius)
};
String[] cond2 = new String[8];
cond2[0] = cond1[0];
cond2[1] = cond1[1];
cond2[2] = cond1[2];
cond2[3] = cond1[3];
cond2[4] = cond1[0];
cond2[5] = cond1[1];
cond2[6] = cond1[2];
cond2[7] = cond1[3];
Settings.filter_radius je to co nastavíte jako radius v Nastavení doplňku. Přiznám se, že netuším, proč je tam / 70, jestli je to zjednodušení na kružnici, nevím. Takhle to prostě bylo.
A teď ten dotaz, tenhle je z LiveMapy, u Importu a Zobrazeni je obdobny:
SELECT geocache.id, geocache.x, geocache.y, geocache.name, difficulty, terrain, cachesize, cachetype, cachestatus, dtfound, author
FROM geocache
LEFT JOIN waypoint ON geocache.id = waypoint.id
WHERE cachestatus IN (0) -- pripadne 1, 2, podle nastaveni
-- ted prijde cast pro filtrovani, uvadim jen pro uplnenost
-- AND dtfound = 0
-- AND author != ...
-- AND cachetype IN (...
-- AND cachesize IN (...
-- AND terrain IN (...
-- AND difficulty IN (...
-- a ted vyber kesi podle radiusu
AND (
(CAST(geocache.x AS REAL) > ? AND CAST(geocache.x AS REAL) < ? AND CAST(geocache.y AS REAL) > ? AND CAST(geocache.y AS REAL) < ?)
OR (CAST(waypoint.x AS REAL) > ? AND CAST(waypoint.x AS REAL) < ? AND CAST(waypoint.y AS REAL) > ? AND CAST(waypoint.y AS REAL) < ?)
)
GROUP BY geocache.id
V té poslední části si myslím, že je asi největší zpomalení, ty přepočty na REAL atd. Tam bude asi prostor na tunning.