Skip to content

Commit

Permalink
Merge pull request #5 from EOX-A/sql-string-with-date
Browse files Browse the repository at this point in the history
Correctly build SQL string with filtered date
  • Loading branch information
submarcos committed Feb 12, 2021
2 parents 70514be + b31a150 commit ddfafe8
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 4 deletions.
18 changes: 18 additions & 0 deletions test_vectortiles/test_app/migrations/0003_feature_date.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.1.6 on 2021-02-12 12:32

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('test_app', '0002_auto_20201020_1615'),
]

operations = [
migrations.AddField(
model_name='feature',
name='date',
field=models.DateField(null=True),
),
]
1 change: 1 addition & 0 deletions test_vectortiles/test_app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ class Feature(models.Model):
geom = models.GeometryField(srid=4326)
name = models.CharField(max_length=250)
layer = models.ForeignKey(Layer, on_delete=models.CASCADE, related_name='features')
date = models.DateField(null=True)

class Meta:
ordering = ('id', )
6 changes: 6 additions & 0 deletions test_vectortiles/test_app/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ class PostGISFeatureView(PostgisMVTView, ListView):
vector_tile_fields = ('name', )


class PostGISFeatureWithDateView(PostgisMVTView, ListView):
queryset = Feature.objects.filter(date="2020-07-07")
vector_tile_layer_name = "features"
vector_tile_fields = ('name', )


class PostGISLayerView(PostgisMVTView, DetailView):
model = Layer
vector_tile_fields = ('name', )
Expand Down
2 changes: 2 additions & 0 deletions test_vectortiles/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
# feature level
path('features/postgis/tile/<int:z>/<int:x>/<int:y>', views.PostGISFeatureView.as_view(),
name="feature-postgis"),
path('features/postgis/tile/date/<int:z>/<int:x>/<int:y>', views.PostGISFeatureWithDateView.as_view(),
name="feature-date-postgis"),
path('features/postgis/tile/{z}/{x}/{y}', page_not_found,
name="feature-postgis-pattern"),
path('features/postgis/tilejson', views.PostGISTileJSONFeatureView.as_view(),
Expand Down
5 changes: 3 additions & 2 deletions vectortiles/postgis/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,9 @@ def get_tile(self, x, y, z, extent=4096, buffer=256, clip_geom=True):
# keep values to include in tile (extra included_fields + geometry)
features = features.values(*fields)
# generate MVT
sql, params = features.query.sql_with_params()
with connection.cursor() as cursor:
cursor.execute("SELECT ST_ASMVT(subquery.*, %s, %s, %s) FROM ({}) as subquery".format(features.query),
params=[self.get_vector_tile_layer_name(), extent, "geom_prepared"])
cursor.execute("SELECT ST_ASMVT(subquery.*, %s, %s, %s) FROM ({}) as subquery".format(sql),
params=[self.get_vector_tile_layer_name(), extent, "geom_prepared", *params])
row = cursor.fetchone()[0]
return row.tobytes() if row else None
20 changes: 18 additions & 2 deletions vectortiles/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@ def setUpTestData(cls):
Feature.objects.create(
name="feat1",
geom="POINT(0 0)",
layer=cls.layer
layer=cls.layer,
date="2020-07-07"
)
Feature.objects.create(
name="feat2",
geom="LINESTRING(0 0, 1 1)",
layer=cls.layer
layer=cls.layer,
date="2020-08-08"
)


Expand Down Expand Up @@ -91,6 +93,20 @@ def test_postgis_features(self):
'properties': {'name': 'feat2'}, 'id': 0, 'type': 2}]
}})

def test_postgis_features_with_filtered_date(self):
self.maxDiff = None
response = self.client.get(reverse('feature-date-postgis', args=(0, 0, 0)))
self.assertEqual(response.status_code, 200)
content = mapbox_vector_tile.decode(response.content)
self.assertDictEqual(
content,
{'features': {
'extent': 4096,
'version': 2,
'features': [{'geometry': {'type': 'Point', 'coordinates': [2048, 2048]},
'properties': {'name': 'feat1'}, 'id': 0, 'type': 1}]
}})


class VectorTileTileJSONTestCase(VectorTileBaseTest):
def test_mapbox_layer(self):
Expand Down

0 comments on commit ddfafe8

Please sign in to comment.