/[projects]/android/TrainInfoService/src/dk/thoerup/traininfoservice/StationDAO.java
ViewVC logotype

Contents of /android/TrainInfoService/src/dk/thoerup/traininfoservice/StationDAO.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1061 - (show annotations) (download)
Thu Sep 16 14:04:28 2010 UTC (13 years, 8 months ago) by torben
File size: 7286 byte(s)
Experimental commit #2, move databeans to common
1 package dk.thoerup.traininfoservice;
2
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7 import java.sql.Statement;
8 import java.util.logging.Logger;
9
10 import dk.thoerup.android.traininfo.common.StationBean;
11 import dk.thoerup.android.traininfo.common.StationBean.StationEntry;
12
13 public class StationDAO {
14 final static int LOCATION_LIMIT = 8;
15 static final Logger logger = Logger.getLogger(StationDAO.class.getName());
16
17
18 private StationEntry convertSingleRow(ResultSet res) throws SQLException {
19 StationEntry station = new StationEntry();
20
21 station.setId( res.getInt(1) );
22 station.setName( res.getString(2) );
23 station.setLatitude( res.getDouble(3) );
24 station.setLongitude( res.getDouble(4) );
25 station.setRegional( res.getString(5) );
26 station.setStrain( res.getString(6) );
27 station.setMetro( res.getString(7) );
28 station.setAddress( res.getString(8) );
29 station.setCalcdist( (int)res.getDouble(9) );
30
31 station.setIsRegional( station.getRegional() != null );
32 station.setIsStrain( station.getStrain() != null );
33 station.setIsMetro( station.getMetro() != null );
34
35 return station;
36 }
37
38 private StationBean convertResultset(ResultSet res) throws SQLException {
39 StationBean stations = new StationBean();
40 while (res.next()) {
41 stations.entries.add( convertSingleRow(res) );
42 }
43 return stations;
44
45 }
46
47
48 public StationEntry getById(int id) throws SQLException {
49 String SQL = "SELECT id,name,latitude,longitude,stationcode_fjrn,stationcode_stog,stationcode_metro,address,0.0 " +
50 "FROM trainstations WHERE id=" + id + " AND enabled=true";
51
52 Connection conn = null;
53 Statement stmt = null;
54 ResultSet res = null;
55 StationEntry result;
56
57 try {
58 conn = DBConnection.getConnection();
59
60 stmt = conn.createStatement();
61 res = stmt.executeQuery(SQL);
62 res.next();
63 result = convertSingleRow(res);
64 } finally {
65 if (res != null)
66 res.close();
67 if (stmt != null)
68 stmt.close();
69 if (conn != null)
70 conn.close();
71 }
72
73 return result;
74 }
75
76 /*
77 * this code requires theses statements are run on database in order to do ILIKE searches against aliases (which is defines as array of varchar(64) )
78 * create function rlike(text,text) returns bool as
79 * 'select $2 ilike $1' language sql strict immutable;
80 * create operator ~~~ (procedure = rlike, leftarg = text, rightarg = text, commutator = ~~);
81 */
82 public StationBean getByName(String name) throws SQLException {
83 String SQL = "SELECT id,name,latitude,longitude,stationcode_fjrn,stationcode_stog, stationcode_metro, address, 0.0 " +
84 "FROM trainstations " +
85 "WHERE (name ILIKE ? OR ? ~~~ ANY(aliases)) AND enabled = true " +
86 "ORDER BY name ";
87
88
89 StationBean result;
90 Connection conn = null;
91 PreparedStatement stmt = null;
92 ResultSet res = null;
93 try {
94 conn = DBConnection.getConnection();
95 stmt = conn.prepareStatement(SQL);
96
97 stmt.setString(1, name + "%");
98 stmt.setString(2, name + "%");
99
100 res = stmt.executeQuery();
101 result = convertResultset(res);
102
103 } finally {
104 if (res != null)
105 res.close();
106 if (stmt != null)
107 stmt.close();
108 if (conn!= null)
109 conn.close();
110 }
111 return result;
112 }
113
114 //the "hack" with max 0.4 degrees latitude and 0.75 degrees longitude is only valid since we only service danish trains,
115 // in denmark 0.4dg latitude ~ 44km, 0.75dg longitude ~ 47km
116
117 // the ultra fast method (and only slightly inaccurate as long as we only cover a limited geographically area)
118 // is using an aproximation of the length of 1 latitude degree and 1 longitude degree and just use pythagoras to
119 // calculate the distance:
120 // sqrt( power(abs(latitude-?)*111320, 2) + power(abs(longitude-?)*63000,2) )::int as calcdist
121
122 public StationBean getByLocationWorker(double latitude, double longitude, boolean geolimit) throws SQLException {
123
124 String limitExpression = (geolimit == true) ? "AND abs(latitude-?)<0.4 AND abs(longitude-?)<0.75 " : "";
125
126 String SQL = "SELECT id,name,latitude,longitude,stationcode_fjrn,stationcode_stog, stationcode_metro, address, " +
127 "earth_distance( earth_coord, ll_to_earth(?,?))::int AS calcdist " +
128 "FROM trainstations " +
129 "WHERE enabled = true " + limitExpression +
130 "ORDER BY calcdist ASC " +
131 "LIMIT " + LOCATION_LIMIT;
132
133
134
135 StationBean result;
136 Connection conn = null;
137 PreparedStatement stmt = null;
138 ResultSet res = null;
139 try {
140 conn = DBConnection.getConnection();
141 stmt = conn.prepareStatement(SQL);
142 stmt.setDouble(1, latitude);
143 stmt.setDouble(2, longitude);
144 if (geolimit == true) {
145 stmt.setDouble(3, latitude);
146 stmt.setDouble(4, longitude);
147 }
148 res = stmt.executeQuery();
149 result = convertResultset(res);
150
151 } finally {
152 if (res != null)
153 res.close();
154 if (stmt != null)
155 stmt.close();
156 if (conn!= null)
157 conn.close();
158 }
159 return result;
160 }
161
162 public StationBean getByLocation(double latitude, double longitude) throws SQLException {
163 StationBean result = getByLocationWorker(latitude, longitude, true);
164
165 if (result.entries.size() < LOCATION_LIMIT) { //failover
166 logger.info("getByLocation failover: " +latitude + "," + longitude);
167
168 result = getByLocationWorker(latitude, longitude, false);
169 }
170
171 return result;
172 }
173
174
175
176 public StationBean getByList(String list) throws SQLException {
177 String SQL = "SELECT id,name,latitude,longitude,stationcode_fjrn,stationcode_stog,stationcode_metro, address,0.0 " +
178 "FROM trainstations " +
179 "WHERE id IN " + list + " AND enabled = true " +
180 "ORDER BY name ";
181
182 Connection conn = null;
183 Statement stmt = null;
184 ResultSet res = null;
185 StationBean result;
186
187 try {
188 conn = DBConnection.getConnection();
189 stmt = conn.createStatement();
190 res = stmt.executeQuery(SQL);
191 result = convertResultset(res);
192 } finally {
193 if (res != null)
194 res.close();
195 if (stmt != null)
196 stmt.close();
197 if (conn!= null)
198 conn.close();
199 }
200
201 return result;
202
203 }
204 public static String getStationName(int stationID) {
205 String station = "";
206
207 Connection conn = null;
208 try {
209 conn = DBConnection.getConnection();
210 Statement stmt = conn.createStatement();
211 ResultSet rs = stmt.executeQuery("SELECT name FROM trainstations WHERE id=" + stationID);
212 if (rs.next()) {
213 station = rs.getString(1);
214 }
215
216 } catch (Exception e) {
217 } finally {
218 try {
219 if (conn != null && !conn.isClosed())
220 conn.close();
221 } catch (Exception e) {}
222 }
223
224 return station;
225 }
226
227 public int getIdByName(String name) throws SQLException {
228 String SQL = "SELECT id,name,latitude,longitude,stationcode_fjrn,stationcode_stog, stationcode_metro, address, 0.0 " +
229 "FROM trainstations " +
230 "WHERE name = ? AND enabled = true " +
231 "LIMIT 1 ";
232
233 StationBean result;
234 Connection conn = null;
235 PreparedStatement stmt = null;
236 ResultSet res = null;
237 try {
238 conn = DBConnection.getConnection();
239 stmt = conn.prepareStatement(SQL);
240
241 stmt.setString(1, name );
242
243 res = stmt.executeQuery();
244 result = convertResultset(res);
245
246 } finally {
247 if (res != null)
248 res.close();
249 if (stmt != null)
250 stmt.close();
251 if (conn!= null)
252 conn.close();
253 }
254
255 if (result.entries.size() == 1) {
256 return result.entries.get(0).getId();
257 } else {
258 return -1;
259 }
260 }
261 }

  ViewVC Help
Powered by ViewVC 1.1.20