[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [labplot/gsoc2018_mqtt] src: Better algorithm for checking if a topic contains another one
From:       Ferencz Kovacs <null () kde ! org>
Date:       2018-06-30 17:45:04
Message-ID: E1fZJvk-0000Xs-SY () code ! kde ! org
[Download RAW message or body]

Git commit caaae64a228f53126b922f9ca182be1cb3314f34 by Ferencz Kovacs.
Committed on 30/06/2018 at 17:44.
Pushed by ferenczkovacs into branch 'gsoc2018_mqtt'.

Better algorithm for checking if a topic contains another one

M  +30   -22   src/backend/datasources/MQTTClient.cpp
M  +2    -0    src/backend/datasources/MQTTClient.h
M  +19   -16   src/kdefrontend/datasources/ImportFileWidget.cpp
M  +28   -16   src/kdefrontend/dockwidgets/LiveDataDock.cpp
M  +1    -0    src/kdefrontend/dockwidgets/LiveDataDock.h

https://commits.kde.org/labplot/caaae64a228f53126b922f9ca182be1cb3314f34

diff --git a/src/backend/datasources/MQTTClient.cpp b/src/backend/datasources/MQTTClient.cpp
index 7dbc2e9a..3d373df3 100644
--- a/src/backend/datasources/MQTTClient.cpp
+++ b/src/backend/datasources/MQTTClient.cpp
@@ -900,28 +900,11 @@ void MQTTClient::newMQTTSubscription(const QString& topic, quint8 QoS) {
 		qDebug()<<"Check for inferior subscriptions";
 		bool found = false;
 		QVector<MQTTSubscriptions*> inferiorSubscriptions;
-		if(topic.contains('#') || topic.contains('+')) {
-			if(topic.contains('#')) {
-				for(int i = 0; i < m_mqttSubscriptions.size(); ++i) {
-					if(m_mqttSubscriptions[i]->subscriptionName().startsWith(topic.left(topic.count() - 2))
-							&& m_mqttSubscriptions[i]->subscriptionName() != topic){
-						found = true;
-						inferiorSubscriptions.push_back(m_mqttSubscriptions[i]);
-					}
-				}
-			}
-			else if (topic.contains('+')) {
-				int pos = topic.indexOf('+');
-				QString start = topic.left(pos);
-				QString end = topic.right(topic.count() - pos);
-				for(int i = 0; i < m_mqttSubscriptions.size(); ++i) {
-					if(m_mqttSubscriptions[i]->subscriptionName().startsWith(start)
-							&& m_mqttSubscriptions[i]->subscriptionName().endsWith(end)
-							&& m_mqttSubscriptions[i]->subscriptionName() != topic) {
-						found = true;
-						inferiorSubscriptions.push_back(m_mqttSubscriptions[i]);
-					}
-				}
+
+		for(int i = 0; i < m_mqttSubscriptions.size(); ++i) {
+			if(checkTopicContains(topic, m_mqttSubscriptions[i]->subscriptionName())) {
+				found = true;
+				inferiorSubscriptions.push_back(m_mqttSubscriptions[i]);
 			}
 		}
 
@@ -1001,4 +984,29 @@ void MQTTClient::subscriptionLoaded(const QString &name) {
 		}
 	}
 }
+
+bool MQTTClient::checkTopicContains(const QString &superior, const QString& inferior) {
+	if (superior == inferior)
+		return true;
+	else {
+		if(superior.contains("/")) {
+			QStringList superiorList = superior.split('/', QString::SkipEmptyParts);
+			QStringList inferiorList = inferior.split('/', QString::SkipEmptyParts);
+
+			bool ok = true;
+			for(int i = 0; i < superiorList.size(); ++i) {
+				if(superiorList.at(i) != inferiorList.at(i)) {
+					if((superiorList.at(i) != "+") &&
+							!(superiorList.at(i) == "#" && i == superiorList.size() - 1)) {
+						qDebug() <<superiorList.at(i)<<"  "<<inferiorList.at(i);
+						ok = false;
+						break;
+					}
+				}
+			}
+			return ok;
+		}
+		return false;
+	}
+}
 #endif
diff --git a/src/backend/datasources/MQTTClient.h b/src/backend/datasources/MQTTClient.h
index 537ef849..8ddbec7b 100644
--- a/src/backend/datasources/MQTTClient.h
+++ b/src/backend/datasources/MQTTClient.h
@@ -103,6 +103,8 @@ public:
 	void addMqttSubscriptions(const QMqttTopicFilter&, const quint8&);
 	QVector<QString> mqttSubscribtions() const;
 
+	bool checkTopicContains(const QString& superior, const QString& inferior);
+
 	QString clientHostName() const;
 	quint16 clientPort() const;
 	QString clientPassword() const;
diff --git a/src/kdefrontend/datasources/ImportFileWidget.cpp b/src/kdefrontend/datasources/ImportFileWidget.cpp
index 11896c43..4fafcb53 100644
--- a/src/kdefrontend/datasources/ImportFileWidget.cpp
+++ b/src/kdefrontend/datasources/ImportFileWidget.cpp
@@ -2081,26 +2081,29 @@ void ImportFileWidget::mqttErrorChanged(QMqttClient::ClientError clientError) {
 }
 
 bool ImportFileWidget::checkTopicContains(const QString& superior, const QString& inferior) {
-	if(superior == inferior)
+	if (superior == inferior)
 		return true;
-
-	if(superior.contains('#') || superior.contains('+')) {
-		if(superior.contains('#')) {
-			if(inferior.startsWith(superior.left(superior.count() - 2)) ){
-				return true;
-			}
-		}
-		else if (superior.contains('+')) {
-			int pos = superior.indexOf('+');
-			QString start = superior.left(pos);
-			QString end = superior.right(superior.count() - pos);
-			if(inferior.startsWith(start) && inferior.endsWith(end)) {
-				return true;
+	else {
+		if(superior.contains("/")) {
+			QStringList superiorList = superior.split('/', QString::SkipEmptyParts);
+			QStringList inferiorList = inferior.split('/', QString::SkipEmptyParts);
+
+			bool ok = true;
+			for(int i = 0; i < superiorList.size(); ++i) {
+				if(superiorList.at(i) != inferiorList.at(i)) {
+					if((superiorList.at(i) != "+") &&
+							!(superiorList.at(i) == "#" && i == superiorList.size() - 1)) {
+						qDebug() <<superiorList.at(i)<<"  "<<inferiorList.at(i);
+						ok = false;
+						break;
+					}
+				}
 			}
+			return ok;
 		}
-	}
 
-	return false;
+		return false;
+	}
 }
 
 QString ImportFileWidget::checkCommonLevel(const QString& first, const QString& second) {
diff --git a/src/kdefrontend/dockwidgets/LiveDataDock.cpp b/src/kdefrontend/dockwidgets/LiveDataDock.cpp
index d7e01431..e2563be5 100644
--- a/src/kdefrontend/dockwidgets/LiveDataDock.cpp
+++ b/src/kdefrontend/dockwidgets/LiveDataDock.cpp
@@ -773,22 +773,9 @@ void LiveDataDock::addSubscription() {
 				for(int i = 0; i < ui.lwSubscriptions->count(); ++i){
 					item = ui.lwSubscriptions->item(i);
 					QString subscriptionName = item->text();
-					if(subscriptionName.contains('#') || subscriptionName.contains('+')) {
-						if(subscriptionName.contains('#')) {
-							if(newTopicName.startsWith(subscriptionName.left(subscriptionName.count() - 2)) ){
-								noWildcard = false;
-								break;
-							}
-						}
-						else if (subscriptionName.contains('+')) {
-							int pos = subscriptionName.indexOf('+');
-							QString start = subscriptionName.left(pos);
-							QString end = subscriptionName.right(subscriptionName.count() - pos);
-							if(newTopicName.startsWith(start) && newTopicName.endsWith(end)) {
-								noWildcard = false;
-								break;
-							}
-						}
+					if(checkTopicContains(subscriptionName, newTopicName)) {
+						noWildcard = false;
+						break;
 					}
 				}
 				if(noWildcard) {
@@ -861,4 +848,29 @@ void LiveDataDock::mqttButtonUnsubscribe(const QString& item) {
 	m_mqttUnsubscribeName = item;
 	qDebug()<<"LiveDataDock: Unsubscribe from:"<<m_mqttUnsubscribeName;
 }
+
+bool LiveDataDock::checkTopicContains(const QString &superior, const QString &inferior) {
+	if (superior == inferior)
+		return true;
+	else {
+		if(superior.contains("/")) {
+			QStringList superiorList = superior.split('/', QString::SkipEmptyParts);
+			QStringList inferiorList = inferior.split('/', QString::SkipEmptyParts);
+
+			bool ok = true;
+			for(int i = 0; i < superiorList.size(); ++i) {
+				if(superiorList.at(i) != inferiorList.at(i)) {
+					if((superiorList.at(i) != "+") &&
+							!(superiorList.at(i) == "#" && i == superiorList.size() - 1)) {
+						qDebug() <<superiorList.at(i)<<"  "<<inferiorList.at(i);
+						ok = false;
+						break;
+					}
+				}
+			}
+			return ok;
+		}
+		return false;
+	}
+}
 #endif
diff --git a/src/kdefrontend/dockwidgets/LiveDataDock.h b/src/kdefrontend/dockwidgets/LiveDataDock.h
index 24603c0d..92ead52f 100644
--- a/src/kdefrontend/dockwidgets/LiveDataDock.h
+++ b/src/kdefrontend/dockwidgets/LiveDataDock.h
@@ -50,6 +50,7 @@ public:
 	void setLiveDataSources(const QList<LiveDataSource*>& sources);
 #ifdef HAVE_MQTT
 	void setMQTTClients(const QList<MQTTClient*>& clients);
+	bool checkTopicContains(const QString& superior, const QString& inferior);
 #endif
 	~LiveDataDock();
 
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic