1 /*
2     SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
3 
4     SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #ifndef OSM_OVERPASSQUERY_H
8 #define OSM_OVERPASSQUERY_H
9 
10 #include "kosm_export.h"
11 
12 #include "datatypes.h"
13 
14 #include <QObject>
15 #include <QRectF>
16 
17 class QNetworkReply;
18 
19 namespace OSM {
20 
21 /** An Overpass QL query job, to be executed by OverpassQueryManager.
22  *  @note Use this wrongly can cause excessive load on Overpass servers,
23  *  so only use this when you know what you are doing!
24  */
25 class KOSM_EXPORT OverpassQuery : public QObject
26 {
27     Q_OBJECT
28 public:
29     explicit OverpassQuery(QObject *parent = nullptr);
30     ~OverpassQuery();
31 
32     /** Returns the raw (without bbox replacement) query string. */
33     QString query() const;
34     /** Returns the query with @p bbox applied. */
35     QString query(const QRectF &bbox) const;
36     /** Overpass QL query string.
37      *  Can contain the '{{bbox}}' bounding box placeholder also supported by Overpass Turbo.
38      */
39     void setQuery(const QString &query);
40 
41     /** Bounding box for this query, values in degree. */
42     QRectF boundingBox() const;
43     /** Set the bounding box for this query, values in degree. */
44     void setBoundingBox(const QRectF &bbox);
45 
46     /** Tile size in which the bounding box is broken down for querying.
47      *  Values in degree.
48      */
49     QSizeF tileSize() const;
50     /** Sets the tile size in which the bounding box is broken down for querying.
51      *  Values in degree.
52      */
53     void setTileSize(const QSizeF &tileSize);
54     /** Minimum tile size to which tiles can be broken down in case of query timeouts. */
55     QSizeF minimumTileSize() const;
56     /** Sets the minimum tile size.
57      *  Should be smaller than tile size by a power of 2.
58      */
59     void setMinimumTileSize(const QSizeF &minTileSize);
60 
61     /** Error codes. */
62     enum Error {
63         NoError,
64         QueryError, ///< generic query error
65         QueryTimeout, ///< query exceeded its execution time budget
66         NetworkError,
67     };
68     /** Error code of this query job. */
69     Error error() const;
70 
71     /** Query result data set. */
72     const DataSet& result() const;
73     DataSet&& takeResult();
74 
75 Q_SIGNALS:
76     void finished();
77 
78 private:
79     friend class OverpassQueryManager;
80     friend class OverpassQueryManagerPrivate;
81 
82     Error processReply(QNetworkReply *reply);
83 
84     QString m_query;
85     QRectF m_bbox = { -180.0, -90.0, 360.0, 180.0 };
86     QSizeF m_tileSize = { 360.0, 180.0 };
87     QSizeF m_minimumTileSize = { 1.0, 1.0 };
88     Error m_error = NoError;
89     OSM::DataSet m_result;
90 };
91 
92 }
93 
94 #endif // OSM_OVERPASSQUERY_H
95