Revision 894 org.gvsig.topology/trunk/org.gvsig.topology/org.gvsig.topology.lib/org.gvsig.topology.lib.impl/src/main/java/org/gvsig/topology/lib/impl/DefaultTopologyDataSet.java

View differences:

DefaultTopologyDataSet.java
29 29
import org.apache.commons.lang3.StringUtils;
30 30
import org.apache.commons.lang3.mutable.MutableObject;
31 31
import org.gvsig.expressionevaluator.Expression;
32
import org.gvsig.expressionevaluator.ExpressionBuilder;
33
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
34
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
32 35
import org.gvsig.fmap.dal.DataStore;
33 36
import org.gvsig.fmap.dal.EditingNotification;
34 37
import org.gvsig.fmap.dal.EditingNotificationManager;
......
37 40
import org.gvsig.fmap.dal.feature.Feature;
38 41
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
39 42
import org.gvsig.fmap.dal.feature.FeatureReference;
43
import org.gvsig.fmap.dal.feature.FeatureSet;
40 44
import org.gvsig.fmap.dal.feature.FeatureStore;
41 45
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
42 46
import org.gvsig.fmap.dal.feature.FeatureType;
......
44 48
import org.gvsig.fmap.geom.Geometry;
45 49
import org.gvsig.fmap.geom.GeometryLocator;
46 50
import org.gvsig.fmap.geom.GeometryManager;
51
import org.gvsig.fmap.geom.GeometryUtils;
47 52
import org.gvsig.fmap.geom.SpatialIndex;
48 53
import org.gvsig.fmap.geom.type.GeometryType;
54
import org.gvsig.tools.dispose.DisposableIterator;
49 55
import org.gvsig.tools.exception.BaseException;
50 56
import org.gvsig.tools.util.PropertiesSupportHelper;
51 57
import org.gvsig.tools.visitor.VisitCanceledException;
......
96 102
        }
97 103
    }
98 104

  
105
    @Override
99 106
    public void restart() {
100 107
        this.store  = null;
101 108
        this.spatialIndex = null;
......
350 357
        return this.propertiesHelper.getProperties();
351 358
    }
352 359

  
360
    @Override
