Skip to content

Commit 2f7e303

Browse files
authored
Allow to configure the index when creating new layer (#410)
1 parent ccc291d commit 2f7e303

17 files changed

+249
-150
lines changed

pom.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,6 @@
271271
<groupId>org.geotools</groupId>
272272
<artifactId>gt-geojson</artifactId>
273273
<version>${geotools.version}</version>
274-
<scope>provided</scope>
275274
</dependency>
276275
<dependency>
277276
<groupId>org.geotools.xsd</groupId>

src/main/java/org/neo4j/gis/spatial/ShapefileImporter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public List<Node> importFile(String dataset, String layerName, Charset charset)
103103
EditableLayerImpl layer;
104104
try (Transaction tx = database.beginTx()) {
105105
layer = (EditableLayerImpl) spatialDatabase.getOrCreateLayer(tx, layerName, WKBGeometryEncoder.class,
106-
layerClass);
106+
layerClass, null);
107107
tx.commit();
108108
}
109109
return importFile(dataset, layer, charset);

src/main/java/org/neo4j/gis/spatial/SpatialDatabaseService.java

Lines changed: 67 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@
6262
*/
6363
public class SpatialDatabaseService implements Constants {
6464

65+
public static final String RTREE_INDEX_NAME = "rtree";
66+
public static final String GEOHASH_INDEX_NAME = "geohash";
67+
6568
public final IndexManager indexManager;
6669

6770
public SpatialDatabaseService(IndexManager indexManager) {
@@ -179,30 +182,29 @@ public DynamicLayer asDynamicLayer(Transaction tx, Layer layer) {
179182
return (DynamicLayer) LayerUtilities.makeLayerFromNode(tx, indexManager, node);
180183
}
181184

182-
public DefaultLayer getOrCreateDefaultLayer(Transaction tx, String name) {
183-
return (DefaultLayer) getOrCreateLayer(tx, name, WKBGeometryEncoder.class, EditableLayerImpl.class, "");
185+
public DefaultLayer getOrCreateDefaultLayer(Transaction tx, String name, String indexConfig) {
186+
return (DefaultLayer) getOrCreateLayer(tx, name, WKBGeometryEncoder.class, EditableLayerImpl.class, "",
187+
indexConfig);
184188
}
185189

186-
public EditableLayer getOrCreateEditableLayer(Transaction tx, String name, String format,
187-
String propertyNameConfig) {
190+
public EditableLayer getOrCreateEditableLayer(Transaction tx, String name, String format, String propertyNameConfig,
191+
String indexConfig) {
188192
Class<? extends GeometryEncoder> geClass = WKBGeometryEncoder.class;
189193
if (format != null && format.toUpperCase().startsWith("WKT")) {
190194
geClass = WKTGeometryEncoder.class;
191195
}
192-
return (EditableLayer) getOrCreateLayer(tx, name, geClass, EditableLayerImpl.class, propertyNameConfig);
196+
return (EditableLayer) getOrCreateLayer(tx, name, geClass, EditableLayerImpl.class, propertyNameConfig,
197+
indexConfig);
193198
}
194199

195-
public EditableLayer getOrCreateEditableLayer(Transaction tx, String name) {
196-
return getOrCreateEditableLayer(tx, name, "WKB", "");
200+
public EditableLayer getOrCreateEditableLayer(Transaction tx, String name, String indexConfig) {
201+
return getOrCreateEditableLayer(tx, name, "WKB", "", indexConfig);
197202
}
198203

199-
public EditableLayer getOrCreateEditableLayer(Transaction tx, String name, String wktProperty) {
200-
return getOrCreateEditableLayer(tx, name, "WKT", wktProperty);
204+
public EditableLayer getOrCreateEditableLayer(Transaction tx, String name, String wktProperty, String indexConfig) {
205+
return getOrCreateEditableLayer(tx, name, "WKT", wktProperty, indexConfig);
201206
}
202207

203-
public static final String RTREE_INDEX_NAME = "rtree";
204-
public static final String GEOHASH_INDEX_NAME = "geohash";
205-
206208
public static Class<? extends LayerIndexReader> resolveIndexClass(String index) {
207209
if (index == null) {
208210
return LayerRTreeIndex.class;
@@ -217,23 +219,25 @@ public static Class<? extends LayerIndexReader> resolveIndexClass(String index)
217219
}
218220

219221
public EditableLayer getOrCreateSimplePointLayer(Transaction tx, String name, String index, String xProperty,
220-
String yProperty) {
221-
return getOrCreatePointLayer(tx, name, resolveIndexClass(index), SimplePointEncoder.class, xProperty,
222+
String yProperty, String indexConfig) {
223+
return getOrCreatePointLayer(tx, name, resolveIndexClass(index), SimplePointEncoder.class, indexConfig,
224+
xProperty,
222225
yProperty);
223226
}
224227

225228
public EditableLayer getOrCreateNativePointLayer(Transaction tx, String name, String index,
226-
String locationProperty) {
227-
return getOrCreatePointLayer(tx, name, resolveIndexClass(index), SimplePointEncoder.class, locationProperty);
229+
String locationProperty, String indexConfig) {
230+
return getOrCreatePointLayer(tx, name, resolveIndexClass(index), SimplePointEncoder.class, indexConfig,
231+
locationProperty);
228232
}
229233

230234
public EditableLayer getOrCreatePointLayer(Transaction tx, String name,
231235
Class<? extends LayerIndexReader> indexClass, Class<? extends GeometryEncoder> encoderClass,
232-
String... encoderConfig) {
236+
String indexConfig, String... encoderConfig) {
233237
Layer layer = getLayer(tx, name);
234238
if (layer == null) {
235239
return (EditableLayer) createLayer(tx, name, encoderClass, SimplePointLayer.class, indexClass,
236-
makeEncoderConfig(encoderConfig), DefaultGeographicCRS.WGS84);
240+
makeEncoderConfig(encoderConfig), indexConfig, DefaultGeographicCRS.WGS84);
237241
}
238242
if (layer instanceof EditableLayer) {
239243
return (EditableLayer) layer;
@@ -243,10 +247,10 @@ public EditableLayer getOrCreatePointLayer(Transaction tx, String name,
243247
}
244248

245249
public Layer getOrCreateLayer(Transaction tx, String name, Class<? extends GeometryEncoder> geometryEncoder,
246-
Class<? extends Layer> layerClass, String config) {
250+
Class<? extends Layer> layerClass, String encoderConfig, String indexConfig) {
247251
Layer layer = getLayer(tx, name);
248252
if (layer == null) {
249-
layer = createLayer(tx, name, geometryEncoder, layerClass, null, config);
253+
layer = createLayer(tx, name, geometryEncoder, layerClass, null, encoderConfig, indexConfig);
250254
} else if (!(layerClass == null || layerClass.isInstance(layer))) {
251255
throw new SpatialDatabaseException(
252256
"Existing layer '" + layer + "' is not of the expected type: " + layerClass);
@@ -255,8 +259,8 @@ public Layer getOrCreateLayer(Transaction tx, String name, Class<? extends Geome
255259
}
256260

257261
public Layer getOrCreateLayer(Transaction tx, String name, Class<? extends GeometryEncoder> geometryEncoder,
258-
Class<? extends Layer> layerClass) {
259-
return getOrCreateLayer(tx, name, geometryEncoder, layerClass, "");
262+
Class<? extends Layer> layerClass, String indexConfig) {
263+
return getOrCreateLayer(tx, name, geometryEncoder, layerClass, "", indexConfig);
260264
}
261265

262266
/**
@@ -299,8 +303,8 @@ public boolean containsLayer(Transaction tx, String name) {
299303
return getLayer(tx, name) != null;
300304
}
301305

302-
public Layer createWKBLayer(Transaction tx, String name) {
303-
return createLayer(tx, name, WKBGeometryEncoder.class, EditableLayerImpl.class);
306+
public Layer createWKBLayer(Transaction tx, String name, String indexConfig) {
307+
return createLayer(tx, name, WKBGeometryEncoder.class, EditableLayerImpl.class, indexConfig);
304308
}
305309

306310
public SimplePointLayer createSimplePointLayer(Transaction tx, String name) {
@@ -312,7 +316,7 @@ public SimplePointLayer createSimplePointLayer(Transaction tx, String name, Stri
312316
}
313317

314318
public SimplePointLayer createSimplePointLayer(Transaction tx, String name, String... xybProperties) {
315-
return createPointLayer(tx, name, LayerRTreeIndex.class, SimplePointEncoder.class, xybProperties);
319+
return createPointLayer(tx, name, LayerRTreeIndex.class, SimplePointEncoder.class, null, xybProperties);
316320
}
317321

318322
public SimplePointLayer createNativePointLayer(Transaction tx, String name) {
@@ -325,13 +329,14 @@ public SimplePointLayer createNativePointLayer(Transaction tx, String name, Stri
325329
}
326330

327331
public SimplePointLayer createNativePointLayer(Transaction tx, String name, String... encoderConfig) {
328-
return createPointLayer(tx, name, LayerRTreeIndex.class, NativePointEncoder.class, encoderConfig);
332+
return createPointLayer(tx, name, LayerRTreeIndex.class, NativePointEncoder.class, null, encoderConfig);
329333
}
330334

331335
public SimplePointLayer createPointLayer(Transaction tx, String name, Class<? extends LayerIndexReader> indexClass,
332-
Class<? extends GeometryEncoder> encoderClass, String... encoderConfig) {
336+
Class<? extends GeometryEncoder> encoderClass, String indexConfig, String... encoderConfig
337+
) {
333338
return (SimplePointLayer) createLayer(tx, name, encoderClass, SimplePointLayer.class, indexClass,
334-
makeEncoderConfig(encoderConfig), org.geotools.referencing.crs.DefaultGeographicCRS.WGS84);
339+
makeEncoderConfig(encoderConfig), indexConfig, org.geotools.referencing.crs.DefaultGeographicCRS.WGS84);
335340
}
336341

337342
public static String makeEncoderConfig(String... args) {
@@ -350,19 +355,27 @@ public static String makeEncoderConfig(String... args) {
350355
}
351356

352357
public Layer createLayer(Transaction tx, String name, Class<? extends GeometryEncoder> geometryEncoderClass,
353-
Class<? extends Layer> layerClass) {
354-
return createLayer(tx, name, geometryEncoderClass, layerClass, null, null);
355-
}
356-
357-
public Layer createLayer(Transaction tx, String name, Class<? extends GeometryEncoder> geometryEncoderClass,
358-
Class<? extends Layer> layerClass, Class<? extends LayerIndexReader> indexClass,
359-
String encoderConfig) {
360-
return createLayer(tx, name, geometryEncoderClass, layerClass, indexClass, encoderConfig, null);
358+
Class<? extends Layer> layerClass, String indexConfig) {
359+
return createLayer(tx, name, geometryEncoderClass, layerClass, null, null, indexConfig);
361360
}
362361

363362
public Layer createLayer(Transaction tx, String name, Class<? extends GeometryEncoder> geometryEncoderClass,
364363
Class<? extends Layer> layerClass, Class<? extends LayerIndexReader> indexClass,
365-
String encoderConfig, CoordinateReferenceSystem crs) {
364+
String encoderConfig,
365+
String indexConfig
366+
) {
367+
return createLayer(tx, name, geometryEncoderClass, layerClass, indexClass, encoderConfig, indexConfig, null);
368+
}
369+
370+
public Layer createLayer(Transaction tx,
371+
String name,
372+
Class<? extends GeometryEncoder> geometryEncoderClass,
373+
Class<? extends Layer> layerClass,
374+
Class<? extends LayerIndexReader> indexClass,
375+
String encoderConfig,
376+
String indexConfig,
377+
CoordinateReferenceSystem crs
378+
) {
366379
if (containsLayer(tx, name)) {
367380
throw new SpatialDatabaseException("Layer " + name + " already exists");
368381
}
@@ -380,6 +393,17 @@ public Layer createLayer(Transaction tx, String name, Class<? extends GeometryEn
380393
+ geometryEncoderClass);
381394
}
382395
}
396+
if (indexConfig != null && !indexConfig.isEmpty()) {
397+
LayerIndexReader index = layer.getIndex();
398+
if (index instanceof Configurable) {
399+
((Configurable) index).setConfiguration(indexConfig);
400+
layer.getLayerNode(tx).setProperty(PROP_INDEX_CONFIG, indexConfig);
401+
} else {
402+
System.out.println(
403+
"Warning: index configuration '" + indexConfig + "' passed to non-configurable index: "
404+
+ indexClass);
405+
}
406+
}
383407
if (crs != null && layer instanceof EditableLayer) {
384408
((EditableLayer) layer).setCoordinateReferenceSystem(tx, crs);
385409
}
@@ -466,7 +490,7 @@ public static int convertJtsClassToGeometryType(Class<? extends Geometry> jtsCla
466490
* @return new Layer with copy of all geometries
467491
*/
468492
public Layer createResultsLayer(Transaction tx, String layerName, List<SpatialDatabaseRecord> results) {
469-
EditableLayer layer = (EditableLayer) createWKBLayer(tx, layerName);
493+
EditableLayer layer = (EditableLayer) createWKBLayer(tx, layerName, "");
470494
for (SpatialDatabaseRecord record : results) {
471495
layer.add(tx, record.getGeometry());
472496
}
@@ -547,15 +571,16 @@ private static void addRegisteredLayerType(RegisteredLayerType type) {
547571
registeredLayerTypes.put(type.typeName.toLowerCase(), type);
548572
}
549573

550-
public Layer getOrCreateRegisteredTypeLayer(Transaction tx, String name, String type, String config) {
574+
public Layer getOrCreateRegisteredTypeLayer(Transaction tx, String name, String type, String encoderConfig,
575+
String indexConfig) {
551576
RegisteredLayerType registeredLayerType = registeredLayerTypes.get(type.toLowerCase());
552-
return getOrCreateRegisteredTypeLayer(tx, name, registeredLayerType, config);
577+
return getOrCreateRegisteredTypeLayer(tx, name, registeredLayerType, encoderConfig, indexConfig);
553578
}
554579

555580
public Layer getOrCreateRegisteredTypeLayer(Transaction tx, String name, RegisteredLayerType registeredLayerType,
556-
String config) {
581+
String encoderConfig, String indexConfig) {
557582
return getOrCreateLayer(tx, name, registeredLayerType.geometryEncoder, registeredLayerType.layerClass,
558-
(config == null) ? registeredLayerType.defaultConfig : config);
583+
(encoderConfig == null) ? registeredLayerType.defaultConfig : encoderConfig, indexConfig);
559584
}
560585

561586
public static Map<String, String> getRegisteredLayerTypes() {

src/main/java/org/neo4j/gis/spatial/osm/OSMImporter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ public long reIndex(GraphDatabaseService database, int commitInterval, boolean i
250250
OSMDataset dataset;
251251
try (Transaction tx = beginTx(database)) {
252252
layer = (OSMLayer) spatialDatabase.getOrCreateLayer(tx, layerName, OSMGeometryEncoder.class,
253-
OSMLayer.class);
253+
OSMLayer.class, null);
254254
dataset = OSMDataset.withDatasetId(tx, layer, osm_dataset);
255255
tx.commit();
256256
}

0 commit comments

Comments
 (0)