You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2015/04/17 18:45:54 UTC

[07/50] [abbrv] zest-qi4j git commit: Updates, Cleanup and preparation for a pull request.

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/functions/predicates/ST_Within.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/functions/predicates/ST_Within.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/functions/predicates/ST_Within.java
index 5b378c3..d00bd2e 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/functions/predicates/ST_Within.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/functions/predicates/ST_Within.java
@@ -1,33 +1,43 @@
+/*
+ * Copyright (c) 2014, Jiri Jetmar. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
 package org.qi4j.index.elasticsearch.extensions.spatial.functions.predicates;
 
-import com.spatial4j.core.distance.DistanceUtils;
 import org.elasticsearch.common.geo.ShapeRelation;
 import org.elasticsearch.index.query.FilterBuilder;
 import org.elasticsearch.index.query.FilterBuilders;
 import org.elasticsearch.index.query.GeoPolygonFilterBuilder;
 import org.qi4j.api.geometry.TPoint;
 import org.qi4j.api.geometry.TPolygon;
-import org.qi4j.api.geometry.internal.TCircle;
 import org.qi4j.api.geometry.internal.TGeometry;
-import org.qi4j.api.query.grammar.extensions.spatial.predicate.ST_DisjointSpecification;
 import org.qi4j.api.query.grammar.extensions.spatial.predicate.ST_WithinSpecification;
 import org.qi4j.api.query.grammar.extensions.spatial.predicate.SpatialPredicatesSpecification;
+import org.qi4j.api.structure.Module;
+import org.qi4j.index.elasticsearch.ElasticSearchSupport;
 import org.qi4j.index.elasticsearch.extensions.spatial.internal.AbstractElasticSearchSpatialFunction;
 import org.qi4j.spi.query.EntityFinderException;
 
 import java.util.Map;
 
 
-
-public class ST_Within extends AbstractElasticSearchSpatialFunction implements PredicateFinderSupport.PredicateSpecification
-{
+public class ST_Within extends AbstractElasticSearchSpatialFunction implements PredicateFinderSupport.PredicateSpecification {
 
 
     public void processSpecification(FilterBuilder filterBuilder,
                                      SpatialPredicatesSpecification<?> spec,
                                      Map<String, Object> variables)
-            throws EntityFinderException
-    {
+            throws EntityFinderException {
         TGeometry geomOfFilterProperty = resolveGeometry(filterBuilder, spec, module);
 
         if (!isValid(spec))
@@ -39,8 +49,6 @@ public class ST_Within extends AbstractElasticSearchSpatialFunction implements P
         if (!isSupported(spec, geomOfFilterProperty))
             throw new EntityFinderException(spec.getClass() + " expression unsupported by ElasticSearch. Pls specify a supported expression.");
 
-        System.out.println("Ismapped As Piont " +isMappedAsGeoPoint(spec.property()));
-        System.out.println("Ismapped As Shape " + isMappedAsGeoShape(spec.property()));
 
         /**
          * When the geometry used in the ST_Within expression is of type TPoint and a distance is specified, e.g.
@@ -53,10 +61,9 @@ public class ST_Within extends AbstractElasticSearchSpatialFunction implements P
          */
         if (
                 isTPoint(geomOfFilterProperty) &&
-                isMappedAsGeoPoint(spec.property()) &&
-                ((ST_WithinSpecification) spec).getDistance() > 0
-           )
-        {
+                        isMappedAsGeoPoint(spec.property()) &&
+                        ((ST_WithinSpecification) spec).getDistance() > 0
+                ) {
             addFilter(createGeoDistanceFilter
                             (
                                     spec.property().toString(),
@@ -75,14 +82,11 @@ public class ST_Within extends AbstractElasticSearchSpatialFunction implements P
          * ST_Within (templafeFor(x.class).propertyOfTypeTPoint(), polygon);
          *
          */
-        else if (isPropertyOfType(TPoint.class, spec.property()))
-        {
+        else if (isPropertyOfType(TPoint.class, spec.property())) {
 
-            if (isMappedAsGeoPoint(spec.property()))
-            {
+            if (isMappedAsGeoPoint(spec.property())) {
 
-                if (geomOfFilterProperty instanceof TPolygon)
-                {
+                if (geomOfFilterProperty instanceof TPolygon) {
                     /**
                      * This must not happen, but in case the expression is defined using WTK like :
                      *
@@ -101,8 +105,7 @@ public class ST_Within extends AbstractElasticSearchSpatialFunction implements P
 
                     GeoPolygonFilterBuilder geoPolygonFilterBuilder = FilterBuilders.geoPolygonFilter(spec.property().toString());
 
-                    for (int i = 0; i < polygonFilter.shell().get().getNumPoints(); i++)
-                    {
+                    for (int i = 0; i < polygonFilter.shell().get().getNumPoints(); i++) {
                         TPoint point = polygonFilter.shell().get().getPointN(i);
                         geoPolygonFilterBuilder.addPoint(point.y(), point.x());
                     }
@@ -111,32 +114,28 @@ public class ST_Within extends AbstractElasticSearchSpatialFunction implements P
                     throw new EntityFinderException("Invalid ST_Within expression. Unsupported type " + geomOfFilterProperty.getClass().getSimpleName() +
                             " On properties of type " + TPoint.class.getSimpleName() +
                             " only filters of type distance or polygon are supported.");
-            }
-            else if (isMappedAsGeoShape(spec.property()) )
-            {
-                if (geomOfFilterProperty instanceof TPolygon)
-                {
+            } else if (isMappedAsGeoShape(spec.property())) {
+                if (geomOfFilterProperty instanceof TPolygon) {
                     addFilter(createShapeFilter(spec.property().toString(), geomOfFilterProperty, ShapeRelation.WITHIN), filterBuilder);
-                }
-
-                else if (((ST_WithinSpecification) spec).getDistance() > 0) {
-                    double distanceMeters = convertDistanceToMeters(((ST_WithinSpecification) spec).getDistance(), ((ST_WithinSpecification) spec).getUnit());
-                    System.out.println("Distance in Meters " + distanceMeters);
-                    double distanceDegrees = DistanceUtils.dist2Degrees(distanceMeters, DistanceUtils.EARTH_MEAN_RADIUS_KM * 1000);
-                    // This is a special case. We are using polygon substitution to support a circle. ATTENTION - this is just a approximation !!
-                    TPoint circlePoint = (TPoint)verifyProjection(geomOfFilterProperty);
-                    TCircle tCircle = module.newValueBuilder(TCircle.class).prototype().of(circlePoint, distanceDegrees);
-                    TPolygon polygonizedCircleFilter = tCircle.polygonize(360);
+                } else if (((ST_WithinSpecification) spec).getDistance() > 0) {
+                    double radiusInMeters = convertDistanceToMeters(((ST_WithinSpecification) spec).getDistance(), ((ST_WithinSpecification) spec).getUnit());
+                    TPolygon polygonizedCircleFilter = polygonizeCircle((TPoint) verifyProjection(geomOfFilterProperty), radiusInMeters);
                     addFilter(createShapeFilter(spec.property().toString(), polygonizedCircleFilter, ShapeRelation.WITHIN), filterBuilder);
                 }
             }
-        }
-        else
-        {
-            /**
-             * In all other cases we are using a shape filter.
-             */
+        } else {
+
             addFilter(createShapeFilter(spec.property().toString(), geomOfFilterProperty, ShapeRelation.WITHIN), filterBuilder);
         }
     }
+
+
+    public PredicateFinderSupport.PredicateSpecification support(Module module, ElasticSearchSupport support) {
+        this.module = module;
+        this.support = support;
+
+        return this;
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/internal/AbstractElasticSearchSpatialFinderSupport.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/internal/AbstractElasticSearchSpatialFinderSupport.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/internal/AbstractElasticSearchSpatialFinderSupport.java
deleted file mode 100644
index 321e73f..0000000
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/internal/AbstractElasticSearchSpatialFinderSupport.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.qi4j.index.elasticsearch.extensions.spatial.internal;
-
-/**
- * Created by jj on 20.11.14.
- */
-public class AbstractElasticSearchSpatialFinderSupport {
-}

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/internal/AbstractElasticSearchSpatialFunction.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/internal/AbstractElasticSearchSpatialFunction.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/internal/AbstractElasticSearchSpatialFunction.java
index 68ad30b..523cac5 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/internal/AbstractElasticSearchSpatialFunction.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/internal/AbstractElasticSearchSpatialFunction.java
@@ -1,5 +1,20 @@
+/*
+ * Copyright (c) 2014, Jiri Jetmar. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
 package org.qi4j.index.elasticsearch.extensions.spatial.internal;
 
+import com.spatial4j.core.distance.DistanceUtils;
 import org.elasticsearch.common.geo.ShapeRelation;
 import org.elasticsearch.common.geo.builders.CircleBuilder;
 import org.elasticsearch.common.geo.builders.PolygonBuilder;
@@ -10,6 +25,7 @@ import org.qi4j.api.composite.Composite;
 import org.qi4j.api.geometry.TPoint;
 import org.qi4j.api.geometry.TPolygon;
 import org.qi4j.api.geometry.TUnit;
+import org.qi4j.api.geometry.internal.TCircle;
 import org.qi4j.api.geometry.internal.TGeometry;
 import org.qi4j.api.property.GenericPropertyInfo;
 import org.qi4j.api.query.grammar.PropertyFunction;
@@ -29,9 +45,9 @@ import org.qi4j.spi.query.EntityFinderException;
 import java.lang.reflect.Type;
 import java.util.Map;
 
-import static org.qi4j.api.geometry.TGeometryFactory.*;
-import static org.qi4j.index.elasticsearch.extensions.spatial.mappings.SpatialIndexMapper.*;
-import static org.qi4j.library.spatial.v2.transformations.TTransformations.*;
+import static org.qi4j.api.geometry.TGeometryFactory.TPoint;
+import static org.qi4j.index.elasticsearch.extensions.spatial.mappings.SpatialIndexMapper.IndexMappingCache;
+import static org.qi4j.library.spatial.v2.transformations.TTransformations.Transform;
 
 
 /**
@@ -46,15 +62,7 @@ public abstract class AbstractElasticSearchSpatialFunction {
     protected Module module;
     protected ElasticSearchSupport support;
 
-    public void setModule(Module module, ElasticSearchSupport support)
-    {
-        this.module = module;
-        this.support = support;
-    }
-
-
-    protected boolean isSupported(SpatialPredicatesSpecification<?> spec, TGeometry geometryOfFilter) throws EntityFinderException
-    {
+    protected boolean isSupported(SpatialPredicatesSpecification<?> spec, TGeometry geometryOfFilter) throws EntityFinderException {
         return SpatialFunctionsSupportMatrix.isSupported
                 (
                         spec.getClass(),
@@ -62,70 +70,55 @@ public abstract class AbstractElasticSearchSpatialFunction {
                         InternalUtils.classOfGeometry(geometryOfFilter),
                         isMappedAsGeoPoint(spec.property()) ? SpatialConfiguration.INDEXING_METHOD.GEO_POINT : SpatialConfiguration.INDEXING_METHOD.GEO_SHAPE
                 );
-
     }
 
-    protected boolean isValid(SpatialPredicatesSpecification<?> spec) throws EntityFinderException
-    {
-        if ((spec.value() == null && spec.operator() == null))
+    protected boolean isValid(SpatialPredicatesSpecification<?> spec) throws EntityFinderException {
+        if ((spec.param() == null && spec.operator() == null))
             return false;
         else
             return true;
-
     }
 
 
-    protected void addFilter( FilterBuilder filter, FilterBuilder into )
-    {
-        if ( into instanceof AndFilterBuilder) {
-            ( (AndFilterBuilder) into ).add( filter );
-        } else if ( into instanceof OrFilterBuilder) {
-            ( (OrFilterBuilder) into ).add( filter );
+    protected void addFilter(FilterBuilder filter, FilterBuilder into) {
+        if (into instanceof AndFilterBuilder) {
+            ((AndFilterBuilder) into).add(filter);
+        } else if (into instanceof OrFilterBuilder) {
+            ((OrFilterBuilder) into).add(filter);
         } else {
-            throw new UnsupportedOperationException( "FilterBuilder is nor an AndFB nor an OrFB, cannot continue." );
+            throw new UnsupportedOperationException("FilterBuilder is nor an AndFB nor an OrFB, cannot continue.");
         }
     }
 
-    protected TGeometry verifyProjection(TGeometry tGeometry)
-    {
+    protected TGeometry verifyProjection(TGeometry tGeometry) {
         if (new ProjectionsRegistry().getCRS(tGeometry.getCRS()) == null)
-            throw new RuntimeException("Project with the CRS Identity " + tGeometry.getCRS() + " is unknown. Supported projections are JJ TODO" );
+            throw new RuntimeException("Project with the CRS Identity " + tGeometry.getCRS() + " is unknown. Supported projections are JJ TODO");
 
 
         try {
             if (!tGeometry.getCRS().equalsIgnoreCase(DefaultSupportedProjection)) {
-                if (SpatialConfiguration.isFinderProjectionConversionEnabled(support.spatialConfiguration()))
-                {
+                if (SpatialConfiguration.isFinderProjectionConversionEnabled(support.spatialConfiguration())) {
                     Transform(module).from(tGeometry).to(DefaultSupportedProjection, DefaultProjectionConversionPrecisionInMeters);
-                }  else throw new Exception("Filter Projection has a unsupported Projection and conversion is disabled");
+                } else throw new Exception("Filter Projection has a unsupported Projection and conversion is disabled");
             }
-        } catch (Exception _ex)
-        {
+        } catch (Exception _ex) {
             _ex.printStackTrace();
         }
 
         return tGeometry; // ATTENTION - we are transforming as per "Reference"
     }
 
-    protected boolean isPropertyOfType(Class type, PropertyFunction propertyFunction)
-    {
+    protected boolean isPropertyOfType(Class type, PropertyFunction propertyFunction) {
         Type returnType = Classes.typeOf(propertyFunction.accessor());
         Type propertyTypeAsType = GenericPropertyInfo.toPropertyType(returnType);
 
-
-
-        System.out.println("---- > " + propertyTypeAsType.getTypeName());
-
         Class clazz;
 
-        try
-        {
+        try {
             clazz = Class.forName(propertyTypeAsType.getTypeName());
-        } catch(Exception _ex)
-        {
+        } catch (Exception _ex) {
             throw new RuntimeException(_ex);
         }
-        // if (clazz instanceof TGeometry)
 
         if (type.isAssignableFrom(clazz))
             return true;
@@ -133,8 +126,7 @@ public abstract class AbstractElasticSearchSpatialFunction {
             return false;
     }
 
-    protected boolean isPropertyOfTypeTPoint(PropertyFunction propertyFunction)
-    {
+    protected boolean isPropertyOfTypeTPoint(PropertyFunction propertyFunction) {
         // String typeName = Classes.typeOf(propertyFunction.accessor()).getTypeName();
         // System.out.println(typeName);
 
@@ -146,11 +138,9 @@ public abstract class AbstractElasticSearchSpatialFunction {
 
         Class clazz;
 
-        try
-        {
+        try {
             clazz = Class.forName(propertyTypeAsType.getTypeName());
-        } catch(Exception _ex)
-        {
+        } catch (Exception _ex) {
             throw new RuntimeException(_ex);
         }
         // if (clazz instanceof TGeometry)
@@ -161,90 +151,88 @@ public abstract class AbstractElasticSearchSpatialFunction {
             return false;
     }
 
-    protected boolean isMappedAsGeoPoint(PropertyFunction property)
-    {
+    protected boolean isMappedAsGeoPoint(PropertyFunction property) {
         return IndexMappingCache.isMappedAsGeoPoint(support.index(), support.entitiesType(), property.toString());
     }
 
 
-
-    protected boolean isTPoint(TGeometry filterGeometry)
-    {
+    protected boolean isTPoint(TGeometry filterGeometry) {
         return TPoint(module).isPoint(filterGeometry);
     }
 
-    protected boolean isMappedAsGeoShape(PropertyFunction property)
-    {
+    protected boolean isMappedAsGeoShape(PropertyFunction property) {
         return IndexMappingCache.isMappedAsGeoShape(support.index(), support.entitiesType(), property.toString());
     }
 
-    protected boolean isMapped(PropertyFunction property)
-    {
+    protected boolean isMapped(PropertyFunction property) {
         return IndexMappingCache.mappingExists(support.index(), support.entitiesType(), property.toString());
     }
 
-    protected boolean isSpatial(PropertyFunction property)
-    {
+    protected boolean isSpatial(PropertyFunction property) {
         return false;
     }
 
 
-
-    protected GeoShapeFilterBuilder createShapeFilter(String name, TPoint point, ShapeRelation relation, double distance, TUnit unit)
-    {
+    protected GeoShapeFilterBuilder createShapeFilter(String name, TPoint point, ShapeRelation relation, double distance, TUnit unit) {
         return createShapeFilter(name, point, relation, distance, convertDistanceUnit(unit));
     }
 
-    protected GeoShapeFilterBuilder createShapeFilter(String name, TGeometry geometry, ShapeRelation relation)
-    {
+    protected GeoShapeFilterBuilder createShapeFilter(String name, TGeometry geometry, ShapeRelation relation) {
         return createShapeFilter(name, geometry, relation, 0, null);
     }
 
-    protected GeoDistanceFilterBuilder createGeoDistanceFilter(String name, TPoint tPoint, double distance, TUnit unit)
-    {
+    protected GeoDistanceFilterBuilder createGeoDistanceFilter(String name, TPoint tPoint, double distance, TUnit unit) {
         // Lat = Y Long = X
-      return  FilterBuilders.geoDistanceFilter(name)
-              .lat(tPoint.y())
-              .lon(tPoint.x())
-              .distance(distance, convertDistanceUnit(unit));
+        return FilterBuilders.geoDistanceFilter(name)
+                .lat(tPoint.y())
+                .lon(tPoint.x())
+                .distance(distance, convertDistanceUnit(unit));
+    }
+
+    protected TPolygon polygonizeCircle(TPoint centre, double radiusInMeters) {
+        double radiusInDegrees = DistanceUtils.dist2Degrees(radiusInMeters, DistanceUtils.EARTH_MEAN_RADIUS_KM * 1000);
+        TCircle tCircle = module.newValueBuilder(TCircle.class).prototype().of(centre, radiusInDegrees);
+        return tCircle.polygonize(360);
     }
 
 
-    private DistanceUnit convertDistanceUnit(TUnit tUnit)
-    {
-        switch (tUnit)
-        {
-            case MILLIMETER : return DistanceUnit.MILLIMETERS;
-            case CENTIMETER : return DistanceUnit.CENTIMETERS;
-            case METER      : return DistanceUnit.METERS;
-            case KILOMETER  :return DistanceUnit.KILOMETERS;
-            default : throw new RuntimeException("Can not convert Units");
+    private DistanceUnit convertDistanceUnit(TUnit tUnit) {
+        switch (tUnit) {
+            case MILLIMETER:
+                return DistanceUnit.MILLIMETERS;
+            case CENTIMETER:
+                return DistanceUnit.CENTIMETERS;
+            case METER:
+                return DistanceUnit.METERS;
+            case KILOMETER:
+                return DistanceUnit.KILOMETERS;
+            default:
+                throw new RuntimeException("Can not convert Units");
         }
     }
 
-    protected double convertDistanceToMeters(double source, TUnit sourceUnit)
-    {
-        switch (sourceUnit)
-        {
-            case MILLIMETER : return source / 1000;
-            case CENTIMETER : return source / 100;
-            case METER      : return source;
-            case KILOMETER  : return source * 1000;
-            default : throw new RuntimeException("Can not convert Units");
+    protected double convertDistanceToMeters(double source, TUnit sourceUnit) {
+        switch (sourceUnit) {
+            case MILLIMETER:
+                return source / 1000;
+            case CENTIMETER:
+                return source / 100;
+            case METER:
+                return source;
+            case KILOMETER:
+                return source * 1000;
+            default:
+                throw new RuntimeException("Can not convert Units");
         }
     }
 
 
-    private GeoShapeFilterBuilder createShapeFilter(String name, TGeometry geometry, ShapeRelation relation, double distance, DistanceUnit unit  )
-    {
-        if (geometry instanceof TPoint)
-        {
+    private GeoShapeFilterBuilder createShapeFilter(String name, TGeometry geometry, ShapeRelation relation, double distance, DistanceUnit unit) {
+        if (geometry instanceof TPoint) {
             CircleBuilder circleBuilder = ShapeBuilder.newCircleBuilder();
-            circleBuilder.center(((TPoint) geometry).x(), ((TPoint)geometry).y()).radius(distance, unit);
+            circleBuilder.center(((TPoint) geometry).x(), ((TPoint) geometry).y()).radius(distance, unit);
             return FilterBuilders.geoShapeFilter(name, circleBuilder, relation);
-        }
-        else if (geometry instanceof TPolygon)
-        {
+        } else if (geometry instanceof TPolygon) {
             PolygonBuilder polygonBuilder = ShapeBuilder.newPolygon();
 
             for (int i = 0; i < ((TPolygon) geometry).shell().get().points().get().size(); i++) {
@@ -256,10 +244,8 @@ public abstract class AbstractElasticSearchSpatialFunction {
                 );
             }
 
-            return  FilterBuilders.geoShapeFilter(name, polygonBuilder, relation);
-        }
-        else
-        {
+            return FilterBuilders.geoShapeFilter(name, polygonBuilder, relation);
+        } else {
 
         }
 
@@ -267,21 +253,15 @@ public abstract class AbstractElasticSearchSpatialFunction {
     }
 
 
-    protected TGeometry resolveGeometry( FilterBuilder filterBuilder, Specification<Composite> spec, Module module) throws  EntityFinderException
-    {
+    protected TGeometry resolveGeometry(FilterBuilder filterBuilder, Specification<Composite> spec, Module module) throws EntityFinderException {
 
-        if (spec instanceof SpatialPredicatesSpecification)
-        {
-            if (((SpatialPredicatesSpecification)spec).value() != null)
-            {
-                return ((SpatialPredicatesSpecification)spec).value();
-            }
-            else if (((SpatialPredicatesSpecification)spec).operator() != null)
-            {
+        if (spec instanceof SpatialPredicatesSpecification) {
+            if (((SpatialPredicatesSpecification) spec).param() != null) {
+                return ((SpatialPredicatesSpecification) spec).param();
+            } else if (((SpatialPredicatesSpecification) spec).operator() != null) {
 
-                if (((SpatialPredicatesSpecification) spec).operator() instanceof SpatialConvertSpecification)
-                {
-                    executeSpecification(filterBuilder, (SpatialPredicatesSpecification)spec, null);
+                if (((SpatialPredicatesSpecification) spec).operator() instanceof SpatialConvertSpecification) {
+                    executeSpecification(filterBuilder, (SpatialPredicatesSpecification) spec, null);
                     System.out.println("Converted Geometry " + ((SpatialConvertSpecification) ((SpatialPredicatesSpecification) spec).operator()).getGeometry());
                     return ((SpatialConvertSpecification) ((SpatialPredicatesSpecification) spec).operator()).getGeometry();
                     // return executeSpecification(filterBuilder, (SpatialPredicatesSpecification)spec, null);
@@ -294,22 +274,18 @@ public abstract class AbstractElasticSearchSpatialFunction {
         return null;
     }
 
-    private void executeSpecification( FilterBuilder filterBuilder,
-                                            SpatialPredicatesSpecification<?> spec,
-                                            Map<String, Object> variables ) throws EntityFinderException
-    {
+    private void executeSpecification(FilterBuilder filterBuilder,
+                                      SpatialPredicatesSpecification<?> spec,
+                                      Map<String, Object> variables) throws EntityFinderException {
 
 
         if (((SpatialPredicatesSpecification) spec).operator() instanceof SpatialConvertSpecification) {
-            // return ((SpatialConvertSpecification) ((SpatialPredicatesSpecification) spec).operator()).convert(module);
 
-            System.out.println("####### " + spec.operator().getClass().getSuperclass());
 
-            if (ElasticSearchFinder.Mixin.EXTENDED_QUERY_EXPRESSIONS_CATALOG.get(spec.operator().getClass().getSuperclass()) != null) {
+            if (ElasticSearchFinder.Mixin.EXTENDED_SPEC_SUPPORTS.get(spec.operator().getClass().getSuperclass()) != null) {
 
-                ElasticSearchSpatialFinder.SpatialQuerySpecSupport spatialQuerySpecSupport = ElasticSearchFinder.Mixin.EXTENDED_QUERY_EXPRESSIONS_CATALOG.get(spec.operator().getClass().getSuperclass());
-                spatialQuerySpecSupport.setModule(module, support);
-                // return spatialQuerySpecSupport.processSpecification(filterBuilder, spec.operator(), variables);
+                ElasticSearchSpatialFinder.SpatialQuerySpecSupport spatialQuerySpecSupport = ElasticSearchFinder.Mixin.EXTENDED_SPEC_SUPPORTS
+                        .get(spec.operator().getClass().getSuperclass()).support(module, support);
                 spatialQuerySpecSupport.processSpecification(filterBuilder, spec.operator(), variables);
 
             } else {
@@ -321,5 +297,4 @@ public abstract class AbstractElasticSearchSpatialFunction {
     }
 
 
-
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/internal/InternalUtils.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/internal/InternalUtils.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/internal/InternalUtils.java
index 1ce6a4e..f7ed650 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/internal/InternalUtils.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/internal/InternalUtils.java
@@ -1,10 +1,23 @@
+/*
+ * Copyright (c) 2014, Jiri Jetmar. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
 package org.qi4j.index.elasticsearch.extensions.spatial.internal;
 
 import org.qi4j.api.geometry.*;
 import org.qi4j.api.geometry.internal.TGeometry;
 import org.qi4j.api.property.GenericPropertyInfo;
 import org.qi4j.api.query.grammar.PropertyFunction;
-import org.qi4j.api.query.grammar.extensions.spatial.predicate.SpatialPredicatesSpecification;
 import org.qi4j.api.util.Classes;
 
 import java.lang.reflect.Type;
@@ -12,36 +25,29 @@ import java.lang.reflect.Type;
 /**
  * Ugly - not proud on this... How to make it better ?
  */
-public class InternalUtils
-{
+public class InternalUtils {
 
-    public static Class classOfPropertyType(PropertyFunction propertyFunction)
-    {
+    public static Class classOfPropertyType(PropertyFunction propertyFunction) {
         Type typeOfProperty = GenericPropertyInfo.toPropertyType(Classes.typeOf(propertyFunction.accessor()));
         Class classOfProperty = null;
-        try
-        {
+        try {
             classOfProperty = Class.forName(typeOfProperty.getTypeName());
-        } catch(Exception _ex)
-        {
+        } catch (Exception _ex) {
             // must not happen
             // TODO, logger
-        }
-        finally
-        {
+        } finally {
             return classOfProperty;
         }
     }
 
-    public static Class<? extends TGeometry> classOfGeometry(TGeometry geometry)
-    {
-        if (geometry instanceof TPoint)                 return TPoint.class;
-        if (geometry instanceof TMultiPoint)            return TMultiPoint.class;
-        if (geometry instanceof TLineString)            return TLineString.class;
-        if (geometry instanceof TPolygon)               return TPolygon.class;
-        if (geometry instanceof TMultiPolygon)          return TMultiPolygon.class;
-        if (geometry instanceof TFeature)               return TFeature.class;
-        if (geometry instanceof TFeatureCollection)     return TFeatureCollection.class;
+    public static Class<? extends TGeometry> classOfGeometry(TGeometry geometry) {
+        if (geometry instanceof TPoint) return TPoint.class;
+        if (geometry instanceof TMultiPoint) return TMultiPoint.class;
+        if (geometry instanceof TLineString) return TLineString.class;
+        if (geometry instanceof TPolygon) return TPolygon.class;
+        if (geometry instanceof TMultiPolygon) return TMultiPolygon.class;
+        if (geometry instanceof TFeature) return TFeature.class;
+        if (geometry instanceof TFeatureCollection) return TFeatureCollection.class;
         else return null;
     }
 

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/SpatialIndexMapper.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/SpatialIndexMapper.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/SpatialIndexMapper.java
index 341b977..c1de598 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/SpatialIndexMapper.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/SpatialIndexMapper.java
@@ -1,50 +1,56 @@
+/*
+ * Copyright (c) 2014, Jiri Jetmar. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
 package org.qi4j.index.elasticsearch.extensions.spatial.mappings;
 
 import org.qi4j.api.geometry.internal.TGeometry;
 import org.qi4j.index.elasticsearch.ElasticSearchSupport;
 import org.qi4j.index.elasticsearch.extensions.spatial.configuration.SpatialConfiguration;
 import org.qi4j.index.elasticsearch.extensions.spatial.mappings.cache.MappingsCachesTable;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import static org.qi4j.index.elasticsearch.extensions.spatial.mappings.builders.SpatialMappingFactory.*;
-import static org.qi4j.api.geometry.TGeometryFactory.*;
 
+import static org.qi4j.api.geometry.TGeometryFactory.TPoint;
+import static org.qi4j.index.elasticsearch.extensions.spatial.mappings.builders.SpatialMappingFactory.*;
 
-/**
- * Created by jj on 19.12.14.
- */
 public class SpatialIndexMapper {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(SpatialIndexMapper.class);
 
 
-    public static void createIfNotExist(ElasticSearchSupport support, TGeometry geometry, String property)
-    {
-        if (!MappingsCachesTable.getMappingCache(support).exists(property))
-        {
+    public static void createIfNotExist(ElasticSearchSupport support, TGeometry geometry, String property) {
+        if (!MappingsCachesTable.getMappingCache(support).exists(property)) {
             String mappingsOnServer = MappingQuery(support).get(property);
             System.out.println("Found " + mappingsOnServer);
 
-            if (mappingsOnServer != null)
-            {
+            if (mappingsOnServer != null) {
                 // TODO JJ check mappings : configuration versus server-side settings
                 MappingsCachesTable.getMappingCache(support).put(property, mappingsOnServer);
-            }
-            else
-            {
-                if (TPoint(support.getModule()).isPoint(geometry) )
-                {
-                    switch(SpatialConfiguration.getMethod(support.spatialConfiguration()) )
-                    {
-                        case GEO_POINT: GeoPointMapping(support).create(property); break;
-                        case GEO_SHAPE: GeoShapeMapping(support).create(property); break;
-                        default            : throw new RuntimeException("Unknown Point Maping Type.");
-                    }
-                }
-                else
-                {
+            } else {
+                if (TPoint(support.getModule()).isPoint(geometry)) {
+                    switch (SpatialConfiguration.getMethod(support.spatialConfiguration())) {
+                        case GEO_POINT:
+                            GeoPointMapping(support).create(property);
+                            break;
+                        case GEO_SHAPE:
                             GeoShapeMapping(support).create(property);
+                            break;
+                        default:
+                            throw new RuntimeException("Unknown Point Maping Type.");
+                    }
+                } else {
+                    GeoShapeMapping(support).create(property);
                 }
             }
         }
@@ -61,16 +67,12 @@ public class SpatialIndexMapper {
         public static boolean isMappedAsGeoShape(String index, String type, String property) {
             if (!MappingsCachesTable.getMappingCache(index, type).exists(property)) // <- No mappings yet, as no data in the index ?
                 return false;
-
-            // System.out.println("GEOSHAPE " + MappingsCachesTable.getMappingCache(index, type).get(property).toString());
             return MappingsCachesTable.getMappingCache(index, type).get(property).toString().indexOf("type=geo_shape") > -1 ? true : false;
         }
 
         public static boolean isMappedAsGeoPoint(String index, String type, String property) {
             if (!MappingsCachesTable.getMappingCache(index, type).exists(property)) // <- No mappings yet, as no data in the index ?
                 return false;
-
-            // System.out.println("GEOPOINT " +  MappingsCachesTable.getMappingCache(index, type).get(property).toString());
             return MappingsCachesTable.getMappingCache(index, type).get(property).toString().indexOf("type=geo_point") > -1 ? true : false;
         }
 
@@ -78,8 +80,7 @@ public class SpatialIndexMapper {
             return MappingsCachesTable.getMappingCache(index, type).exists(property);
         }
 
-        public static void clear()
-        {
+        public static void clear() {
             MappingsCachesTable.clear();
         }
 

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/AbstractBuilder.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/AbstractBuilder.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/AbstractBuilder.java
index 2d22b41..882c42c 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/AbstractBuilder.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/AbstractBuilder.java
@@ -1,3 +1,16 @@
+/*
+ * Copyright (c) 2014, Jiri Jetmar. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
 package org.qi4j.index.elasticsearch.extensions.spatial.mappings.builders;
 
 import org.elasticsearch.action.admin.indices.mapping.get.GetFieldMappingsResponse;
@@ -9,13 +22,14 @@ import org.qi4j.index.elasticsearch.extensions.spatial.mappings.cache.MappingsCa
  * Created by jj on 19.12.14.
  */
 public class AbstractBuilder {
+
     protected ElasticSearchSupport support;
 
-    public String get(String field)
-    {
-        if ( !isValid() ) throw new RuntimeException("ElasticSearch Index or Type not defined");
+    public String get(String field) {
+        if (!isValid()) throw new RuntimeException("ElasticSearch Index or Type not defined");
 
-        String index = support.index(); String type = support.entitiesType();
+        String index = support.index();
+        String type = support.entitiesType();
 
         GetFieldMappingsResponse response = support.client().admin().indices()
                 .prepareGetFieldMappings(index)
@@ -33,25 +47,22 @@ public class AbstractBuilder {
     }
 
 
-
-    protected boolean isValid()
-    {
+    protected boolean isValid() {
         return (support != null) && (support.index() != null) && (support.entitiesType() != null) ? true : false;
     }
 
-    protected boolean put(String field, String mappingJson)
-    {
-        if ( !isValid() ) throw new RuntimeException("ElasticSearch Index or Type not defined");
+    protected boolean put(String field, String mappingJson) {
+        if (!isValid()) throw new RuntimeException("ElasticSearch Index or Type not defined");
 
-        String index = support.index(); String type = support.entitiesType();
+        String index = support.index();
+        String type = support.entitiesType();
 
         PutMappingResponse ESSpatialMappingPUTResponse = support.client().admin().indices()
                 .preparePutMapping(index).setType(type)
                 .setSource(mappingJson)
                 .execute().actionGet();
 
-        if (ESSpatialMappingPUTResponse.isAcknowledged())
-        {
+        if (ESSpatialMappingPUTResponse.isAcknowledged()) {
             // we are reading the mapping back from server to assure that the server-side mappings always "wins"
             MappingsCachesTable.getMappingCache(support.index(), support.entitiesType()).put(field, get(field));
             return true;

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/GeoPointBuilder.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/GeoPointBuilder.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/GeoPointBuilder.java
index 1bf89c6..c653283 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/GeoPointBuilder.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/GeoPointBuilder.java
@@ -1,8 +1,23 @@
+/*
+ * Copyright (c) 2014, Jiri Jetmar. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
 package org.qi4j.index.elasticsearch.extensions.spatial.mappings.builders;
 
 import org.elasticsearch.common.xcontent.XContentBuilder;
 import org.elasticsearch.common.xcontent.XContentFactory;
 import org.qi4j.index.elasticsearch.ElasticSearchSupport;
+import org.qi4j.index.elasticsearch.extensions.spatial.configuration.SpatialConfiguration;
 
 import java.io.IOException;
 import java.util.StringTokenizer;
@@ -12,57 +27,43 @@ import java.util.StringTokenizer;
  */
 public class GeoPointBuilder extends AbstractBuilder {
 
-    private static final String DEFAULT_PRECISION = "1m";
-
-
     public GeoPointBuilder(ElasticSearchSupport support) {
         this.support = support;
     }
 
-
-    public boolean create(String field) {
-        try {
-            return put(field, createGeoPointMapping(field));
-        } catch(Exception _ex)
-        {
-            _ex.printStackTrace();
-        }
-        return false;
-    }
-
-
-    private static String createGeoPointMapping(String field) throws IOException {
-
-
-        XContentBuilder qi4jRootType = XContentFactory.jsonBuilder().startObject().startObject("qi4j_entities");
-
-        StringTokenizer tokenizer1 = new StringTokenizer(field, ".");
+    private  String createGeoPointMapping(String field) throws IOException
+    {
+        XContentBuilder qi4jRootType = XContentFactory.jsonBuilder().startObject().startObject(support.entitiesType());
+        StringTokenizer t1 = new StringTokenizer(field, ".");
         String propertyLevel1;
-        while (tokenizer1.hasMoreTokens()) {
-            propertyLevel1 = tokenizer1.nextToken();
-            // System.out.println("--> start level " + propertyLevel1);
+        while (t1.hasMoreTokens())
+        {
+            propertyLevel1 = t1.nextToken();
             qi4jRootType.startObject("properties").startObject(propertyLevel1);
         }
+                qi4jRootType
+                        .field("type", "geo_point") // geo_point
+                        .field("precision", SpatialConfiguration.getIndexerPrecision(support.spatialConfiguration()))
+                        .field("lat_lon", true);
 
-        qi4jRootType.field("type", "geo_point") // geo_point
-                // .field("lat_lon", true)
-                // .field("geohash", DEFAULT_GEOHASH_SUPPORT)
-                .field("precision", DEFAULT_PRECISION)
-                .field("lat_lon", true);
-
-        StringTokenizer tokenizer2 = new StringTokenizer(field, ".");
-        String propertyLevel2;
-        while (tokenizer2.hasMoreTokens()) {
-            propertyLevel2 = tokenizer2.nextToken();
-
+        StringTokenizer t2 = new StringTokenizer(field, ".");
+        while (t2.hasMoreTokens())
+        {
+            t2.nextToken();
             qi4jRootType.endObject();
         }
 
         qi4jRootType.endObject().endObject().endObject();
-
-
         return qi4jRootType.string();
+    }
 
+    public boolean create(String field) {
+        try {
+            return put(field, createGeoPointMapping(field));
+        } catch (Exception _ex) {
+            _ex.printStackTrace();
+        }
+        return false;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/GeoShapeBuilder.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/GeoShapeBuilder.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/GeoShapeBuilder.java
index 058ad78..fb739fb 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/GeoShapeBuilder.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/GeoShapeBuilder.java
@@ -1,8 +1,23 @@
+/*
+ * Copyright (c) 2014, Jiri Jetmar. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
 package org.qi4j.index.elasticsearch.extensions.spatial.mappings.builders;
 
 import org.elasticsearch.common.xcontent.XContentBuilder;
 import org.elasticsearch.common.xcontent.XContentFactory;
 import org.qi4j.index.elasticsearch.ElasticSearchSupport;
+import org.qi4j.index.elasticsearch.extensions.spatial.configuration.SpatialConfiguration;
 
 import java.io.IOException;
 import java.util.StringTokenizer;
@@ -12,82 +27,46 @@ import java.util.StringTokenizer;
  */
 public class GeoShapeBuilder extends AbstractBuilder {
 
-    private static final String DEFAULT_PRECISION = "1m";
-
-
     public GeoShapeBuilder(ElasticSearchSupport support) {
         this.support = support;
     }
 
-    public boolean create(String field) {
-        try {
-            return put(field, createESGeoShapeMapping(field));
-        } catch(Exception _ex)
-        {
-            _ex.printStackTrace();
-        }
-        return false;
-    }
-
-
-
-
-    private static String createESGeoShapeMapping(String property) throws IOException {
-
-        String valueType = "qi4j_entities"; // TODO JJ hack here
+    private  String createESGeoShapeMapping(String property) throws IOException {
 
-        // System.out.println("############## Property Tree" + property);
+        XContentBuilder qi4jRootType = XContentFactory.jsonBuilder().startObject().startObject(support.entitiesType());
 
-        XContentBuilder qi4jRootType = XContentFactory.jsonBuilder().startObject().startObject("qi4j_entities"); // .startObject("properties");
-
-        StringTokenizer tokenizer1 = new StringTokenizer(property, ".");
+        StringTokenizer t1 = new StringTokenizer(property, ".");
         String propertyLevel1;
-        while (tokenizer1.hasMoreTokens()) {
-            propertyLevel1 = tokenizer1.nextToken();
-            // System.out.println("--> start level " + propertyLevel1);
+        while (t1.hasMoreTokens())
+        {
+            propertyLevel1 = t1.nextToken();
             qi4jRootType.startObject("properties").startObject(propertyLevel1);
         }
 
+        qi4jRootType
+                .field("type", "geo_shape")
+                .field("precision", SpatialConfiguration.getIndexerPrecision(support.spatialConfiguration()))
+                .field("tree", "quadtree");
 
-        qi4jRootType.field("type", "geo_shape")
-                // .field("lat_lon", true)
-                // .field("geohash", DEFAULT_GEOHASH_SUPPORT)
-                .field("precision", DEFAULT_PRECISION)
-                .field("tree", "quadtree")
-                //.field("tree_levels",  "10");
-        ;
-        //.field("validate_lat", "true")
-        //.field("validate_lon", "true");
 
-        StringTokenizer tokenizer2 = new StringTokenizer(property, ".");
-        String propertyLevel2;
-        while (tokenizer2.hasMoreTokens()) {
-            propertyLevel2 = tokenizer2.nextToken();
-            // System.out.println("--> end level " + propertyLevel2);
-            // qi4jRootType.startObject(propertyLevel1);
+        StringTokenizer t2 = new StringTokenizer(property, ".");
+        while (t2.hasMoreTokens())
+        {
+            t2.nextToken();
             qi4jRootType.endObject();
         }
 
-/**
- return XContentFactory.jsonBuilder().startObject().startObject("qi4j_entities")// valueType)
- .startObject("properties").startObject(property)
- .field("type", "geo_point")
- .field("lat_lon", true)
- // .field("geohash", DEFAULT_GEOHASH_SUPPORT)
- .field("precision", DEFAULT_PRECISION)
- .field("validate_lat", "true")
- .field("validate_lon", "true")
- .endObject().endObject()
- .endObject().endObject().string();
- */
-
         qi4jRootType.endObject().endObject().endObject();
-
-        // System.out.println("qi4jRootType.toString() " + qi4jRootType.string());
-
         return qi4jRootType.string();
+    }
 
-
+    public boolean create(String field) {
+        try {
+            return put(field, createESGeoShapeMapping(field));
+        } catch (Exception _ex) {
+            _ex.printStackTrace();
+        }
+        return false;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/MappingQueryBuilder.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/MappingQueryBuilder.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/MappingQueryBuilder.java
index e027226..d70ae1c 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/MappingQueryBuilder.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/MappingQueryBuilder.java
@@ -1,3 +1,17 @@
+/*
+ * Copyright (c) 2014, Jiri Jetmar. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
 package org.qi4j.index.elasticsearch.extensions.spatial.mappings.builders;
 
 import org.qi4j.index.elasticsearch.ElasticSearchSupport;

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/SpatialMappingFactory.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/SpatialMappingFactory.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/SpatialMappingFactory.java
index 30fb374..1d13756 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/SpatialMappingFactory.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/builders/SpatialMappingFactory.java
@@ -1,3 +1,17 @@
+/*
+ * Copyright (c) 2014, Jiri Jetmar. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
 package org.qi4j.index.elasticsearch.extensions.spatial.mappings.builders;
 
 import org.qi4j.index.elasticsearch.ElasticSearchSupport;
@@ -10,13 +24,12 @@ public class SpatialMappingFactory {
     public static GeoPointBuilder GeoPointMapping(ElasticSearchSupport support) {
         return new GeoPointBuilder(support);
     }
-    public static GeoShapeBuilder GeoShapeMapping(ElasticSearchSupport support)
-    {
+
+    public static GeoShapeBuilder GeoShapeMapping(ElasticSearchSupport support) {
         return new GeoShapeBuilder(support);
     }
 
-    public static MappingQueryBuilder MappingQuery(ElasticSearchSupport support)
-    {
+    public static MappingQueryBuilder MappingQuery(ElasticSearchSupport support) {
         return new MappingQueryBuilder(support);
     }
 

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/cache/MappingsCache.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/cache/MappingsCache.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/cache/MappingsCache.java
index 9ab8278..3128092 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/cache/MappingsCache.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/cache/MappingsCache.java
@@ -1,3 +1,17 @@
+/*
+ * Copyright (c) 2014, Jiri Jetmar. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
 package org.qi4j.index.elasticsearch.extensions.spatial.mappings.cache;
 
 import com.google.common.cache.CacheBuilder;
@@ -5,42 +19,45 @@ import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
 import org.qi4j.index.elasticsearch.ElasticSearchSupport;
 
-import static org.qi4j.index.elasticsearch.extensions.spatial.mappings.builders.SpatialMappingFactory.MappingQuery;
-
 import java.util.concurrent.TimeUnit;
 
+import static org.qi4j.index.elasticsearch.extensions.spatial.mappings.builders.SpatialMappingFactory.MappingQuery;
+
 /**
  * Created by jj on 19.12.14.
  */
 public class MappingsCache {
 
-    // private static final int TTL_SECONDS        = 10 * 60;
-    private static final int TTL_SECONDS        = 1;
-    private static final int CONCURENCY_LEVEL   = 50;
+    private static final int TTL_SECONDS = 1 * 60; // <- JJ TODO make it configurable
+    private static final int CONCURENCY_LEVEL = 50;
 
-    private  LoadingCache<String, String> ES_MAPPINGS_CACHE;
+    private LoadingCache<String, String> ES_MAPPINGS_CACHE;
 
     private ElasticSearchSupport support;
 
-      {
-
-            ES_MAPPINGS_CACHE =
-                    CacheBuilder.newBuilder()
-                            .expireAfterAccess(TTL_SECONDS, TimeUnit.SECONDS)
-                            .concurrencyLevel(CONCURENCY_LEVEL) // valid ?
-                            .build(
-                                    new CacheLoader<String, String>() {
-                                        public String load(String key) {
-                                            if (valid()) {
-                                                return reloadStrategy(key);
-                                            } else
-                                                return "";
-                                        }
+    {
+
+        ES_MAPPINGS_CACHE =
+                CacheBuilder.newBuilder()
+                        .expireAfterAccess(TTL_SECONDS, TimeUnit.SECONDS)
+                        .concurrencyLevel(CONCURENCY_LEVEL) // valid ?
+                        .build(
+                                new CacheLoader<String, String>() {
+                                    public String load(String key) {
+                                        if (valid()) {
+                                            return reloadStrategy(key);
+                                        } else
+                                            return "";
                                     }
-                            );
+                                }
+                        );
+
+    }
 
-        }
 
+    public MappingsCache(ElasticSearchSupport support) {
+        this.support = support;
+    }
 
     private String reloadStrategy(String key) {
 
@@ -51,41 +68,27 @@ public class MappingsCache {
         return (result == null || result.length() == 0) ? "" : result;
     }
 
-    private  boolean valid()
-    {
+    private boolean valid() {
         return (support != null) && (support.index() != null) && (support.entitiesType() != null) ? true : false;
     }
 
 
-    public MappingsCache(ElasticSearchSupport support)
-    {
-        this.support = support;
-    }
-
-
-
-
-
-
-    public  boolean exists(String key)
-    {
+    public boolean exists(String key) {
         return (ES_MAPPINGS_CACHE.getUnchecked(key) == null) || ES_MAPPINGS_CACHE.getUnchecked(key).length() == 0 ? false : true;
     }
 
-    public  String get(String key)
-    {
+    public String get(String key) {
         return ES_MAPPINGS_CACHE.getUnchecked(key);
     }
 
 
-
-    public  void put(String key, String mappings)
-    {
+    public void put(String key, String mappings) {
         System.out.println("Cache PUT key " + key + " mappings " + mappings);
-        ES_MAPPINGS_CACHE.put(key, mappings);
+        if (mappings != null)
+            ES_MAPPINGS_CACHE.put(key, mappings);
     }
 
-    public  boolean putIfNotExist(String key, String mappings) {
+    public boolean putIfNotExist(String key, String mappings) {
         if (!exists(key)) {
             put(key, mappings);
             return false;

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/cache/MappingsCachesTable.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/cache/MappingsCachesTable.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/cache/MappingsCachesTable.java
index 4de5d43..d5f9aa3 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/cache/MappingsCachesTable.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/extensions/spatial/mappings/cache/MappingsCachesTable.java
@@ -1,31 +1,40 @@
+/*
+ * Copyright (c) 2014, Jiri Jetmar. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
 package org.qi4j.index.elasticsearch.extensions.spatial.mappings.cache;
 
 import com.google.common.collect.HashBasedTable;
 import com.google.common.collect.Table;
 import org.qi4j.index.elasticsearch.ElasticSearchSupport;
 
-/**
- * Created by jj on 19.12.14.
- */
+
 public class MappingsCachesTable {
 
     private static final Table<String, String, MappingsCache> CACHES_TABLE = HashBasedTable.create();
 
-    public static  MappingsCache getMappingCache(String index, String type)
-    {
+    public static MappingsCache getMappingCache(String index, String type) {
         return CACHES_TABLE.get(index, type);
     }
 
-    public static MappingsCache getMappingCache(ElasticSearchSupport support)
-    {
+    public static MappingsCache getMappingCache(ElasticSearchSupport support) {
         if (!CACHES_TABLE.contains(support.index(), support.entitiesType())) {
             CACHES_TABLE.put(support.index(), support.entitiesType(), new MappingsCache(support));
         }
         return CACHES_TABLE.get(support.index(), support.entitiesType());
     }
 
-    public static void clear()
-    {
+    public static void clear() {
         CACHES_TABLE.clear();
     }
 

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/filesystem/ESFilesystemSupport.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/filesystem/ESFilesystemSupport.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/filesystem/ESFilesystemSupport.java
index 0baccbe..ccad851 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/filesystem/ESFilesystemSupport.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/filesystem/ESFilesystemSupport.java
@@ -58,25 +58,7 @@ public class ESFilesystemSupport
         index = config.index().get() == null ? DEFAULT_INDEX_NAME : config.index().get();
         indexNonAggregatedAssociations = config.indexNonAggregatedAssociations().get();
 
-        indexPointMappingMethod = config.indexPointMappingMethod() == null ?
-                ElasticSearchConfiguration.INDEX_MAPPING_POINT_METHOD.GEO_POINT : config.indexPointMappingMethod().get();
-
-        indexPointMappingMethod = ElasticSearchConfiguration.INDEX_MAPPING_POINT_METHOD.GEO_POINT;
-
-
-        System.out.println("---- TEST FileSystemSupport ---- " + config.spatial());
-        System.out.println("---- TEST FileSystemSupport enabled ---- " + config.spatial().get().Enabled());
-        System.out.println("---- TEST FileSystemSupport Type ---- " + config.spatial().get().Indexer().get().Method());
-        System.out.println("---- TEST FileSystemSupport Projection enabled ---- " + config.spatial().get().Indexer().get().Projection().get().ConversionEnabled() );
-        System.out.println("---- TEST FileSystemSupport Projection Accuracy ---- " + config.spatial().get().Indexer().get().Projection().get().ConversionEnabled() );
-
-
-        System.out.println("---- TEST FileSystemSupport Finder Enabled ---- " + config.spatial().get().Finder().get().Projection().get().ConversionEnabled() );
-        System.out.println("---- TEST FileSystemSupport Finder Accuracy ---- " + config.spatial().get().Finder().get().Projection().get().ConversionAccuracy() );
-
-        spatialConfiguration = config.spatial().get();
-
-
+        defaultSpatialConfiguration(config);
 
         String identity = hasIdentity.identity().get();
         Settings settings = ImmutableSettings.settingsBuilder().

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/internal/AbstractElasticSearchSupport.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/internal/AbstractElasticSearchSupport.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/internal/AbstractElasticSearchSupport.java
index 902d392..bf4543d 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/internal/AbstractElasticSearchSupport.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/internal/AbstractElasticSearchSupport.java
@@ -20,8 +20,10 @@ package org.qi4j.index.elasticsearch.internal;
 import org.elasticsearch.client.Client;
 import org.elasticsearch.common.settings.ImmutableSettings;
 import org.elasticsearch.common.xcontent.XContentFactory;
+import org.qi4j.api.configuration.Configuration;
 import org.qi4j.api.injection.scope.Structure;
 import org.qi4j.api.structure.Module;
+import org.qi4j.api.value.ValueBuilder;
 import org.qi4j.index.elasticsearch.ElasticSearchConfiguration;
 import org.qi4j.index.elasticsearch.ElasticSearchSupport;
 import org.qi4j.index.elasticsearch.extensions.spatial.configuration.SpatialConfiguration;
@@ -46,8 +48,6 @@ public abstract class AbstractElasticSearchSupport
 
     protected boolean indexNonAggregatedAssociations;
 
-    protected ElasticSearchConfiguration.INDEX_MAPPING_POINT_METHOD indexPointMappingMethod;
-
     protected SpatialConfiguration.Configuration spatialConfiguration;
 
 
@@ -110,6 +110,54 @@ public abstract class AbstractElasticSearchSupport
         // NOOP
     }
 
+    protected void defaultSpatialConfiguration(ElasticSearchConfiguration configuration)
+    {
+
+        if (  (configuration.spatial().get() == null) )
+        {
+            SpatialConfiguration.Configuration cConfig = module.newValueBuilder(SpatialConfiguration.Configuration.class).prototype();
+
+            SpatialConfiguration.IndexerConfiguration cIndexer = module.newValueBuilder(SpatialConfiguration.IndexerConfiguration.class).prototype();
+            SpatialConfiguration.IndexingMethod cIndexingMethod = module.newValueBuilder(SpatialConfiguration.IndexingMethod.class).prototype();
+            SpatialConfiguration.ProjectionSupport cProjectionIndexerSupport = module.newValueBuilder(SpatialConfiguration.ProjectionSupport.class).prototype();
+
+            SpatialConfiguration.FinderConfiguration cFinder = module.newValueBuilder(SpatialConfiguration.FinderConfiguration.class).prototype();
+            SpatialConfiguration.ProjectionSupport cProjectionFinderSupport = module.newValueBuilder(SpatialConfiguration.ProjectionSupport.class).prototype();
+
+
+
+            cIndexingMethod.Type().set(SpatialConfiguration.INDEXING_METHOD.GEO_POINT);
+            cIndexingMethod.Precision().set("2m");
+
+            cProjectionIndexerSupport.ConversionEnabled().set(true);
+            cProjectionIndexerSupport.ConversionAccuracy().set("2m");
+
+            // Setup Indexer
+            cIndexer.Method().set(cIndexingMethod);
+            cIndexer.Projection().set(cProjectionIndexerSupport);
+
+
+            cProjectionFinderSupport.ConversionEnabled().set(true);
+            cProjectionFinderSupport.ConversionAccuracy().set("2m");
+
+            // Setup Finder
+            cFinder.Projection().set(cProjectionFinderSupport);
+
+            // Setup Configuration
+            cConfig.Enabled().set(true);
+            cConfig.Indexer().set(cIndexer);
+            cConfig.Finder().set(cFinder);
+
+            spatialConfiguration = cConfig;
+
+        } else
+        {
+            // config available
+            spatialConfiguration = configuration.spatial().get();
+        }
+
+    }
+
     @Override
     public final Client client()
     {
@@ -135,9 +183,6 @@ public abstract class AbstractElasticSearchSupport
     }
 
     @Override
-    public final ElasticSearchConfiguration.INDEX_MAPPING_POINT_METHOD indexPointMappingMethod() { return indexPointMappingMethod; }
-
-    @Override
     public final SpatialConfiguration.Configuration spatialConfiguration()
     {
         return spatialConfiguration;

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/memory/ESMemorySupport.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/memory/ESMemorySupport.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/memory/ESMemorySupport.java
index e810bea..76bb786 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/memory/ESMemorySupport.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/memory/ESMemorySupport.java
@@ -58,13 +58,7 @@ public class ESMemorySupport
         index = config.index().get() == null ? DEFAULT_INDEX_NAME : config.index().get();
         indexNonAggregatedAssociations = config.indexNonAggregatedAssociations().get();
 
-        indexPointMappingMethod = config.indexPointMappingMethod() == null ?
-                ElasticSearchConfiguration.INDEX_MAPPING_POINT_METHOD.GEO_POINT : config.indexPointMappingMethod().get();
-
-        indexPointMappingMethod = ElasticSearchConfiguration.INDEX_MAPPING_POINT_METHOD.GEO_POINT;
-
-        System.out.println("---- TEST ---- " + config.spatial());
-
+        defaultSpatialConfiguration(config);
 
         String identity = hasIdentity.identity().get();
         Settings settings = ImmutableSettings.settingsBuilder().

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchComplexQueryTest.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchComplexQueryTest.java b/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchComplexQueryTest.java
index 5504e9b..4aa59bc 100644
--- a/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchComplexQueryTest.java
+++ b/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchComplexQueryTest.java
@@ -25,6 +25,7 @@ import org.qi4j.api.common.Visibility;
 import org.qi4j.bootstrap.AssemblyException;
 import org.qi4j.bootstrap.ModuleAssembly;
 import org.qi4j.index.elasticsearch.assembly.ESFilesystemIndexQueryAssembler;
+import org.qi4j.index.elasticsearch.extensions.spatial.configuration.SpatialConfiguration;
 import org.qi4j.library.fileconfig.FileConfigurationOverride;
 import org.qi4j.library.fileconfig.FileConfigurationService;
 import org.qi4j.test.EntityTestAssembler;
@@ -56,6 +57,12 @@ public class ElasticSearchComplexQueryTest
 
         // Config module
         ModuleAssembly config = module.layer().module( "config" );
+        config.values(SpatialConfiguration.Configuration.class,
+                SpatialConfiguration.FinderConfiguration.class,
+                SpatialConfiguration.IndexerConfiguration.class,
+                SpatialConfiguration.IndexingMethod.class,
+                SpatialConfiguration.ProjectionSupport.class).
+                visibleIn(Visibility.application);
         new EntityTestAssembler().assemble( config );
 
         // Index/Query

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchFinderTest.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchFinderTest.java b/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchFinderTest.java
index 3766545..4429b8b 100644
--- a/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchFinderTest.java
+++ b/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchFinderTest.java
@@ -24,6 +24,7 @@ import org.qi4j.api.common.Visibility;
 import org.qi4j.bootstrap.AssemblyException;
 import org.qi4j.bootstrap.ModuleAssembly;
 import org.qi4j.index.elasticsearch.assembly.ESFilesystemIndexQueryAssembler;
+import org.qi4j.index.elasticsearch.extensions.spatial.configuration.SpatialConfiguration;
 import org.qi4j.library.fileconfig.FileConfigurationOverride;
 import org.qi4j.library.fileconfig.FileConfigurationService;
 import org.qi4j.test.EntityTestAssembler;
@@ -53,6 +54,12 @@ public class ElasticSearchFinderTest
 
         // Config module
         ModuleAssembly config = module.layer().module( "config" );
+        config.values(SpatialConfiguration.Configuration.class,
+                SpatialConfiguration.FinderConfiguration.class,
+                SpatialConfiguration.IndexerConfiguration.class,
+                SpatialConfiguration.IndexingMethod.class,
+                SpatialConfiguration.ProjectionSupport.class).
+                visibleIn(Visibility.application);
         new EntityTestAssembler().assemble( config );
 
         // Index/Query

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchQueryTest.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchQueryTest.java b/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchQueryTest.java
index cb8221d..1f02832 100644
--- a/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchQueryTest.java
+++ b/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchQueryTest.java
@@ -32,6 +32,7 @@ import org.qi4j.api.query.QueryBuilder;
 import org.qi4j.bootstrap.AssemblyException;
 import org.qi4j.bootstrap.ModuleAssembly;
 import org.qi4j.index.elasticsearch.assembly.ESFilesystemIndexQueryAssembler;
+import org.qi4j.index.elasticsearch.extensions.spatial.configuration.SpatialConfiguration;
 import org.qi4j.library.fileconfig.FileConfigurationOverride;
 import org.qi4j.library.fileconfig.FileConfigurationService;
 import org.qi4j.spi.query.EntityFinderException;
@@ -70,6 +71,12 @@ public class ElasticSearchQueryTest
 
         // Config module
         ModuleAssembly config = module.layer().module( "config" );
+        config.values(SpatialConfiguration.Configuration.class,
+                SpatialConfiguration.FinderConfiguration.class,
+                SpatialConfiguration.IndexerConfiguration.class,
+                SpatialConfiguration.IndexingMethod.class,
+                SpatialConfiguration.ProjectionSupport.class).
+                visibleIn(Visibility.application);
         new EntityTestAssembler().assemble( config );
 
         // Index/Query
@@ -116,38 +123,4 @@ public class ElasticSearchQueryTest
     {
         super.script42_DateTime();
     }
-
-    @Test
-    public void script53_Spatial_ST_WithIn()
-    {
-        QueryBuilder<City> qb = this.module.newQueryBuilder(City.class);
-        Query<City> query = unitOfWork.newQuery(
-                qb
-                        .where(
-                                ST_Within
-                                        (
-                                                templateFor(City.class).location(),
-                                                ST_GeometryFromText("POINT(3.139003 101.686854)"),
-                                                100,
-                                                TUnit.METER
-                                        )
-                        ));
-        System.out.println( "*** script53_Spatial_ST_WithIn: " + query );
-
-        System.out.println("Query Count " + query.count());
-
-        // System.out.println( "*** script01: " + query );
-        query.find();
-    }
-
-    @Test
-    public void script53_Spatial_ST_WithIn2() {
-        QueryBuilder<Person> qb = this.module.newQueryBuilder(Person.class);
-        Person person = templateFor(Person.class);
-        Query<Person> query = unitOfWork.newQuery(qb.where(
-                eq(person.dateTimeValue(), new DateTime("2010-03-04T13:24:35", UTC))));
-        System.out.println("*** script40_DateTime: " + query);
-
-        // verifyUnorderedResults(query, "Jack Doe");
-    }
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchTest.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchTest.java b/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchTest.java
index 4bd673e..53ae6d7 100644
--- a/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchTest.java
+++ b/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ElasticSearchTest.java
@@ -36,6 +36,7 @@ import org.qi4j.api.unitofwork.UnitOfWorkCompletionException;
 import org.qi4j.bootstrap.AssemblyException;
 import org.qi4j.bootstrap.ModuleAssembly;
 import org.qi4j.index.elasticsearch.assembly.ESFilesystemIndexQueryAssembler;
+import org.qi4j.index.elasticsearch.extensions.spatial.configuration.SpatialConfiguration;
 import org.qi4j.library.fileconfig.FileConfigurationOverride;
 import org.qi4j.library.fileconfig.FileConfigurationService;
 import org.qi4j.test.AbstractQi4jTest;
@@ -128,6 +129,12 @@ public class ElasticSearchTest
     {
         // Config module
         ModuleAssembly config = module.layer().module( "config" );
+        config.values(SpatialConfiguration.Configuration.class,
+                SpatialConfiguration.FinderConfiguration.class,
+                SpatialConfiguration.IndexerConfiguration.class,
+                SpatialConfiguration.IndexingMethod.class,
+                SpatialConfiguration.ProjectionSupport.class).
+                visibleIn(Visibility.application);
         new EntityTestAssembler().assemble( config );
 
         // EntityStore

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9d71ec3c/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ImmenseTermTest.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ImmenseTermTest.java b/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ImmenseTermTest.java
index 6308f40..0a05788 100644
--- a/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ImmenseTermTest.java
+++ b/extensions/indexing-elasticsearch/src/test/java/org/qi4j/index/elasticsearch/ImmenseTermTest.java
@@ -31,6 +31,7 @@ import org.qi4j.api.unitofwork.UnitOfWork;
 import org.qi4j.bootstrap.AssemblyException;
 import org.qi4j.bootstrap.ModuleAssembly;
 import org.qi4j.index.elasticsearch.assembly.ESFilesystemIndexQueryAssembler;
+import org.qi4j.index.elasticsearch.extensions.spatial.configuration.SpatialConfiguration;
 import org.qi4j.library.fileconfig.FileConfigurationOverride;
 import org.qi4j.library.fileconfig.FileConfigurationService;
 import org.qi4j.test.AbstractQi4jTest;
@@ -87,6 +88,12 @@ public class ImmenseTermTest
     {
         // Config module
         ModuleAssembly config = module.layer().module( "config" );
+        config.values(SpatialConfiguration.Configuration.class,
+                SpatialConfiguration.FinderConfiguration.class,
+                SpatialConfiguration.IndexerConfiguration.class,
+                SpatialConfiguration.IndexingMethod.class,
+                SpatialConfiguration.ProjectionSupport.class).
+                visibleIn(Visibility.application);
         new EntityTestAssembler().assemble( config );
 
         // EntityStore