001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/io/quadtree/DBQuadtree.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2006 by:
006 EXSE, Department of Geography, University of Bonn
007 http://www.giub.uni-bonn.de/deegree/
008 lat/lon GmbH
009 http://www.lat-lon.de
010
011 This library is free software; you can redistribute it and/or
012 modify it under the terms of the GNU Lesser General Public
013 License as published by the Free Software Foundation; either
014 version 2.1 of the License, or (at your option) any later version.
015
016 This library is distributed in the hope that it will be useful,
017 but WITHOUT ANY WARRANTY; without even the implied warranty of
018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019 Lesser General Public License for more details.
020
021 You should have received a copy of the GNU Lesser General Public
022 License along with this library; if not, write to the Free Software
023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024
025 Contact:
026
027 Andreas Poth
028 lat/lon GmbH
029 Aennchenstr. 19
030 53177 Bonn
031 Germany
032 E-Mail: poth@lat-lon.de
033
034 Prof. Dr. Klaus Greve
035 Department of Geography
036 University of Bonn
037 Meckenheimer Allee 166
038 53115 Bonn
039 Germany
040 E-Mail: greve@giub.uni-bonn.de
041
042 ---------------------------------------------------------------------------*/
043 package org.deegree.io.quadtree;
044
045 import java.sql.Connection;
046 import java.sql.ResultSet;
047 import java.sql.Statement;
048 import java.util.ArrayList;
049 import java.util.HashMap;
050 import java.util.List;
051 import java.util.Map;
052
053 import org.deegree.io.DBConnectionPool;
054 import org.deegree.io.JDBCConnection;
055 import org.deegree.model.spatialschema.Envelope;
056 import org.deegree.model.spatialschema.GeometryFactory;
057 import org.deegree.model.spatialschema.Point;
058
059 /**
060 *
061 *
062 *
063 * @version $Revision: 6812 $
064 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
065 * @author last edited by: $Author: apoth $
066 *
067 * @version 1.0. $Revision: 6812 $, $Date: 2007-05-04 15:35:27 +0200 (Fr, 04 Mai 2007) $
068 *
069 * @since 2.0
070 */
071 public class DBQuadtree implements Quadtree {
072
073 private String fk_root;
074 private int depth;
075 private int id = 0;
076 private String indexName = null;
077 private JDBCConnection jdbc = null;
078 private Map<String,Node> nodeCache = new HashMap<String,Node>(10000);
079 private double accuracyX = 0.0001;
080 private double accuracyY = 0.0001;
081
082 /**
083 * initializes a quadtree already existing in a database
084 * @param id
085 * @param indexName this name will be used to create the table
086 * that stores the nodes of a specific quadtree
087 * @param jdbc description of database connection
088 */
089 public DBQuadtree(int id, String indexName, JDBCConnection jdbc) throws IndexException {
090 this.id = id;
091 this.jdbc = jdbc;
092 this.indexName = indexName;
093 readRootNodeId();
094 }
095
096 /**
097 * initializes a quadtree already existing in a database
098 * @param id
099 * @param indexName this name will be used to create the table
100 * that stores the nodes of a specific quadtree
101 * @param jdbc description of database connection
102 * @param accuracyX
103 * @param accuracyY
104 */
105 public DBQuadtree(int id, String indexName, JDBCConnection jdbc,
106 double accuracyX, double accuracyY) throws IndexException {
107 this.id = id;
108 this.jdbc = jdbc;
109 this.indexName = indexName;
110 this.accuracyX = accuracyX;
111 this.accuracyY = accuracyY;
112 readRootNodeId();
113 }
114
115 /**
116 *
117 * @param id
118 * @return node
119 */
120 Node getFromCache(String id) {
121 return nodeCache.get( id );
122 }
123
124 /**
125 *
126 * @param node
127 */
128 void addToCache(Node node) {
129 nodeCache.put( node.getId(), node );
130 }
131
132 /* (non-Javadoc)
133 * @see org.deegree.io.quadtree.Quadtree#insert(java.lang.Object, org.deegree.model.spatialschema.Envelope)
134 */
135 public void insert(Object item, Envelope envelope) throws IndexException {
136 Node node = new DBNode( fk_root, null, this, indexName, jdbc, 1 );
137 node.insert( item, envelope );
138 }
139
140 /**
141 * @param item
142 * @param point
143 */
144 public void insert( Object item, Point point ) throws IndexException {
145 Node node = new DBNode( fk_root, null, this, indexName, jdbc, 1 );
146 Envelope envelope = GeometryFactory.createEnvelope( point.getX() - accuracyX,
147 point.getY() - accuracyY,
148 point.getX() + accuracyX,
149 point.getY() + accuracyY,
150 null );
151 node.insert( item, envelope );
152 }
153
154 /* (non-Javadoc)
155 * @see org.deegree.io.quadtree.Quadtree#query(org.deegree.model.spatialschema.Envelope)
156 */
157 public List<Object> query(Envelope envelope) throws IndexException {
158 List<Object> visitor = new ArrayList<Object>( 1000 );
159 DBNode node = new DBNode( fk_root, null, this, indexName, jdbc, 1 );
160 envelope = envelope.createIntersection( node.getEnvelope() );
161 if ( envelope == null ) {
162 return new ArrayList<Object>();
163 }
164 return node.query( envelope, visitor, 1 );
165 }
166
167 /* (non-Javadoc)
168 * @see org.deegree.io.quadtree.Quadtree#deleteItem(java.lang.Object)
169 */
170 public void deleteItem(Object item) {
171
172 }
173
174 /* (non-Javadoc)
175 * @see org.deegree.io.quadtree.Quadtree#deleteRange(org.deegree.model.spatialschema.Envelope)
176 */
177 public void deleteRange(Envelope envelope) {
178
179 }
180
181 /* (non-Javadoc)
182 * @see org.deegree.io.quadtree.Quadtree#getDepth()
183 */
184 public int getDepth() {
185 return depth;
186 }
187
188 /**
189 * reads the root node from the database
190 * @throws IndexException
191 */
192 private void readRootNodeId() throws IndexException {
193
194 Connection con = null;
195 DBConnectionPool pool = null;
196 try {
197 pool = DBConnectionPool.getInstance();
198 con = pool.acquireConnection( jdbc.getDriver(), jdbc.getURL(), jdbc.getUser(),
199 jdbc.getPassword() );
200
201 StringBuffer sb = new StringBuffer( 200 );
202 sb.append( "Select FK_ROOT, DEPTH from TAB_QUADTREE where ID = ");
203 sb.append( id );
204
205 Statement stmt = con.createStatement();
206 ResultSet rs = stmt.executeQuery( sb.toString() );
207 if ( rs.next() ) {
208 fk_root = rs.getString( "FK_ROOT" );
209 depth = rs.getInt( "DEPTH" );
210 } else {
211 throw new IndexException( "could not read FK_ROOT and DEPTH for " +
212 "Quadtree with ID" + id );
213 }
214 rs.close();
215 stmt.close();
216 } catch (Exception e) {
217 throw new IndexException( "could not load quadtree definition from database", e );
218 } finally {
219 try {
220 pool.releaseConnection( con, jdbc.getDriver(), jdbc.getURL(), jdbc.getUser(),
221 jdbc.getPassword() );
222 } catch (Exception e1) {
223 e1.printStackTrace();
224 }
225 }
226
227 }
228
229 /* (non-Javadoc)
230 * @see org.deegree.io.quadtree.Quadtree#getRootBoundingBox()
231 */
232 public Envelope getRootBoundingBox() throws IndexException {
233 DBNode node = new DBNode( fk_root, null, this, indexName, jdbc, 1 );
234 return node.getEnvelope();
235 }
236
237 }
238 /* ********************************************************************
239 Changes to this class. What the people have been up to:
240 $Log$
241 Revision 1.2 2006/10/30 09:02:38 poth
242 implementation changed for optimized memory management for MemPointQuadtree
243
244 Revision 1.1 2006/10/20 07:56:00 poth
245 core methods extracted to interfaces
246
247 Revision 1.7 2006/05/18 14:08:54 poth
248 file comments completed
249
250 Revision 1.6 2006/05/18 14:07:32 poth
251 *** empty log message ***
252
253 Revision 1.5 2006/05/18 14:07:14 poth
254 not required typecast removed/ file comment footer added
255
256
257 ********************************************************************** */