55 * The ASF licenses this file to You under the Apache License, Version 2.0
66 * (the "License"); you may not use this file except in compliance with
77 * the License. You may obtain a copy of the License at
8- *
9- * http://www.apache.org/licenses/LICENSE-2.0
10- *
8+ * <p>
9+ * http://www.apache.org/licenses/LICENSE-2.0
10+ * <p>
1111 * Unless required by applicable law or agreed to in writing, software
1212 * distributed under the License is distributed on an "AS IS" BASIS,
1313 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -43,34 +43,36 @@ public class RTreeIndexManager {
4343 * @param indexName 索引名(唯一)
4444 * @param geometryFieldName node中的geometry字段名
4545 * @param maxNodeReferences 每个树节点上最多挂几个节点
46+ * @param geometryCacheSize geometry缓存数量,由于对外wkb缓存转到堆内并转geometry比较耗时,故这里加了一个lru的缓存以直接获取geometry
4647 * @return RTreeIndex
4748 */
48- public static synchronized RTreeIndex createIndex (GraphDatabaseService database , String indexName , String geometryFieldName , int maxNodeReferences ) {
49+ public static synchronized RTreeIndex createIndex (GraphDatabaseService database , String indexName , String geometryFieldName , int maxNodeReferences , int geometryCacheSize ) {
4950 //判断索引名是否唯一
5051 try (Transaction tx = database .beginTx ()) {
5152 tx .findNodes (Constant .RtreeLabel .ReferenceNode , Constant .RtreeProperty .indexName , indexName ).forEachRemaining ((node ) -> {
5253 throw new RuntimeException ("index name(" + indexName + ") has been taken" );
5354 });
5455 }
55- return new RTreeIndex (indexName , geometryFieldName , database , new MyEnvelopeDecoder (), maxNodeReferences , true );
56+ return new RTreeIndex (indexName , geometryFieldName , database , new MyEnvelopeDecoder (), maxNodeReferences , geometryCacheSize , true );
5657 }
5758
5859 /**
5960 * 获取索引
6061 *
61- * @param database db
62- * @param indexName 索引名
62+ * @param database db
63+ * @param indexName 索引名
64+ * @param geometryCacheSize geometry缓存数量,由于对外wkb缓存转到堆内并转geometry比较耗时,故这里加了一个lru的缓存以直接获取geometry,可以和构造索引时不一致
6365 * @return RTreeIndex
6466 */
65- public static synchronized RTreeIndex getIndex (GraphDatabaseService database , String indexName ) {
67+ public static synchronized RTreeIndex getIndex (GraphDatabaseService database , String indexName , int geometryCacheSize ) {
6668 try (Transaction tx = database .beginTx ()) {
6769 Node rootNode = tx .findNode (Constant .RtreeLabel .ReferenceNode , Constant .RtreeProperty .indexName , indexName );
6870 if (null == rootNode ) {
6971 throw new RuntimeException ("index (" + indexName + ") is nonexistent" );
7072 }
7173 String geometryFieldName = (String ) rootNode .getProperty (Constant .RtreeProperty .geometryFieldName );
7274 int maxNodeReferences = (int ) rootNode .getProperty (Constant .RtreeProperty .maxNodeReferences );
73- return new RTreeIndex (indexName , geometryFieldName , database , new MyEnvelopeDecoder (), maxNodeReferences , false );
75+ return new RTreeIndex (indexName , geometryFieldName , database , new MyEnvelopeDecoder (), maxNodeReferences , geometryCacheSize , false );
7476 }
7577 }
7678
@@ -81,9 +83,10 @@ public static synchronized RTreeIndex getIndex(GraphDatabaseService database, St
8183 * @param indexName 索引名(唯一)
8284 * @param geometryFieldName node中的geometry字段名,若已有索引,可能会和输入值不一致
8385 * @param maxNodeReferences 每个树节点上最多挂几个节点,若已有索引,可能会和输入值不一致
86+ * @param geometryCacheSize geometry缓存数量,由于对外wkb缓存转到堆内并转geometry比较耗时,故这里加了一个lru的缓存以直接获取geometry,可以和构造索引时不一致
8487 * @return RTreeIndex
8588 */
86- public static synchronized RTreeIndex getOrCreateIndex (GraphDatabaseService database , String indexName , String geometryFieldName , int maxNodeReferences ) {
89+ public static synchronized RTreeIndex getOrCreateIndex (GraphDatabaseService database , String indexName , String geometryFieldName , int maxNodeReferences , int geometryCacheSize ) {
8790 Node rootNode ;
8891 try (Transaction tx = database .beginTx ()) {
8992 rootNode = tx .findNode (Constant .RtreeLabel .ReferenceNode , Constant .RtreeProperty .indexName , indexName );
@@ -93,17 +96,17 @@ public static synchronized RTreeIndex getOrCreateIndex(GraphDatabaseService data
9396 }
9497 }
9598 if (null == rootNode ) {
96- return createIndex (database , indexName , geometryFieldName , maxNodeReferences );
99+ return createIndex (database , indexName , geometryFieldName , maxNodeReferences , geometryCacheSize );
97100 } else {
98- return new RTreeIndex (indexName , geometryFieldName , database , new MyEnvelopeDecoder (), maxNodeReferences , false );
101+ return new RTreeIndex (indexName , geometryFieldName , database , new MyEnvelopeDecoder (), maxNodeReferences , geometryCacheSize , false );
99102 }
100103
101104 }
102105
103106 /**
104107 * 删除索引
105108 *
106- * @param database db
109+ * @param database db
107110 * @param indexName index name
108111 */
109112 public static synchronized void dropIndex (GraphDatabaseService database , String indexName ) {
0 commit comments