diff --git a/python/core/auto_generated/qgsvectorlayertemporalproperties.sip.in b/python/core/auto_generated/qgsvectorlayertemporalproperties.sip.in index 0ddfef583159..b341f0e4ba3f 100644 --- a/python/core/auto_generated/qgsvectorlayertemporalproperties.sip.in +++ b/python/core/auto_generated/qgsvectorlayertemporalproperties.sip.in @@ -11,6 +11,36 @@ +class QgsVectorLayerTemporalContext +{ +%Docstring +Encapsulates the context in which a QgsVectorLayer's temporal capabilities +will be applied + +.. versionadded:: 3.14 +%End + +%TypeHeaderCode +#include "qgsvectorlayertemporalproperties.h" +%End + public: + + QgsVectorLayer *layer() const; +%Docstring +Returns the associated layer. + +.. seealso:: :py:func:`setLayer` +%End + + void setLayer( QgsVectorLayer *layer ); +%Docstring +Sets the associated ``layer``. + +.. seealso:: :py:func:`layer` +%End + +}; + class QgsVectorLayerTemporalProperties : QgsMapLayerTemporalProperties { %Docstring @@ -298,10 +328,10 @@ occur before or within the map's temporal range should be rendered). .. seealso:: :py:func:`accumulateFeatures` %End - QString createFilterString( QgsVectorLayer *layer, const QgsDateTimeRange &range ) const; + QString createFilterString( const QgsVectorLayerTemporalContext &context, const QgsDateTimeRange &range ) const; %Docstring -Creates a QGIS expression filter string for filtering features from ``layer`` -to those within the specified time ``range``. +Creates a QGIS expression filter string for filtering features within +the specified ``context`` to those within the specified time ``range``. The returned expression string considers the mode() and other related settings (such as startField()) when building the filter string. diff --git a/src/core/qgsvectorlayerrenderer.cpp b/src/core/qgsvectorlayerrenderer.cpp index 986b75661871..c7d7202032b3 100644 --- a/src/core/qgsvectorlayerrenderer.cpp +++ b/src/core/qgsvectorlayerrenderer.cpp @@ -63,7 +63,9 @@ QgsVectorLayerRenderer::QgsVectorLayerRenderer( QgsVectorLayer *layer, QgsRender if ( context.isTemporal() ) { - mTemporalFilter = qobject_cast< const QgsVectorLayerTemporalProperties * >( layer->temporalProperties() )->createFilterString( layer, context.temporalRange() ); + QgsVectorLayerTemporalContext temporalContext; + temporalContext.setLayer( layer ); + mTemporalFilter = qobject_cast< const QgsVectorLayerTemporalProperties * >( layer->temporalProperties() )->createFilterString( temporalContext, context.temporalRange() ); } // if there's already a simplification method specified via the context, we respect that. Otherwise, we fall back diff --git a/src/core/qgsvectorlayertemporalproperties.cpp b/src/core/qgsvectorlayertemporalproperties.cpp index ce4cc591072e..f65b3465db1c 100644 --- a/src/core/qgsvectorlayertemporalproperties.cpp +++ b/src/core/qgsvectorlayertemporalproperties.cpp @@ -411,7 +411,7 @@ QString dateTimeExpressionLiteral( const QDateTime &datetime ) .arg( datetime.time().second() + datetime.time().msec() / 1000.0 ); } -QString QgsVectorLayerTemporalProperties::createFilterString( QgsVectorLayer *, const QgsDateTimeRange &range ) const +QString QgsVectorLayerTemporalProperties::createFilterString( const QgsVectorLayerTemporalContext &, const QgsDateTimeRange &range ) const { if ( !isActive() ) return QString(); @@ -651,3 +651,13 @@ void QgsVectorLayerTemporalProperties::guessDefaultsFromFields( const QgsFields // note -- NEVER auto enable temporal properties here! It's just a helper designed // to shortcut the initial field selection } + +QgsVectorLayer *QgsVectorLayerTemporalContext::layer() const +{ + return mLayer; +} + +void QgsVectorLayerTemporalContext::setLayer( QgsVectorLayer *layer ) +{ + mLayer = layer; +} diff --git a/src/core/qgsvectorlayertemporalproperties.h b/src/core/qgsvectorlayertemporalproperties.h index 5655d4fc04d3..3a618dd3569b 100644 --- a/src/core/qgsvectorlayertemporalproperties.h +++ b/src/core/qgsvectorlayertemporalproperties.h @@ -29,6 +29,37 @@ class QgsVectorLayer; class QgsFields; +/** + * \class QgsVectorLayerTemporalContext + * \ingroup core + * Encapsulates the context in which a QgsVectorLayer's temporal capabilities + * will be applied + * + * \since QGIS 3.14 + */ +class CORE_EXPORT QgsVectorLayerTemporalContext +{ + public: + + /** + * Returns the associated layer. + * + * \see setLayer() + */ + QgsVectorLayer *layer() const; + + /** + * Sets the associated \a layer. + * + * \see layer() + */ + void setLayer( QgsVectorLayer *layer ); + + private: + + QgsVectorLayer *mLayer = nullptr; +}; + /** * \class QgsVectorLayerTemporalProperties * \ingroup core @@ -283,8 +314,8 @@ class CORE_EXPORT QgsVectorLayerTemporalProperties : public QgsMapLayerTemporalP void setAccumulateFeatures( bool accumulate ); /** - * Creates a QGIS expression filter string for filtering features from \a layer - * to those within the specified time \a range. + * Creates a QGIS expression filter string for filtering features within + * the specified \a context to those within the specified time \a range. * * The returned expression string considers the mode() and other related * settings (such as startField()) when building the filter string. @@ -294,7 +325,7 @@ class CORE_EXPORT QgsVectorLayerTemporalProperties : public QgsMapLayerTemporalP * isVisibleInTemporalRange() when testing whether features from a layer set to the * ModeFixedTemporalRange should ALL be filtered out. */ - QString createFilterString( QgsVectorLayer *layer, const QgsDateTimeRange &range ) const; + QString createFilterString( const QgsVectorLayerTemporalContext &context, const QgsDateTimeRange &range ) const; /** * Attempts to setup the temporal properties by scanning a set of \a fields diff --git a/tests/src/python/test_qgsvectorlayertemporalproperties.py b/tests/src/python/test_qgsvectorlayertemporalproperties.py index b76d9d505a5a..6e43686e658f 100644 --- a/tests/src/python/test_qgsvectorlayertemporalproperties.py +++ b/tests/src/python/test_qgsvectorlayertemporalproperties.py @@ -17,7 +17,8 @@ QgsReadWriteContext, QgsVectorLayer, QgsVectorDataProviderTemporalCapabilities, - QgsUnitTypes) + QgsUnitTypes, + QgsVectorLayerTemporalContext) from qgis.PyQt.QtCore import (QDateTime, QDate, QTime, @@ -142,64 +143,71 @@ def testFixedRangeMode(self): self.assertFalse(props.isVisibleInTemporalRange(QgsDateTimeRange(QDateTime(QDate(1920, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(1921, 9, 6), QTime(8, 9, 10))))) layer = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime", "test", "memory") + context = QgsVectorLayerTemporalContext() + context.setLayer(layer) + range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) # ALWAYS must be empty for ModeFixedTemporalRange - self.assertFalse(props.createFilterString(layer, range)) + self.assertFalse(props.createFilterString(context, range)) def testSingleFieldMode(self): layer = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime", "test", "memory") self.assertTrue(layer.isValid()) self.assertEqual(layer.fields()[2].type(), QVariant.DateTime) + context = QgsVectorLayerTemporalContext() + context.setLayer(layer) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) props = QgsVectorLayerTemporalProperties(enabled=False) props.setMode(QgsVectorLayerTemporalProperties.ModeFeatureDateTimeInstantFromField) props.setStartField('start_field') - self.assertFalse(props.createFilterString(layer, range)) + self.assertFalse(props.createFilterString(context, range)) props.setIsActive(True) - self.assertEqual(props.createFilterString(layer, range), '("start_field" >= make_datetime(2019,3,4,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '("start_field" >= make_datetime(2019,3,4,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) - self.assertEqual(props.createFilterString(layer, range), '("start_field" > make_datetime(2019,3,4,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '("start_field" > make_datetime(2019,3,4,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) - self.assertEqual(props.createFilterString(layer, range), '("start_field" >= make_datetime(2019,3,4,11,12,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '("start_field" >= make_datetime(2019,3,4,11,12,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') # with fixed duration props.setFixedDuration(3) props.setDurationUnits(QgsUnitTypes.TemporalDays) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) - self.assertEqual(props.createFilterString(layer, range), '("start_field" >= make_datetime(2019,3,1,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '("start_field" >= make_datetime(2019,3,1,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) - self.assertEqual(props.createFilterString(layer, range), '("start_field" > make_datetime(2019,3,1,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '("start_field" > make_datetime(2019,3,1,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) - self.assertEqual(props.createFilterString(layer, range), '("start_field" >= make_datetime(2019,3,1,11,12,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '("start_field" >= make_datetime(2019,3,1,11,12,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') props.setDurationUnits(QgsUnitTypes.TemporalMinutes) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) - self.assertEqual(props.createFilterString(layer, range), + self.assertEqual(props.createFilterString(context, range), '("start_field" >= make_datetime(2019,3,4,11,9,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') # accumulate mode props.setAccumulateFeatures(True) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) - self.assertEqual(props.createFilterString(layer, range), '("start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) - self.assertEqual(props.createFilterString(layer, range), '("start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) - self.assertEqual(props.createFilterString(layer, range), '("start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '("start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') def testDualFieldMode(self): layer = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime&field=end_field:datetime", "test", "memory") self.assertTrue(layer.isValid()) self.assertEqual(layer.fields()[2].type(), QVariant.DateTime) self.assertEqual(layer.fields()[3].type(), QVariant.DateTime) + context = QgsVectorLayerTemporalContext() + context.setLayer(layer) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) @@ -207,35 +215,35 @@ def testDualFieldMode(self): props.setMode(QgsVectorLayerTemporalProperties.ModeFeatureDateTimeStartAndEndFromFields) props.setStartField('start_field') props.setEndField('end_field') - self.assertFalse(props.createFilterString(layer, range)) + self.assertFalse(props.createFilterString(context, range)) props.setIsActive(True) - self.assertEqual(props.createFilterString(layer, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND ("end_field" >= make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL)') + self.assertEqual(props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND ("end_field" >= make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL)') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) - self.assertEqual(props.createFilterString(layer, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND ("end_field" > make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL)') + self.assertEqual(props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND ("end_field" > make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL)') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) - self.assertEqual(props.createFilterString(layer, range), '("start_field" < make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND ("end_field" >= make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL)') + self.assertEqual(props.createFilterString(context, range), '("start_field" < make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND ("end_field" >= make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL)') props.setEndField('') - self.assertEqual(props.createFilterString(layer, range), '"start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '"start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) - self.assertEqual(props.createFilterString(layer, range), '"start_field" < make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '"start_field" < make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) - self.assertEqual(props.createFilterString(layer, range), '"start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '"start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL') props.setStartField('') props.setEndField('end_field') - self.assertEqual(props.createFilterString(layer, range), '"end_field" >= make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '"end_field" >= make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) - self.assertEqual(props.createFilterString(layer, range), '"end_field" > make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '"end_field" > make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) - self.assertEqual(props.createFilterString(layer, range), '"end_field" >= make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL') + self.assertEqual(props.createFilterString(context, range), '"end_field" >= make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL') def testStartAndDurationMode(self): layer = QgsVectorLayer( @@ -244,6 +252,8 @@ def testStartAndDurationMode(self): self.assertTrue(layer.isValid()) self.assertEqual(layer.fields()[2].type(), QVariant.DateTime) self.assertEqual(layer.fields()[3].type(), QVariant.Double) + context = QgsVectorLayerTemporalContext() + context.setLayer(layer) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) @@ -253,46 +263,46 @@ def testStartAndDurationMode(self): props.setStartField('start_field') props.setDurationField('duration') props.setDurationUnits(QgsUnitTypes.TemporalMilliseconds) - self.assertFalse(props.createFilterString(layer, range)) + self.assertFalse(props.createFilterString(context, range)) props.setIsActive(True) - self.assertEqual(props.createFilterString(layer, range), + self.assertEqual(props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,0,0,0,"duration"/1000) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)') props.setDurationUnits(QgsUnitTypes.TemporalSeconds) - self.assertEqual(props.createFilterString(layer, range), + self.assertEqual(props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,0,0,0,"duration") >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)') props.setDurationUnits(QgsUnitTypes.TemporalMinutes) - self.assertEqual(props.createFilterString(layer, range), + self.assertEqual(props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,0,0,"duration",0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)') props.setDurationUnits(QgsUnitTypes.TemporalHours) - self.assertEqual(props.createFilterString(layer, range), + self.assertEqual(props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,0,"duration",0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)') props.setDurationUnits(QgsUnitTypes.TemporalDays) - self.assertEqual(props.createFilterString(layer, range), + self.assertEqual(props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,"duration",0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)') props.setDurationUnits(QgsUnitTypes.TemporalWeeks) - self.assertEqual(props.createFilterString(layer, range), + self.assertEqual(props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,"duration",0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)') props.setDurationUnits(QgsUnitTypes.TemporalMonths) - self.assertEqual(props.createFilterString(layer, range), + self.assertEqual(props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,"duration",0,0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)') props.setDurationUnits(QgsUnitTypes.TemporalYears) - self.assertEqual(props.createFilterString(layer, range), + self.assertEqual(props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval("duration",0,0,0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)') props.setDurationUnits(QgsUnitTypes.TemporalDecades) - self.assertEqual(props.createFilterString(layer, range), + self.assertEqual(props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(10 * "duration",0,0,0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)') props.setDurationUnits(QgsUnitTypes.TemporalCenturies) - self.assertEqual(props.createFilterString(layer, range), + self.assertEqual(props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(100 * "duration",0,0,0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)') def testExpressionMode(self): @@ -300,6 +310,8 @@ def testExpressionMode(self): self.assertTrue(layer.isValid()) self.assertEqual(layer.fields()[2].type(), QVariant.DateTime) self.assertEqual(layer.fields()[3].type(), QVariant.DateTime) + context = QgsVectorLayerTemporalContext() + context.setLayer(layer) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) @@ -307,35 +319,35 @@ def testExpressionMode(self): props.setMode(QgsVectorLayerTemporalProperties.ModeFeatureDateTimeStartAndEndFromExpressions) props.setStartExpression('to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')"') props.setEndExpression('to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')"') - self.assertFalse(props.createFilterString(layer, range)) + self.assertFalse(props.createFilterString(context, range)) props.setIsActive(True) - self.assertEqual(props.createFilterString(layer, range), '((to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)) AND ((to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13))') + self.assertEqual(props.createFilterString(context, range), '((to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)) AND ((to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13))') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) - self.assertEqual(props.createFilterString(layer, range), '((to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)) AND ((to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") > make_datetime(2019,3,4,11,12,13))') + self.assertEqual(props.createFilterString(context, range), '((to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)) AND ((to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") > make_datetime(2019,3,4,11,12,13))') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) - self.assertEqual(props.createFilterString(layer, range), '((to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") < make_datetime(2020,5,6,8,9,10)) AND ((to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13))') + self.assertEqual(props.createFilterString(context, range), '((to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") < make_datetime(2020,5,6,8,9,10)) AND ((to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13))') props.setEndExpression('') - self.assertEqual(props.createFilterString(layer, range), '(to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)') + self.assertEqual(props.createFilterString(context, range), '(to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) - self.assertEqual(props.createFilterString(layer, range), '(to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") < make_datetime(2020,5,6,8,9,10)') + self.assertEqual(props.createFilterString(context, range), '(to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") < make_datetime(2020,5,6,8,9,10)') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) - self.assertEqual(props.createFilterString(layer, range), '(to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)') + self.assertEqual(props.createFilterString(context, range), '(to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)') props.setStartExpression('') props.setEndExpression('to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')"') - self.assertEqual(props.createFilterString(layer, range), '(to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13)') + self.assertEqual(props.createFilterString(context, range), '(to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13)') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) - self.assertEqual(props.createFilterString(layer, range), '(to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") > make_datetime(2019,3,4,11,12,13)') + self.assertEqual(props.createFilterString(context, range), '(to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") > make_datetime(2019,3,4,11,12,13)') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) - self.assertEqual(props.createFilterString(layer, range), '(to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13)') + self.assertEqual(props.createFilterString(context, range), '(to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13)') if __name__ == '__main__':