Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Address review
  • Loading branch information
nirvn committed Dec 15, 2020
1 parent ebc2695 commit a057e56
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 16 deletions.
Expand Up @@ -73,18 +73,22 @@ Sets a specific API ``endpoint`` to use for requests. This is for internal testi
.. seealso:: :py:func:`endpoint`
%End

int requestsPerSecond() const;
double requestsPerSecond() const;
%Docstring
Returns the number of requests per seconds to the endpoint.

.. seealso:: :py:func:`setRequestsPerSecond`
%End

void setRequestsPerSecond( int number );
void setRequestsPerSecond( double number );
%Docstring
Sets the ``number`` of request per seconds to the endpoint.

.. seealso:: :py:func:`requestsPerSecond`

.. warning::

Setting this to a value > 1 violates the nomatim terms of service. Only change this value if you are using a self-hosted nomatim service.
%End

QString countryCodes() const;
Expand Down
16 changes: 7 additions & 9 deletions src/core/geocoding/qgsnominatimgeocoder.cpp
Expand Up @@ -18,17 +18,17 @@
#include "qgsgeocodercontext.h"
#include "qgslogger.h"
#include "qgsnetworkaccessmanager.h"
#include "qgsreadwritelocker.h"
#include <QDateTime>
#include <QUrl>
#include <QUrlQuery>
#include <QMutex>
#include <QNetworkRequest>
#include <QJsonDocument>
#include <QJsonArray>

QReadWriteLock QgsNominatimGeocoder::sMutex;
QMutex QgsNominatimGeocoder::sMutex;
QMap< QUrl, QList< QgsGeocoderResult > > QgsNominatimGeocoder::sCachedResults;
qint64 QgsNominatimGeocoder::sLastRequestTimstamp = 0;
qint64 QgsNominatimGeocoder::sLastRequestTimestamp = 0;

QgsNominatimGeocoder::QgsNominatimGeocoder( const QString &countryCodes, const QString &endpoint )
: QgsGeocoderInterface()
Expand Down Expand Up @@ -88,29 +88,28 @@ QList<QgsGeocoderResult> QgsNominatimGeocoder::geocodeString( const QString &str

const QUrl url = requestUrl( string, bounds );

QgsReadWriteLocker locker( sMutex, QgsReadWriteLocker::Read );
QMutexLocker locker( &sMutex );
auto it = sCachedResults.constFind( url );
if ( it != sCachedResults.constEnd() )
{
return *it;
}

while ( QDateTime::currentMSecsSinceEpoch() - sLastRequestTimstamp < 1000 / mRequestsPerSecond )
while ( QDateTime::currentMSecsSinceEpoch() - sLastRequestTimestamp < 1000 / mRequestsPerSecond )
{
QThread::msleep( 50 );
if ( feedback && feedback->isCanceled() )
return QList<QgsGeocoderResult>();
}
locker.changeMode( QgsReadWriteLocker::Write );
sLastRequestTimstamp = QDateTime::currentMSecsSinceEpoch();
locker.unlock();

QNetworkRequest request( url );
QgsSetRequestInitiatorClass( request, QStringLiteral( "QgsNominatimGeocoder" ) );

QgsBlockingNetworkRequest newReq;
const QgsBlockingNetworkRequest::ErrorCode errorCode = newReq.get( request, false, feedback );

sLastRequestTimestamp = QDateTime::currentMSecsSinceEpoch();

if ( errorCode != QgsBlockingNetworkRequest::NoError )
{
return QList<QgsGeocoderResult>() << QgsGeocoderResult::errorResult( newReq.errorMessage() );
Expand All @@ -124,7 +123,6 @@ QList<QgsGeocoderResult> QgsNominatimGeocoder::geocodeString( const QString &str
return QList<QgsGeocoderResult>() << QgsGeocoderResult::errorResult( err.errorString() );
}

locker.changeMode( QgsReadWriteLocker::Write );
const QVariantList results = doc.array().toVariantList();
if ( results.isEmpty() )
{
Expand Down
11 changes: 6 additions & 5 deletions src/core/geocoding/qgsnominatimgeocoder.h
Expand Up @@ -82,14 +82,15 @@ class CORE_EXPORT QgsNominatimGeocoder : public QgsGeocoderInterface
*
* \see setRequestsPerSecond()
*/
int requestsPerSecond() const { return mRequestsPerSecond; }
double requestsPerSecond() const { return mRequestsPerSecond; }

/**
* Sets the \a number of request per seconds to the endpoint.
*
* \see requestsPerSecond()
* \warning Setting this to a value > 1 violates the nomatim terms of service. Only change this value if you are using a self-hosted nomatim service.
*/
void setRequestsPerSecond( int number ) { mRequestsPerSecond = number; }
void setRequestsPerSecond( double number ) { mRequestsPerSecond = number; }

/**
* Returns the optional region bias which will be used to prioritize results in a certain region.
Expand All @@ -112,12 +113,12 @@ class CORE_EXPORT QgsNominatimGeocoder : public QgsGeocoderInterface

QString mCountryCodes;
QString mEndpoint;
int mRequestsPerSecond = 1;
double mRequestsPerSecond = 1;

static QReadWriteLock sMutex;
static QMutex sMutex;
static QMap< QUrl, QList< QgsGeocoderResult > > sCachedResults;

static qint64 sLastRequestTimstamp;
static qint64 sLastRequestTimestamp;

};

Expand Down

0 comments on commit a057e56

Please sign in to comment.