QGIS API Documentation 3.39.0-Master (67e056379ed)
Loading...
Searching...
No Matches
qgsnativealgorithms.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsnativealgorithms.cpp
3 ---------------------
4 begin : April 2017
5 copyright : (C) 2017 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18#include "qgsnativealgorithms.h"
19#include "qgsruntimeprofiler.h"
31#include "qgsalgorithmaspect.h"
39#include "qgsalgorithmbuffer.h"
45#include "qgsalgorithmclip.h"
65#include "qgsalgorithmdrape.h"
75#include "qgsalgorithmexplode.h"
95#include "qgsalgorithmfilter.h"
100#include "qgsalgorithmforcerhr.h"
104#if QT_CONFIG(process)
106#endif
107#include "qgsalgorithmgrid.h"
141#include "qgsalgorithmpackage.h"
184#include "qgsalgorithmrotate.h"
189#include "qgsalgorithmsavelog.h"
203#include "qgsalgorithmsimplify.h"
205#include "qgsalgorithmslope.h"
206#include "qgsalgorithmsmooth.h"
219#include "qgsalgorithmswapxy.h"
223#include "qgsalgorithmtransect.h"
227#include "qgsalgorithmunion.h"
234#include "qgsalgorithmxyztiles.h"
241#include "qgsstylealgorithms.h"
242
244
246 : QgsProcessingProvider( parent )
247{}
248
249QIcon QgsNativeAlgorithms::icon() const
250{
251 return QgsApplication::getThemeIcon( QStringLiteral( "/providerQgis.svg" ) );
252}
253
255{
256 return QgsApplication::iconPath( QStringLiteral( "providerQgis.svg" ) );
257}
258
259QString QgsNativeAlgorithms::id() const
260{
261 return QStringLiteral( "native" );
262}
263
264QString QgsNativeAlgorithms::helpId() const
265{
266 return QStringLiteral( "qgis" );
267}
268
269QString QgsNativeAlgorithms::name() const
270{
271 return tr( "QGIS (native c++)" );
272}
273
275{
276 return true;
277}
278
280{
282}
283
285{
286 const QgsScopedRuntimeProfile profile( QObject::tr( "QGIS native provider" ) );
287 addAlgorithm( new QgsAddIncrementalFieldAlgorithm() );
288 addAlgorithm( new QgsAddTableFieldAlgorithm() );
289 addAlgorithm( new QgsAddXYFieldsAlgorithm() );
290 addAlgorithm( new QgsAddUniqueValueIndexAlgorithm() );
291 addAlgorithm( new QgsAffineTransformationAlgorithm() );
292 addAlgorithm( new QgsAggregateAlgorithm() );
293 addAlgorithm( new QgsAlignRastersAlgorithm() );
294 addAlgorithm( new QgsAlignSingleRasterAlgorithm() );
295 addAlgorithm( new QgsAngleToNearestAlgorithm() );
296 addAlgorithm( new QgsApplyLayerStyleAlgorithm() );
297 addAlgorithm( new QgsArrayTranslatedFeaturesAlgorithm() );
298 addAlgorithm( new QgsAspectAlgorithm() );
299 addAlgorithm( new QgsAssignProjectionAlgorithm() );
300 addAlgorithm( new QgsAttributeIndexAlgorithm() );
301 addAlgorithm( new QgsB3DMToGltfAlgorithm() );
302 addAlgorithm( new QgsBasicStatisticsAlgorithm() );
303 addAlgorithm( new QgsBatchNominatimGeocodeAlgorithm() );
304 addAlgorithm( new QgsBookmarksToLayerAlgorithm() );
305 addAlgorithm( new QgsBoundaryAlgorithm() );
306 addAlgorithm( new QgsBoundingBoxAlgorithm() );
307 addAlgorithm( new QgsBufferAlgorithm() );
308 addAlgorithm( new QgsCalculateExpressionAlgorithm() );
309 addAlgorithm( new QgsCalculateVectorOverlapsAlgorithm() );
310 addAlgorithm( new QgsCategorizeUsingStyleAlgorithm() );
311 addAlgorithm( new QgsCellStatisticsAlgorithm() );
312 addAlgorithm( new QgsCellStatisticsPercentileAlgorithm() );
313 addAlgorithm( new QgsCellStatisticsPercentRankFromRasterAlgorithm() );
314 addAlgorithm( new QgsCellStatisticsPercentRankFromValueAlgorithm() );
315 addAlgorithm( new QgsCentroidAlgorithm() );
316 addAlgorithm( new QgsClipAlgorithm() );
317 addAlgorithm( new QgsCollectAlgorithm() );
318 addAlgorithm( new QgsCombineStylesAlgorithm() );
319 addAlgorithm( new QgsConcaveHullAlgorithm() );
320 addAlgorithm( new QgsConditionalBranchAlgorithm() );
321 addAlgorithm( new QgsConstantRasterAlgorithm() );
322 addAlgorithm( new QgsConvertToCurvesAlgorithm() );
323 addAlgorithm( new QgsConvexHullAlgorithm() );
324 addAlgorithm( new QgsCoverageSimplifyAlgorithm() );
325 addAlgorithm( new QgsCoverageUnionAlgorithm() );
326 addAlgorithm( new QgsCoverageValidateAlgorithm() );
327 addAlgorithm( new QgsCreateDirectoryAlgorithm() );
328 addAlgorithm( new QgsDbscanClusteringAlgorithm() );
329 addAlgorithm( new QgsDelaunayTriangulationAlgorithm() );
330 addAlgorithm( new QgsDeleteDuplicateGeometriesAlgorithm() );
331 addAlgorithm( new QgsDetectVectorChangesAlgorithm() );
332 addAlgorithm( new QgsDifferenceAlgorithm() );
333 addAlgorithm( new QgsDissolveAlgorithm() );
334 addAlgorithm( new QgsDownloadVectorTilesAlgorithm() );
335 addAlgorithm( new QgsDrapeToMAlgorithm() );
336 addAlgorithm( new QgsDrapeToZAlgorithm() );
337 addAlgorithm( new QgsDropTableFieldsAlgorithm() );
338 addAlgorithm( new QgsDropGeometryAlgorithm() );
339 addAlgorithm( new QgsDropMZValuesAlgorithm() );
340 addAlgorithm( new QgsDxfExportAlgorithm() );
341 addAlgorithm( new QgsExecutePostgisQueryAlgorithm() );
342 addAlgorithm( new QgsExecuteRegisteredSpatialiteQueryAlgorithm() );
343 addAlgorithm( new QgsExecuteSpatialiteQueryAlgorithm() );
344 addAlgorithm( new QgsExplodeAlgorithm() );
345 addAlgorithm( new QgsExplodeHstoreAlgorithm() );
346 addAlgorithm( new QgsExportLayersInformationAlgorithm() );
347 addAlgorithm( new QgsExportMeshVerticesAlgorithm );
348 addAlgorithm( new QgsExportMeshFacesAlgorithm );
349 addAlgorithm( new QgsExportMeshEdgesAlgorithm );
350 addAlgorithm( new QgsExportMeshOnGridAlgorithm );
351 addAlgorithm( new QgsExportToPostgresqlAlgorithm );
352 addAlgorithm( new QgsExportToSpreadsheetAlgorithm() );
353 addAlgorithm( new QgsExtendLinesAlgorithm() );
354 addAlgorithm( new QgsExtentFromLayerAlgorithm() );
355 addAlgorithm( new QgsExtentToLayerAlgorithm() );
356 addAlgorithm( new QgsExtractBinaryFieldAlgorithm() );
357 addAlgorithm( new QgsExtractByAttributeAlgorithm() );
358 addAlgorithm( new QgsExtractByExpressionAlgorithm() );
359 addAlgorithm( new QgsExtractByExtentAlgorithm() );
360 addAlgorithm( new QgsExtractByLocationAlgorithm() );
361 addAlgorithm( new QgsExtractLabelsAlgorithm() );
362 addAlgorithm( new QgsExtractMValuesAlgorithm() );
363 addAlgorithm( new QgsExtractVerticesAlgorithm() );
364 addAlgorithm( new QgsExtractSpecificVerticesAlgorithm() );
365 addAlgorithm( new QgsExtractWithinDistanceAlgorithm() );
366 addAlgorithm( new QgsExtractZValuesAlgorithm() );
367 addAlgorithm( new QgsFieldCalculatorAlgorithm() );
368 addAlgorithm( new QgsFileDownloaderAlgorithm() );
369 addAlgorithm( new QgsFillNoDataAlgorithm() );
370 addAlgorithm( new QgsFilterAlgorithm() );
371 addAlgorithm( new QgsFilterByGeometryAlgorithm() );
372 addAlgorithm( new QgsFilterByLayerTypeAlgorithm() );
373 addAlgorithm( new QgsFilterVerticesByM() );
374 addAlgorithm( new QgsFilterVerticesByZ() );
375 addAlgorithm( new QgsFixGeometriesAlgorithm() );
376 addAlgorithm( new QgsFlattenRelationshipsAlgorithm() );
377 addAlgorithm( new QgsForceRHRAlgorithm() );
378 addAlgorithm( new QgsFuzzifyRasterLinearMembershipAlgorithm() );
379 addAlgorithm( new QgsFuzzifyRasterPowerMembershipAlgorithm() );
380 addAlgorithm( new QgsFuzzifyRasterLargeMembershipAlgorithm() );
381 addAlgorithm( new QgsFuzzifyRasterSmallMembershipAlgorithm() );
382 addAlgorithm( new QgsFuzzifyRasterGaussianMembershipAlgorithm() );
383 addAlgorithm( new QgsFuzzifyRasterNearMembershipAlgorithm() );
384 addAlgorithm( new QgsGeometryByExpressionAlgorithm() );
385 addAlgorithm( new QgsGltfToVectorFeaturesAlgorithm() );
386#if QT_CONFIG(process)
387 addAlgorithm( new QgsConvertGpxFeatureTypeAlgorithm() );
388 addAlgorithm( new QgsConvertGpsDataAlgorithm() );
389 addAlgorithm( new QgsDownloadGpsDataAlgorithm() );
390 addAlgorithm( new QgsUploadGpsDataAlgorithm() );
391#endif
392 addAlgorithm( new QgsGridAlgorithm() );
393 addAlgorithm( new QgsHillshadeAlgorithm() );
394 addAlgorithm( new QgsImportPhotosAlgorithm() );
395 addAlgorithm( new QgsInterpolatePointAlgorithm() );
396 addAlgorithm( new QgsIntersectionAlgorithm() );
397 addAlgorithm( new QgsJoinByAttributeAlgorithm() );
398 addAlgorithm( new QgsJoinByLocationAlgorithm() );
399 addAlgorithm( new QgsJoinByLocationSummaryAlgorithm() );
400 addAlgorithm( new QgsJoinByNearestAlgorithm() );
401 addAlgorithm( new QgsJoinWithLinesAlgorithm() );
402 addAlgorithm( new QgsKeepNBiggestPartsAlgorithm() );
403 addAlgorithm( new QgsKMeansClusteringAlgorithm() );
404 addAlgorithm( new QgsLayerToBookmarksAlgorithm() );
405 addAlgorithm( new QgsLayoutMapExtentToLayerAlgorithm() );
406 addAlgorithm( new QgsLayoutAtlasToImageAlgorithm() );
407 addAlgorithm( new QgsLayoutAtlasToPdfAlgorithm() );
408 addAlgorithm( new QgsLayoutAtlasToMultiplePdfAlgorithm() );
409 addAlgorithm( new QgsLayoutToImageAlgorithm() );
410 addAlgorithm( new QgsLayoutToPdfAlgorithm() );
411 addAlgorithm( new QgsLineDensityAlgorithm() );
412 addAlgorithm( new QgsLineIntersectionAlgorithm() );
413 addAlgorithm( new QgsLineSubstringAlgorithm() );
414 addAlgorithm( new QgsLoadLayerAlgorithm() );
415 addAlgorithm( new QgsMeanCoordinatesAlgorithm() );
416 addAlgorithm( new QgsMergeLinesAlgorithm() );
417 addAlgorithm( new QgsMergeVectorAlgorithm() );
418 addAlgorithm( new QgsMeshRasterizeAlgorithm );
419 addAlgorithm( new QgsMeshContoursAlgorithm );
420 addAlgorithm( new QgsMeshExportCrossSection );
421 addAlgorithm( new QgsMeshExportTimeSeries );
422 addAlgorithm( new QgsMinimumEnclosingCircleAlgorithm() );
423 addAlgorithm( new QgsMultiDifferenceAlgorithm() );
424 addAlgorithm( new QgsMultiIntersectionAlgorithm() );
425 addAlgorithm( new QgsMultipartToSinglepartAlgorithm() );
426 addAlgorithm( new QgsMultiRingConstantBufferAlgorithm() );
427 addAlgorithm( new QgsMultiUnionAlgorithm() );
428 addAlgorithm( new QgsNearestNeighbourAnalysisAlgorithm() );
429 addAlgorithm( new QgsOffsetLinesAlgorithm() );
430 addAlgorithm( new QgsOrderByExpressionAlgorithm() );
431 addAlgorithm( new QgsOrientedMinimumBoundingBoxAlgorithm() );
432 addAlgorithm( new QgsOrthogonalizeAlgorithm() );
433 addAlgorithm( new QgsPackageAlgorithm() );
434 addAlgorithm( new QgsPixelCentroidsFromPolygonsAlgorithm() );
435 addAlgorithm( new QgsCreateArrayOffsetLinesAlgorithm() );
436 addAlgorithm( new QgsPointsInPolygonAlgorithm() );
437 addAlgorithm( new QgsPointOnSurfaceAlgorithm() );
438 addAlgorithm( new QgsPointToLayerAlgorithm() );
439 addAlgorithm( new QgsPointsAlongGeometryAlgorithm() );
440 addAlgorithm( new QgsPointsLayerFromTableAlgorithm() );
441 addAlgorithm( new QgsPointsToPathsAlgorithm() );
442 addAlgorithm( new QgsPoleOfInaccessibilityAlgorithm() );
443 addAlgorithm( new QgsPolygonizeAlgorithm() );
444 addAlgorithm( new QgsProjectPointCartesianAlgorithm() );
445 addAlgorithm( new QgsPromoteToMultipartAlgorithm() );
446 addAlgorithm( new QgsRaiseExceptionAlgorithm() );
447 addAlgorithm( new QgsRaiseWarningAlgorithm() );
448 addAlgorithm( new QgsRaiseMessageAlgorithm() );
449 addAlgorithm( new QgsRandomBinomialRasterAlgorithm() );
450 addAlgorithm( new QgsRandomExponentialRasterAlgorithm() );
451 addAlgorithm( new QgsRandomExtractAlgorithm() );
452 addAlgorithm( new QgsRandomGammaRasterAlgorithm() );
453 addAlgorithm( new QgsRandomGeometricRasterAlgorithm() );
454 addAlgorithm( new QgsRandomNegativeBinomialRasterAlgorithm() );
455 addAlgorithm( new QgsRandomNormalRasterAlgorithm() );
456 addAlgorithm( new QgsRandomPointsExtentAlgorithm() );
457 addAlgorithm( new QgsRandomPointsInPolygonsAlgorithm() );
458 addAlgorithm( new QgsRandomPointsOnLinesAlgorithm() );
459 addAlgorithm( new QgsRandomPoissonRasterAlgorithm() );
460 addAlgorithm( new QgsRandomUniformRasterAlgorithm() );
461 addAlgorithm( new QgsRasterCalculatorAlgorithm() );
462 addAlgorithm( new QgsRasterCalculatorModelerAlgorithm() );
463 addAlgorithm( new QgsRasterDtmSlopeBasedFilterAlgorithm() );
464 addAlgorithm( new QgsRasterFrequencyByEqualOperatorAlgorithm() );
465 addAlgorithm( new QgsRasterFrequencyByGreaterThanOperatorAlgorithm() );
466 addAlgorithm( new QgsRasterFrequencyByLessThanOperatorAlgorithm() );
467 addAlgorithm( new QgsRasterLayerPropertiesAlgorithm() );
468 addAlgorithm( new QgsRasterLayerUniqueValuesReportAlgorithm() );
469 addAlgorithm( new QgsRasterLayerZonalStatsAlgorithm() );
470 addAlgorithm( new QgsRasterLogicalAndAlgorithm() );
471 addAlgorithm( new QgsRasterLogicalOrAlgorithm() );
472 addAlgorithm( new QgsRasterizeAlgorithm() );
473 addAlgorithm( new QgsRasterPixelsToPointsAlgorithm() );
474 addAlgorithm( new QgsRasterPixelsToPolygonsAlgorithm() );
475 addAlgorithm( new QgsRasterSamplingAlgorithm() );
476 addAlgorithm( new QgsRasterStackHighestPositionAlgorithm() );
477 addAlgorithm( new QgsRasterStackLowestPositionAlgorithm() );
478 addAlgorithm( new QgsRasterStatisticsAlgorithm() );
479 addAlgorithm( new QgsRasterSurfaceVolumeAlgorithm() );
480 addAlgorithm( new QgsAlgorithmRemoveDuplicateVertices() );
481 addAlgorithm( new QgsReclassifyByLayerAlgorithm() );
482 addAlgorithm( new QgsReclassifyByTableAlgorithm() );
483 addAlgorithm( new QgsRectanglesOvalsDiamondsAlgorithm() );
484 addAlgorithm( new QgsRefactorFieldsAlgorithm() );
485 addAlgorithm( new QgsRemoveDuplicatesByAttributeAlgorithm() );
486 addAlgorithm( new QgsRemoveHolesAlgorithm() );
487 addAlgorithm( new QgsRemoveNullGeometryAlgorithm() );
488 addAlgorithm( new QgsRenameLayerAlgorithm() );
489 addAlgorithm( new QgsRenameTableFieldAlgorithm() );
490 addAlgorithm( new QgsRepairShapefileAlgorithm() );
491 addAlgorithm( new QgsRescaleRasterAlgorithm() );
492 addAlgorithm( new QgsRetainTableFieldsAlgorithm() );
493 addAlgorithm( new QgsReverseLineDirectionAlgorithm() );
494 addAlgorithm( new QgsRotateFeaturesAlgorithm() );
495 addAlgorithm( new QgsRoundnessAlgorithm() );
496 addAlgorithm( new QgsRoundRasterValuesAlgorithm() );
497 addAlgorithm( new QgsRuggednessAlgorithm() );
498 addAlgorithm( new QgsSaveFeaturesAlgorithm() );
499 addAlgorithm( new QgsSaveLogToFileAlgorithm() );
500 addAlgorithm( new QgsSaveSelectedFeatures() );
501 addAlgorithm( new QgsSegmentizeByMaximumAngleAlgorithm() );
502 addAlgorithm( new QgsSegmentizeByMaximumDistanceAlgorithm() );
503 addAlgorithm( new QgsSelectByLocationAlgorithm() );
504 addAlgorithm( new QgsSelectWithinDistanceAlgorithm() );
505 addAlgorithm( new QgsServiceAreaFromLayerAlgorithm() );
506 addAlgorithm( new QgsServiceAreaFromPointAlgorithm() );
507 addAlgorithm( new QgsSetLayerEncodingAlgorithm() );
508 addAlgorithm( new QgsSetMValueAlgorithm() );
509 addAlgorithm( new QgsSetProjectVariableAlgorithm() );
510 addAlgorithm( new QgsSetZValueAlgorithm() );
511 addAlgorithm( new QgsShapefileEncodingInfoAlgorithm() );
512 addAlgorithm( new QgsShortestLineAlgorithm() );
513 addAlgorithm( new QgsShortestPathLayerToPointAlgorithm() );
514 addAlgorithm( new QgsShortestPathPointToLayerAlgorithm() );
515 addAlgorithm( new QgsShortestPathPointToPointAlgorithm() );
516 addAlgorithm( new QgsSimplifyAlgorithm() );
517 addAlgorithm( new QgsSingleSidedBufferAlgorithm() );
518 addAlgorithm( new QgsSlopeAlgorithm() );
519 addAlgorithm( new QgsSmoothAlgorithm() );
520 addAlgorithm( new QgsSnapGeometriesAlgorithm() );
521 addAlgorithm( new QgsSnapToGridAlgorithm() );
522 addAlgorithm( new QgsSpatialIndexAlgorithm() );
523 addAlgorithm( new QgsSplitFeaturesByAttributeCharacterAlgorithm() );
524 addAlgorithm( new QgsSplitGeometryAtAntimeridianAlgorithm() );
525 addAlgorithm( new QgsSplitLinesByLengthAlgorithm() );
526 addAlgorithm( new QgsSplitVectorLayerAlgorithm() );
527 addAlgorithm( new QgsSplitWithLinesAlgorithm() );
528 addAlgorithm( new QgsStDbscanClusteringAlgorithm() );
529 addAlgorithm( new QgsStringConcatenationAlgorithm() );
530 addAlgorithm( new QgsStyleFromProjectAlgorithm() );
531 addAlgorithm( new QgsSubdivideAlgorithm() );
532 addAlgorithm( new QgsSumLineLengthAlgorithm() );
533 addAlgorithm( new QgsSwapXYAlgorithm() );
534 addAlgorithm( new QgsSymmetricalDifferenceAlgorithm() );
535 addAlgorithm( new QgsTaperedBufferAlgorithm() );
536 addAlgorithm( new QgsTinMeshCreationAlgorithm() );
537 addAlgorithm( new QgsTransectAlgorithm() );
538 addAlgorithm( new QgsTransferAnnotationsFromMainAlgorithm() );
539 addAlgorithm( new QgsTransformAlgorithm() );
540 addAlgorithm( new QgsTranslateAlgorithm() );
541 addAlgorithm( new QgsTruncateTableAlgorithm() );
542 addAlgorithm( new QgsUnionAlgorithm() );
543 addAlgorithm( new QgsVariableWidthBufferByMAlgorithm() );
544 addAlgorithm( new QgsVirtualRasterCalculatorAlgorithm() );
545 addAlgorithm( new QgsVirtualRasterCalculatorModelerAlgorithm() );
546 addAlgorithm( new QgsVoronoiPolygonsAlgorithm() );
547 addAlgorithm( new QgsWedgeBuffersAlgorithm() );
548 addAlgorithm( new QgsWriteVectorTilesXyzAlgorithm() );
549 addAlgorithm( new QgsWriteVectorTilesMbtilesAlgorithm() );
550 addAlgorithm( new QgsXyzTilesDirectoryAlgorithm() );
551 addAlgorithm( new QgsXyzTilesMbtilesAlgorithm() );
552 addAlgorithm( new QgsZonalHistogramAlgorithm() );
553 addAlgorithm( new QgsZonalStatisticsAlgorithm() );
554 addAlgorithm( new QgsZonalStatisticsFeatureBasedAlgorithm() );
555 addAlgorithm( new QgsPolygonsToLinesAlgorithm() );
556 addAlgorithm( new QgsDensifyGeometriesByIntervalAlgorithm() );
557 addAlgorithm( new QgsDensifyGeometriesByCountAlgorithm() );
558}
559
@ CompatibleWithVirtualRaster
The processing provider's algorithms can work with QGIS virtualraster data provider....
QFlags< ProcessingProviderFlag > ProcessingProviderFlags
Flags indicating how and when an processing provider operates and should be exposed to users.
Definition qgis.h:3039
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QString iconPath(const QString &iconFile)
Returns path to the desired icon file.
void loadAlgorithms() override
Loads all algorithms belonging to this provider.
QString helpId() const override
Returns the provider help id string, used for creating QgsHelp urls for algorithms belong to this pro...
QString id() const override
Returns the unique provider id, used for identifying the provider.
bool supportsNonFileBasedOutput() const override
Returns true if the provider supports non-file based outputs (such as memory layers or direct databas...
QString svgIconPath() const override
Returns a path to an SVG version of the provider's icon.
QString name() const override
Returns the provider name, which is used to describe the provider within the GUI.
QIcon icon() const override
Returns an icon for the provider.
QgsNativeAlgorithms(QObject *parent=nullptr)
Constructor for QgsNativeAlgorithms.
Qgis::ProcessingProviderFlags flags() const override
Returns the flags indicating how and when the provider operates and should be exposed to users.
Abstract base class for processing providers.
bool addAlgorithm(QgsProcessingAlgorithm *algorithm)
Adds an algorithm to the provider.
Scoped object for logging of the runtime for a single operation or group of operations.