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

Annotation of /android/TrainInfoService/src/dk/thoerup/traininfoservice/db/StationDAO.java

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20