Added unit tests.
[situare] / src / situareservice / database.cpp
index 1d4d630..dd35a8c 100644 (file)
@@ -25,12 +25,19 @@ bool Database::addTag(qulonglong userId, const QString &tag)
 
     if (m_database.isOpen()) {
         QSqlQuery tagQuery;
-        ret = tagQuery.exec(QString("SELECT id FROM tag WHERE name = '%1'")
+        ret = tagQuery.exec(QString("SELECT id, count FROM tag WHERE name = '%1'")
                          .arg(tag));
 
         //Tag already exists
         if (ret && tagQuery.next()) {
+            qWarning() << tagQuery.value(1).toInt();
+            int count = tagQuery.value(1).toInt() + 1;
+            qWarning() << count;
+            QSqlQuery tagUpdateQuery;
+            tagUpdateQuery.exec(QString("UPDATE tag SET count = '%1' WHERE id = '%2'")
+                             .arg(count).arg(tagQuery.value(0).toString()));
             tagId = tagQuery.value(0).toULongLong();
+            qWarning() << tagUpdateQuery.lastQuery();
         }
         else {
             QSqlQuery tagInsertQuery;
@@ -66,9 +73,10 @@ bool Database::createNotificationTable()
                              "id INTEGER PRIMARY KEY,"
                              "senderid INTEGER,"
                              "receiverid INTEGER,"
-                             "read INTEGER,"
                              "timestamp VARCHAR(20),"
                              "text TEXT,"
+                             "latitude REAL,"
+                             "longitude REAL,"
                              "FOREIGN KEY(senderid) REFERENCES user(id),"
                              "FOREIGN KEY(receiverid) REFERENCES user(id)"
                              ")");
@@ -141,11 +149,16 @@ QByteArray Database::getInterestingPeopleByTag(qulonglong userId, const QString
 {
     qDebug() << __PRETTY_FUNCTION__;
 
+    //People start
+    QString result;
+    result.append("{\"people\": {");
+
     QHash<QString, QString> tags;
 
+    //Get tags
     QSqlQuery tagQuery(QString("SELECT DISTINCT usertag.userid, tag.name FROM usertag, tag WHERE "
-                               "usertag.tagid = tag.id AND usertag.userid != '%1' AND "
-                               "tag.name LIKE '%2'").arg(userId).arg(tag));
+                                   "usertag.tagid = tag.id AND usertag.userid != '%1' AND "
+                                   "tag.name LIKE '\%%2\%'").arg(userId).arg(tag));
 
     while (tagQuery.next()) {
         QString userId = tagQuery.value(0).toString();
@@ -166,25 +179,72 @@ QByteArray Database::getInterestingPeopleByTag(qulonglong userId, const QString
     while (i.hasNext())
         userIds.append(i.next().key());
 
-    QSqlQuery userQuery(QString("SELECT user.id, user.name, user.image_url FROM user WHERE "
-                                "user.id IN (") + userIds.join(", ") + QString(")"));
-    QString result;
-    result.append("{\"people\": [");
+    //Get friends
+    result.append("\"friends\": [");
+
+    QSqlQuery friendQuery(QString("SELECT user.id, user.name, user.image_url, user.latitude, "
+                                  "user.longitude FROM user WHERE "
+                                  "user.id IN (") + userIds.join(", ") + QString(") AND "
+                                  "user.id IN "
+                                  "(SELECT friend.uid2 FROM friend WHERE friend.uid1 = '%1' "
+                                  "UNION "
+                                  "SELECT friend.uid1 FROM friend WHERE friend.uid2 = '%1')")
+                .arg(userId));
 
-    while (userQuery.next()) {
+    bool friendRemoveLast = false;
+
+    while (friendQuery.next()) {
+        friendRemoveLast = true;
         result.append("{");
-        result.append("\"uid\": \"" + userQuery.value(0).toString() + "\",");
-        result.append("\"name\": \"" + userQuery.value(1).toString() + "\",");
-        result.append("\"image_url\": \"" + userQuery.value(2).toString() + "\",");
-        result.append("\"tags\": [" + tags.value(userQuery.value(0).toString()) + "]");
+        result.append("\"uid\": \"" + friendQuery.value(0).toString() + "\",");
+        result.append("\"name\": \"" + friendQuery.value(1).toString() + "\",");
+        result.append("\"image_url\": \"" + friendQuery.value(2).toString() + "\",");
+        result.append("\"latitude\": \"" + friendQuery.value(3).toString() + "\",");
+        result.append("\"longitude\": \"" + friendQuery.value(4).toString() + "\",");
+        result.append("\"tags\": [" + tags.value(friendQuery.value(0).toString()) + "]");
         result.append("},");
     }
 
-    int lastComma = result.lastIndexOf(",");
-    if (lastComma != -1)
-        result.remove(result.lastIndexOf(","), 1);
+    if (friendRemoveLast) {
+        int friendLastComma = result.lastIndexOf(",");
+        if (friendLastComma != -1)
+            result.remove(result.lastIndexOf(","), 1);
+    }
 
-    result.append("]}");
+    result.append("],");
+
+    //Get others
+    result.append("\"others\": [");
+
+    QSqlQuery otherQuery(QString("SELECT user.id, user.name, user.image_url FROM user WHERE "
+                                  "user.id IN (") + userIds.join(", ") + QString(") AND "
+                                  "user.id NOT IN "
+                                  "(SELECT friend.uid2 FROM friend WHERE friend.uid1 = '%1' "
+                                  "UNION "
+                                  "SELECT friend.uid1 FROM friend WHERE friend.uid2 = '%1')")
+                .arg(userId));
+
+    bool otherRemoveLast = false;
+
+    while (otherQuery.next()) {
+        otherRemoveLast = true;
+        result.append("{");
+        result.append("\"uid\": \"" + otherQuery.value(0).toString() + "\",");
+        result.append("\"name\": \"" + otherQuery.value(1).toString() + "\",");
+        result.append("\"image_url\": \"" + otherQuery.value(2).toString() + "\",");;
+        result.append("\"tags\": [" + tags.value(otherQuery.value(0).toString()) + "]");
+        result.append("},");
+    }
+
+    if (otherRemoveLast) {
+        int otherLastComma = result.lastIndexOf(",");
+        if (otherLastComma != -1)
+            result.remove(result.lastIndexOf(","), 1);
+    }
+
+    result.append("]");
+
+    result.append("}}");
 
     return result.toUtf8();
 }
@@ -198,11 +258,11 @@ QByteArray Database::getInterestingPeople(qulonglong userId,
 
     //People start
     QString result;
-    result.append("{\"people\": [");
+    result.append("{\"people\": {");
 
     QHash<QString, QString> tags;
 
-    //Get friends
+    //Get tags
     QSqlQuery tagQuery(QString("SELECT usertag.userid, tag.name FROM usertag, tag WHERE "
                                "usertag.tagid IN (SELECT usertag.tagid FROM usertag WHERE "
                                "usertag.userid = '%1') AND usertag.userid != '%2' "
@@ -227,28 +287,79 @@ QByteArray Database::getInterestingPeople(qulonglong userId,
     while (i.hasNext())
         userIds.append(i.next().key());
 
-    QSqlQuery userQuery(QString("SELECT user.id, user.name, user.image_url FROM user WHERE "
-                                "user.id IN (") + userIds.join(", ") + QString(") AND "
-                                "user.latitude >= '%1' AND user.latitude < '%2' AND "
-                                "user.longitude >= '%3' AND user.longitude < '%4'")
+    //Get friends
+    result.append("\"friends\": [");
+
+    QSqlQuery friendQuery(QString("SELECT user.id, user.name, user.image_url, user.latitude, "
+                                  "user.longitude FROM user WHERE "
+                                  "user.id IN (") + userIds.join(", ") + QString(") AND "
+                                  "user.latitude >= '%1' AND user.latitude < '%2' AND "
+                                  "user.longitude >= '%3' AND user.longitude < '%4' AND user.id IN "
+                                  "(SELECT friend.uid2 FROM friend WHERE friend.uid1 = '%5' "
+                                  "UNION "
+                                  "SELECT friend.uid1 FROM friend WHERE friend.uid2 = '%5')")
                 .arg(southWestCoordinates.latitude()).arg(northEastCoordinates.latitude())
-                .arg(southWestCoordinates.longitude()).arg(northEastCoordinates.longitude()));
+                .arg(southWestCoordinates.longitude()).arg(northEastCoordinates.longitude())
+                .arg(userId));
+
+    bool friendRemoveLast = false;
 
-    while (userQuery.next()) {
+    while (friendQuery.next()) {
+        friendRemoveLast = true;
         result.append("{");
-        result.append("\"uid\": \"" + userQuery.value(0).toString() + "\",");
-        result.append("\"name\": \"" + userQuery.value(1).toString() + "\",");
-        result.append("\"image_url\": \"" + userQuery.value(2).toString() + "\",");
-        result.append("\"tags\": [" + tags.value(userQuery.value(0).toString()) + "]");
+        result.append("\"uid\": \"" + friendQuery.value(0).toString() + "\",");
+        result.append("\"name\": \"" + friendQuery.value(1).toString() + "\",");
+        result.append("\"image_url\": \"" + friendQuery.value(2).toString() + "\",");
+        result.append("\"latitude\": \"" + friendQuery.value(3).toString() + "\",");
+        result.append("\"longitude\": \"" + friendQuery.value(4).toString() + "\",");
+        result.append("\"tags\": [" + tags.value(friendQuery.value(0).toString()) + "]");
         result.append("},");
     }
 
-    int lastComma = result.lastIndexOf(",");
-    if (lastComma != -1)
-        result.remove(result.lastIndexOf(","), 1);
+    if (friendRemoveLast) {
+        int friendLastComma = result.lastIndexOf(",");
+        if (friendLastComma != -1)
+            result.remove(result.lastIndexOf(","), 1);
+    }
 
-    //People end
-    result.append("]}");
+    result.append("],");
+
+    //Get others
+    result.append("\"others\": [");
+
+    QSqlQuery otherQuery(QString("SELECT user.id, user.name, user.image_url FROM user WHERE "
+                                  "user.id IN (") + userIds.join(", ") + QString(") AND "
+                                  "user.latitude >= '%1' AND user.latitude < '%2' AND "
+                                  "user.longitude >= '%3' AND user.longitude < '%4' AND user.id "
+                                  "NOT IN "
+                                  "(SELECT friend.uid2 FROM friend WHERE friend.uid1 = '%5' "
+                                  "UNION "
+                                  "SELECT friend.uid1 FROM friend WHERE friend.uid2 = '%5')")
+                .arg(southWestCoordinates.latitude()).arg(northEastCoordinates.latitude())
+                .arg(southWestCoordinates.longitude()).arg(northEastCoordinates.longitude())
+                .arg(userId));
+
+    bool otherRemoveLast = false;
+
+    while (otherQuery.next()) {
+        otherRemoveLast = true;
+        result.append("{");
+        result.append("\"uid\": \"" + otherQuery.value(0).toString() + "\",");
+        result.append("\"name\": \"" + otherQuery.value(1).toString() + "\",");
+        result.append("\"image_url\": \"" + otherQuery.value(2).toString() + "\",");;
+        result.append("\"tags\": [" + tags.value(otherQuery.value(0).toString()) + "]");
+        result.append("},");
+    }
+
+    if (otherRemoveLast) {
+        int otherLastComma = result.lastIndexOf(",");
+        if (otherLastComma != -1)
+            result.remove(result.lastIndexOf(","), 1);
+    }
+
+    result.append("]");
+
+    result.append("}}");
 
     return result.toUtf8();
 }
@@ -257,22 +368,103 @@ QByteArray Database::getNotifications(qulonglong userId)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    QSqlQuery query(QString("SELECT notification.id, notification.senderid, user.name, "
-                            "user.image_url, notification.timestamp, notification.text "
-                            "FROM notification, user WHERE notification.receiverid = '%1' "
-                            "AND notification.senderid = user.id").arg(userId));
+    QString result;
+    result.append("{\"messages\": {");
+
+    //Received
+    QSqlQuery receivedQuery(QString("SELECT notification.id, notification.senderid, "
+                            "notification.receiverid, user.name, user.image_url, "
+                            "notification.timestamp, notification.text, "
+                            "notification.latitude, notification.longitude "
+                            "FROM notification, user WHERE notification.receiverid = '%1' AND "
+                            "notification.senderid = user.id "
+                            "ORDER BY notification.timestamp DESC")
+                    .arg(userId));
+
+    result.append("\"received\": [");
+
+    bool receivedRemoveLast = false;
+
+    while (receivedQuery.next()) {
+        receivedRemoveLast = true;
+        result.append("{");
+        result.append("\"id\": \"" + receivedQuery.value(0).toString() + "\",");
+        result.append("\"sender_id\": \"" + receivedQuery.value(1).toString() + "\",");
+        result.append("\"receiver_id\": \"" + receivedQuery.value(2).toString() + "\",");
+        result.append("\"sender_name\": \"" + receivedQuery.value(3).toString() + "\",");
+        result.append("\"image_url\": \"" + receivedQuery.value(4).toString() + "\",");
+        result.append("\"timestamp\": \"" + receivedQuery.value(5).toString() + "\",");
+        result.append("\"text\": \"" + receivedQuery.value(6).toString() + "\",");
+        result.append("\"address\": \"" + QString("Address 13, Oulu") + "\",");
+        result.append("\"latitude\": \"" + receivedQuery.value(7).toString() + "\",");
+        result.append("\"longitude\": \"" + receivedQuery.value(8).toString() + "\"");
+        result.append("},");
+    }
+
+    if (receivedRemoveLast) {
+        int receivedLastComma = result.lastIndexOf(",");
+        if (receivedLastComma != -1)
+            result.remove(result.lastIndexOf(","), 1);
+    }
+
+    result.append("],");
+
+    //Sent
+    QSqlQuery sentQuery(QString("SELECT notification.id, notification.senderid, "
+                                "notification.receiverid, user.name, user.image_url, "
+                                "notification.timestamp, notification.text, "
+                                "notification.latitude, notification.longitude "
+                                "FROM notification, user WHERE notification.senderid = '%1' AND "
+                                "notification.receiverid = user.id "
+                                "ORDER BY notification.timestamp DESC")
+                    .arg(userId));
+
+    result.append("\"sent\": [");
+
+    bool sentRemoveLast = false;
+
+    while (sentQuery.next()) {
+        sentRemoveLast = true;
+        result.append("{");
+        result.append("\"id\": \"" + sentQuery.value(0).toString() + "\",");
+        result.append("\"sender_id\": \"" + sentQuery.value(1).toString() + "\",");
+        result.append("\"receiver_id\": \"" + sentQuery.value(2).toString() + "\",");
+        result.append("\"sender_name\": \"" + sentQuery.value(3).toString() + "\",");
+        result.append("\"image_url\": \"" + sentQuery.value(4).toString() + "\",");
+        result.append("\"timestamp\": \"" + sentQuery.value(5).toString() + "\",");
+        result.append("\"text\": \"" + sentQuery.value(6).toString() + "\",");
+        result.append("\"address\": \"" + QString("Address 13, Oulu") + "\",");
+        result.append("\"latitude\": \"" + sentQuery.value(7).toString() + "\",");
+        result.append("\"longitude\": \"" + sentQuery.value(8).toString() + "\"");
+        result.append("},");
+    }
+
+    if (sentRemoveLast) {
+        int lastComma = result.lastIndexOf(",");
+        if (lastComma != -1)
+            result.remove(result.lastIndexOf(","), 1);
+    }
+
+    result.append("]");
+
+    result.append("}}");
+
+    return result.toUtf8();
+}
+
+QByteArray Database::getPopularTags()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    QSqlQuery query(QString("SELECT tag.id, tag.name FROM tag ORDER BY count DESC LIMIT 10"));
 
     QString result;
-    result.append("{\"messages\": [");
+    result.append("{\"popular_tags\": [");
 
     while (query.next()) {
         result.append("{");
         result.append("\"id\": \"" + query.value(0).toString() + "\",");
-        result.append("\"sender_id\": \"" + query.value(1).toString() + "\",");
-        result.append("\"sender_name\": \"" + query.value(2).toString() + "\",");
-        result.append("\"image_url\": \"" + query.value(3).toString() + "\",");
-        result.append("\"timestamp\": \"" + query.value(4).toString() + "\",");
-        result.append("\"text\": \"" + query.value(5).toString() + "\"");
+        result.append("\"name\": \"" + query.value(1).toString() + "\"");
         result.append("},");
     }
 
@@ -281,7 +473,7 @@ QByteArray Database::getNotifications(qulonglong userId)
         result.remove(result.lastIndexOf(","), 1);
 
     result.append("]}");
-
+    qWarning() << result;
     return result.toUtf8();
 }
 
@@ -321,7 +513,8 @@ bool Database::removeMessage(qulonglong userId, const QString &id)
     QSqlQuery removeMessageQuery;
 
     return removeMessageQuery.exec(QString("DELETE FROM notification WHERE "
-                                           "notification.receiverid = '%1' AND "
+                                           "(notification.receiverid = '%1' OR "
+                                           "notification.senderid = '%1') AND "
                                            "notification.id = '%2'").arg(userId).arg(id));
 }
 
@@ -343,8 +536,18 @@ bool Database::sendMessage(qulonglong senderId, qulonglong receiverId, const QSt
 
     QSqlQuery sendMessageQuery;
 
-    return sendMessageQuery.exec(QString("INSERT INTO notification VALUES("
-            "NULL, '%1', '%2', strftime('%s','now'), '%3', '%4', '%5')")
+    bool returnValue;
+
+    if (coordinates.isValid()) {
+        returnValue = sendMessageQuery.exec(QString("INSERT INTO notification VALUES("
+                                    "NULL, '%1', '%2', strftime('%s','now'), '%3', '%4', '%5')")
                             .arg(senderId).arg(receiverId).arg(message).arg(coordinates.latitude()).
                             arg(coordinates.longitude()));
+    } else {
+        returnValue = sendMessageQuery.exec(QString("INSERT INTO notification VALUES("
+                                    "NULL, '%1', '%2', strftime('%s','now'), '%3', NULL, NULL)")
+                            .arg(senderId).arg(receiverId).arg(message));
+    }
+
+    return returnValue;
 }