353 361
    public SpatialIndex getSpatialIndex() {
354 362
        if( this.spatialIndex == null ) {
355 363
            this.spatialIndex = new MutableObject<>();
......
385 393
        return this.spatialIndex.getValue();
386 394
    }
387 395

  
396
    @Override
388 397
    public Iterable<FeatureReference> query(Geometry geom) {
398
        return this.queryReferences(geom);
399
    }
400
    
401
    @Override
402
    public Iterable<FeatureReference> queryReferences(Geometry geom) {
389 403
        SpatialIndex index = this.getSpatialIndex();
390 404
        if( index == null ) {
391
            return (Iterable<FeatureReference>) IteratorUtils.EMPTY_ITERATOR;
405
            try {
406
                FeatureStore theStore = (FeatureStore) this.getStore();
407
                ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
408
                Expression expression = manager.createExpression();
409
                ExpressionBuilder expressionBuilder = manager.createExpressionBuilder();
410
                String geomName = theStore.getDefaultFeatureType().getDefaultGeometryAttributeName();
411
                if( GeometryUtils.isSubtype(Geometry.TYPES.POINT, geom.getType()) )  {
412
                    expression.setPhrase(
413
                        expressionBuilder.ifnull(
414
                            expressionBuilder.column(geomName),
415
                            expressionBuilder.constant(false),
416
                            expressionBuilder.ST_Intersects(
417
                                    expressionBuilder.column(geomName),
418
                                    expressionBuilder.geometry(geom)
419
                            )
420
                        ).toString()
421
                    );
422
                } else {
423
                    expression.setPhrase(
424
                        expressionBuilder.ifnull(
425
                            expressionBuilder.column(geomName),
426
                            expressionBuilder.constant(false),
427
                            expressionBuilder.ST_Overlaps(
428
                                    expressionBuilder.column(geomName),
429
                                    expressionBuilder.envelope(geom.getEnvelope())
430
                            )
431
                        ).toString()
432
                    );
433
                }
434
                FeatureSet set = theStore.getFeatureSet(expression);
435
                final DisposableIterator it = set.fastIterator();
436
                return new Iterable<FeatureReference>() {
437
                    @Override
438
                    public Iterator<FeatureReference> iterator() {
439
                        return new Iterator<FeatureReference>() {
440
                            @Override
441
                            public boolean hasNext() {
442
                                return it.hasNext();
443
                            }
444

  
445
                            @Override
446
                            public FeatureReference next() {
447
                                Feature f = (Feature) it.next();
448
                                return f.getReference();
449
                            }
450
                        };
451
                    }
452
                };
453
                
454
            } catch(Exception ex) {
455
                return (Iterable<FeatureReference>) IteratorUtils.EMPTY_ITERATOR;
456
            }
392 457
        }
393 458
        final Iterator it = index.query(geom);
394 459
        if( it == null ) {
......
403 468
    }
404 469

  
405 470
    @Override
471
    public Iterable<Feature> queryFeatures(Geometry geom) {
472
        SpatialIndex index = this.getSpatialIndex();
473
        if( index == null ) {
474
            try {
475
                FeatureStore theStore = (FeatureStore) this.getStore();
476
                ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
477
                Expression expression = manager.createExpression();
478
                ExpressionBuilder expressionBuilder = manager.createExpressionBuilder();
479
                String geomName = theStore.getDefaultFeatureType().getDefaultGeometryAttributeName();
480
                if( GeometryUtils.isSubtype(Geometry.TYPES.POINT, geom.getType()) )  {
481
                    expression.setPhrase(
482
                        expressionBuilder.ifnull(
483
                            expressionBuilder.column(geomName),
484
                            expressionBuilder.constant(false),
485
                            expressionBuilder.ST_Intersects(
486
                                    expressionBuilder.column(geomName),
487
                                    expressionBuilder.geometry(geom)
488
                            )
489
                        ).toString()
490
                    );
491
                } else {
492
                    expression.setPhrase(
493
                        expressionBuilder.ifnull(
494
                            expressionBuilder.column(geomName),
495
                            expressionBuilder.constant(false),
496
                            expressionBuilder.ST_Overlaps(
497
                                    expressionBuilder.column(geomName),
498
                                    expressionBuilder.envelope(geom.getEnvelope())
499
                            )
500
                        ).toString()
501
                    );
502
                }
503
                FeatureSet set = theStore.getFeatureSet(expression);
504
                final DisposableIterator it = set.fastIterator();
505
                return new Iterable<Feature>() {
506
                    @Override
507
                    public Iterator<Feature> iterator() {
508
                        return it;
509
                    }
510
                };
511
                
512
            } catch(Exception ex) {
513
                return (Iterable<Feature>) IteratorUtils.EMPTY_ITERATOR;
514
            }
515
        }
516
        final Iterator it = index.query(geom);
517
        if( it == null ) {
518
            return (Iterable<Feature>) IteratorUtils.EMPTY_ITERATOR;
519
        }
520
        return new Iterable<Feature>() {
521
            @Override
522
            public Iterator<Feature> iterator() {
523
                return new Iterator<Feature>() {
524
                    @Override
525
                    public boolean hasNext() {
526
                        return it.hasNext();
527
                    }
528

  
529
                    @Override
530
                    public Feature next() {
531
                        FeatureReference ref = (FeatureReference) it.next();
532
                        try {
533
                            return ref.getFeature();
534
                        } catch (DataException ex) {
535
                            return null;
536
                        }
537
                    }
538
                };
539
            }
540
        };
541
    }
542

  
543
    @Override
406 544
    public Feature findFirst(Expression filter) {
407 545
        try {
408 546
            return this.getFeatureStore().findFirst(filter);

Also available in: Unified diff