23#include "qgsmeshmemorydataprovider.h"
25QgsMeshCalcNode::QgsMeshCalcNode()
28QgsMeshCalcNode::QgsMeshCalcNode(
double number )
34QgsMeshCalcNode::QgsMeshCalcNode( Operator op, QgsMeshCalcNode *left, QgsMeshCalcNode *right )
41QgsMeshCalcNode::QgsMeshCalcNode( QgsMeshCalcNode *condition , QgsMeshCalcNode *left , QgsMeshCalcNode *right )
45 , mCondition( condition )
49QgsMeshCalcNode::QgsMeshCalcNode(
const QString &datasetGroupName )
50 : mType( tDatasetGroupRef )
51 , mDatasetGroupName( datasetGroupName )
53 if ( mDatasetGroupName.startsWith(
'"' ) && mDatasetGroupName.endsWith(
'"' ) )
54 mDatasetGroupName = mDatasetGroupName.mid( 1, mDatasetGroupName.size() - 2 );
57QgsMeshCalcNode::~QgsMeshCalcNode() =
default;
59QgsMeshCalcNode::Type QgsMeshCalcNode::type()
const
64void QgsMeshCalcNode::setLeft( QgsMeshCalcNode *left )
69void QgsMeshCalcNode::setRight( QgsMeshCalcNode *right )
71 mRight.reset( right );
74QStringList QgsMeshCalcNode::usedDatasetGroupNames()
const
78 if ( mType == tDatasetGroupRef )
80 res.append( mDatasetGroupName );
85 res += mLeft->usedDatasetGroupNames();
90 res += mRight->usedDatasetGroupNames();
95 res += mCondition->usedDatasetGroupNames();
101QStringList QgsMeshCalcNode::aggregatedUsedDatasetGroupNames()
const
107 case QgsMeshCalcNode::opPLUS:
108 case QgsMeshCalcNode::opMINUS:
109 case QgsMeshCalcNode::opMUL:
110 case QgsMeshCalcNode::opDIV:
111 case QgsMeshCalcNode::opPOW:
112 case QgsMeshCalcNode::opEQ:
113 case QgsMeshCalcNode::opNE:
114 case QgsMeshCalcNode::opGT:
115 case QgsMeshCalcNode::opLT:
116 case QgsMeshCalcNode::opGE:
117 case QgsMeshCalcNode::opLE:
118 case QgsMeshCalcNode::opAND:
119 case QgsMeshCalcNode::opOR:
120 case QgsMeshCalcNode::opNOT:
121 case QgsMeshCalcNode::opIF:
122 case QgsMeshCalcNode::opSIGN:
123 case QgsMeshCalcNode::opMIN:
124 case QgsMeshCalcNode::opMAX:
125 case QgsMeshCalcNode::opABS:
126 case QgsMeshCalcNode::opNONE:
129 res += mLeft->aggregatedUsedDatasetGroupNames();
134 res += mRight->aggregatedUsedDatasetGroupNames();
139 res += mCondition->aggregatedUsedDatasetGroupNames();
142 case QgsMeshCalcNode::opSUM_AGGR:
143 case QgsMeshCalcNode::opMAX_AGGR:
144 case QgsMeshCalcNode::opMIN_AGGR:
145 case QgsMeshCalcNode::opAVG_AGGR:
148 res += mLeft->usedDatasetGroupNames();
153 res += mRight->usedDatasetGroupNames();
158 res += mCondition->usedDatasetGroupNames();
166QStringList QgsMeshCalcNode::notAggregatedUsedDatasetGroupNames()
const
170 if ( mType == tDatasetGroupRef )
172 res.append( mDatasetGroupName );
177 case QgsMeshCalcNode::opPLUS:
178 case QgsMeshCalcNode::opMINUS:
179 case QgsMeshCalcNode::opMUL:
180 case QgsMeshCalcNode::opDIV:
181 case QgsMeshCalcNode::opPOW:
182 case QgsMeshCalcNode::opEQ:
183 case QgsMeshCalcNode::opNE:
184 case QgsMeshCalcNode::opGT:
185 case QgsMeshCalcNode::opLT:
186 case QgsMeshCalcNode::opGE:
187 case QgsMeshCalcNode::opLE:
188 case QgsMeshCalcNode::opAND:
189 case QgsMeshCalcNode::opOR:
190 case QgsMeshCalcNode::opNOT:
191 case QgsMeshCalcNode::opIF:
192 case QgsMeshCalcNode::opSIGN:
193 case QgsMeshCalcNode::opMIN:
194 case QgsMeshCalcNode::opMAX:
195 case QgsMeshCalcNode::opABS:
198 res += mLeft->notAggregatedUsedDatasetGroupNames();
203 res += mRight->notAggregatedUsedDatasetGroupNames();
208 res += mCondition->notAggregatedUsedDatasetGroupNames();
211 case QgsMeshCalcNode::opSUM_AGGR:
212 case QgsMeshCalcNode::opMAX_AGGR:
213 case QgsMeshCalcNode::opMIN_AGGR:
214 case QgsMeshCalcNode::opAVG_AGGR:
215 case QgsMeshCalcNode::opNONE:
224 if ( mType == tDatasetGroupRef )
226 dsu.copy( result, mDatasetGroupName, isAggregate );
229 else if ( mType == tOperator )
234 bool currentOperatorIsAggregate = mOperator == opSUM_AGGR || mOperator == opMAX_AGGR || mOperator == opMIN_AGGR || mOperator == opAVG_AGGR;
236 if ( !mLeft || !mLeft->calculate( dsu, leftDatasetGroup, isAggregate || currentOperatorIsAggregate ) )
240 if ( mRight && !mRight->calculate( dsu, rightDatasetGroup, isAggregate || currentOperatorIsAggregate ) )
250 if ( !mCondition->calculate( dsu, condition ) )
255 dsu.addIf( leftDatasetGroup, rightDatasetGroup, condition );
259 dsu.add( leftDatasetGroup, rightDatasetGroup );
262 dsu.subtract( leftDatasetGroup, rightDatasetGroup );
265 dsu.multiply( leftDatasetGroup, rightDatasetGroup );
268 dsu.divide( leftDatasetGroup, rightDatasetGroup );
271 dsu.power( leftDatasetGroup, rightDatasetGroup );
274 dsu.equal( leftDatasetGroup, rightDatasetGroup );
277 dsu.notEqual( leftDatasetGroup, rightDatasetGroup );
280 dsu.greaterThan( leftDatasetGroup, rightDatasetGroup );
283 dsu.lesserThan( leftDatasetGroup, rightDatasetGroup );
286 dsu.greaterEqual( leftDatasetGroup, rightDatasetGroup );
289 dsu.lesserEqual( leftDatasetGroup, rightDatasetGroup );
292 dsu.logicalAnd( leftDatasetGroup, rightDatasetGroup );
295 dsu.logicalOr( leftDatasetGroup, rightDatasetGroup );
298 dsu.logicalNot( leftDatasetGroup );
301 dsu.minimum( leftDatasetGroup, rightDatasetGroup );
304 dsu.maximum( leftDatasetGroup, rightDatasetGroup );
307 dsu.abs( leftDatasetGroup );
310 dsu.sumAggregated( leftDatasetGroup );
313 dsu.minimumAggregated( leftDatasetGroup );
316 dsu.maximumAggregated( leftDatasetGroup );
319 dsu.averageAggregated( leftDatasetGroup );
322 dsu.changeSign( leftDatasetGroup );
327 dsu.transferDatasets( result, leftDatasetGroup );
330 else if ( mType == tNumber )
332 dsu.number( result, mNumber );
335 else if ( mType == tNoData )
337 dsu.nodata( result );
345QgsMeshCalcNode *QgsMeshCalcNode::parseMeshCalcString(
const QString &str, QString &parserErrorMsg )
347 extern QgsMeshCalcNode *localParseMeshCalcString(
const QString &str, QString &parserErrorMsg );
348 return localParseMeshCalcString( str, parserErrorMsg );
351bool QgsMeshCalcNode::isNonTemporal()
const
353 if ( mType == tNoData || mType == tNumber )
356 if ( mType == tDatasetGroupRef )
361 case QgsMeshCalcNode::opIF:
362 return ( mLeft && mLeft->isNonTemporal() ) && ( mRight && mRight->isNonTemporal() && mCondition->isNonTemporal() );
364 case QgsMeshCalcNode::opPLUS:
365 case QgsMeshCalcNode::opMINUS:
366 case QgsMeshCalcNode::opMUL:
367 case QgsMeshCalcNode::opDIV:
368 case QgsMeshCalcNode::opPOW:
369 case QgsMeshCalcNode::opEQ:
370 case QgsMeshCalcNode::opNE:
371 case QgsMeshCalcNode::opGT:
372 case QgsMeshCalcNode::opLT:
373 case QgsMeshCalcNode::opGE:
374 case QgsMeshCalcNode::opLE:
375 case QgsMeshCalcNode::opAND:
376 case QgsMeshCalcNode::opOR:
377 case QgsMeshCalcNode::opNOT:
378 case QgsMeshCalcNode::opSIGN:
379 case QgsMeshCalcNode::opMIN:
380 case QgsMeshCalcNode::opMAX:
381 case QgsMeshCalcNode::opABS:
382 return ( mLeft && mLeft->isNonTemporal() ) && ( mRight && mRight->isNonTemporal() );
384 case QgsMeshCalcNode::opSUM_AGGR:
385 case QgsMeshCalcNode::opMAX_AGGR:
386 case QgsMeshCalcNode::opMIN_AGGR:
387 case QgsMeshCalcNode::opAVG_AGGR:
388 case QgsMeshCalcNode::opNONE:
Represents a mesh dataset group stored in memory.