diff --git a/CrawlerProcess/CrawlerProcess.pro.user b/CrawlerProcess/CrawlerProcess.pro.user index 116870b..e4c4014 100644 --- a/CrawlerProcess/CrawlerProcess.pro.user +++ b/CrawlerProcess/CrawlerProcess.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/EffectProcess/EffectProcess.pro b/EffectProcess/EffectProcess.pro index a41800e..ac9ad83 100644 --- a/EffectProcess/EffectProcess.pro +++ b/EffectProcess/EffectProcess.pro @@ -22,7 +22,8 @@ SOURCES += main.cpp \ seffectprocess.cpp \ snaverblog.cpp \ seffectstatistics.cpp \ - snaverblogprocess.cpp + snaverblogprocess.cpp \ + snaverurlvalidator.cpp HEADERS += \ swebpage.h \ @@ -32,4 +33,5 @@ HEADERS += \ seffectprocess.h \ seffectstatistics.h \ snaverblog.h \ - snaverblogprocess.h + snaverblogprocess.h \ + snaverurlvalidator.h diff --git a/EffectProcess/EffectProcess.pro.user b/EffectProcess/EffectProcess.pro.user index c7d92a1..e80e647 100644 --- a/EffectProcess/EffectProcess.pro.user +++ b/EffectProcess/EffectProcess.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/EffectProcess/main.cpp b/EffectProcess/main.cpp index 7b06701..9bb770e 100644 --- a/EffectProcess/main.cpp +++ b/EffectProcess/main.cpp @@ -5,6 +5,8 @@ #include "seffectprocess.h" #include "snaverblogprocess.h" #include +#include "sutilfunction.h" +#include "snaverurlvalidator.h" std::shared_ptr getProcess(const QString& _platform_name, const QString& _platform_form, @@ -28,10 +30,24 @@ int main(int argc, char *argv[]) return 0; } - std::shared_ptr process = getProcess(argv[1], argv[2], argv[3], argv[4], argv[5]); - - process->run(argv[4]); + QString platform_name = argv[1]; + QString platform_form = argv[2]; + QString event_code = argv[3]; + QString url = argv[4]; + QString date = argv[5]; + if (platform_name.trimmed() == "naver" && platform_form.trimmed() == "blog") + { + SNaverUrlValidator naverUrlValidator(url); + url = naverUrlValidator.makeUrl(); + if (url == "") + { + std::cout << "x!@#!@#!@#e010!@#checkUrl"; + return 0; + } + } + std::shared_ptr process = getProcess(platform_name, platform_form, event_code, url, date); + process->run(url); return a.exec(); } diff --git a/EffectProcess/seffectstatistics.cpp b/EffectProcess/seffectstatistics.cpp index e5c8454..c1a1355 100644 --- a/EffectProcess/seffectstatistics.cpp +++ b/EffectProcess/seffectstatistics.cpp @@ -49,12 +49,6 @@ QString getReplyBuzz(const EffectData& _data) QDate firstDate = QDateTime::fromString(_data.body.data[ARTICLE_DATE].trimmed().replace("T", " ").replace(".","-").replace("- "," "), "yyyy-MM-dd hh:mm:ss").date(); QDate lastDate = QDate::currentDate(); - - qDebug() << _data.body.data[ARTICLE_DATE]; - qDebug() << "firstDate:" << firstDate.toString("yyyy-MM-dd"); - qDebug() << "lastDate:" << lastDate.toString("yyyy-MM-dd"); - - for (QDate date = firstDate; date <= lastDate; date = date.addDays(1)) { mapDate.insert(date, 0); @@ -83,19 +77,13 @@ QString getReplyBuzz(const EffectData& _data) return result; } -QString getReplyBuzz(const EffectData& _data, const QString& _startdate) +QJsonArray getReplyBuzz(const EffectData& _data, const QString& _startdate) { QMap mapDate; QDate firstDate = QDateTime::fromString(_startdate, "yyyy-MM-dd").date(); QDate lastDate = QDate::currentDate(); - - qDebug() << _data.body.data[ARTICLE_DATE]; - qDebug() << "firstDate:" << firstDate.toString("yyyy-MM-dd"); - qDebug() << "lastDate:" << lastDate.toString("yyyy-MM-dd"); - - for (QDate date = firstDate; date <= lastDate; date = date.addDays(1)) { mapDate.insert(date, 0); @@ -110,16 +98,77 @@ QString getReplyBuzz(const EffectData& _data, const QString& _startdate) continue; mapDate[date]++; } - QJsonArray jArray; + QJsonArray jArray; + int nAccReplyCount = 0; for (auto iter = mapDate.cbegin(); iter != mapDate.cend(); ++iter) { + int nValue = iter.value(); + nAccReplyCount += nValue; + QJsonObject jObj; - jObj["date"] = iter.key().toString("MM-dd-yyyy"); - jObj["value"] = iter.value(); + jObj["date"] = iter.key().toString("yyyyMMdd"); + jObj["reply_day"] = nValue; + jObj["reply_acc"] = nAccReplyCount; jArray.append(jObj); } + + return jArray; +} + +QJsonArray getLikeBuzz(const EffectData& _data, const QString& _startdate) +{ + QMap mapDate; + + QDate firstDate = QDateTime::fromString(_startdate, "yyyy-MM-dd").date(); + QDate lastDate = QDate::currentDate(); + + for (QDate date = firstDate; date <= lastDate; date = date.addDays(1)) + { + mapDate.insert(date.toString("yyyyMMdd"), 0); + } + + QMapIterator iter(_data.like); + while (iter.hasNext()) + { + iter.next(); + QString date = iter.key(); + mapDate[date] = iter.value(); + } + + QJsonArray jArray; + int nAccLikeCount = 0; + for (auto iter = mapDate.cbegin(); iter != mapDate.cend(); ++iter) + { + int nValue = iter.value(); + nAccLikeCount += nValue; + + QJsonObject jObj; + jObj["date"] = iter.key(); + jObj["like_day"] = nValue; + jObj["like_acc"] = nAccLikeCount; + jArray.append(jObj); + } + + return jArray; +} + +QString summaryLikeAndReply(QJsonArray _replyBuzz, QJsonArray _likeBuzz) +{ + QJsonArray jArray; + for (int i=0; i<_replyBuzz.count(); i++) + { + QJsonObject jObj; + jObj["date"] = _replyBuzz.at(i).toObject()["date"]; + jObj["reply_day"] = _replyBuzz.at(i).toObject()["reply_day"]; + jObj["reply_acc"] = _replyBuzz.at(i).toObject()["reply_acc"]; + jObj["like_day"] = _likeBuzz.at(i).toObject()["like_day"]; + jObj["like_acc"] = _likeBuzz.at(i).toObject()["like_acc"]; + jArray.append(jObj); + } + QJsonDocument jDoc(jArray); QString result = jDoc.toJson(QJsonDocument::Compact); + return result; } diff --git a/EffectProcess/seffectstatistics.h b/EffectProcess/seffectstatistics.h index d7d6462..2afebca 100644 --- a/EffectProcess/seffectstatistics.h +++ b/EffectProcess/seffectstatistics.h @@ -20,7 +20,11 @@ QString getViewBuzz(const EffectData& _data); QString getReplyBuzz(const EffectData& _data); -QString getReplyBuzz(const EffectData& _data, const QString& _startdate); +QJsonArray getReplyBuzz(const EffectData& _data, const QString& _startdate); + +QJsonArray getLikeBuzz(const EffectData& _data, const QString& _startdate); + +QString summaryLikeAndReply(QJsonArray _replyBuzz, QJsonArray _likeBuzz); #endif // SEFFECTSTATISTICS diff --git a/EffectProcess/snaverblog.cpp b/EffectProcess/snaverblog.cpp index a1c7576..0abb6eb 100644 --- a/EffectProcess/snaverblog.cpp +++ b/EffectProcess/snaverblog.cpp @@ -279,8 +279,38 @@ const QString SNaverBlog::scriptReply = " }" " return result;" "}" - "getReply();" - ; + "getReply();"; + +const QString SNaverBlog::scriptLike = + "function getLike()" + "{" + " var result = [];" + " var datemap = new Map();" + " var likeTableBody = document.querySelector('#comment>table>tbody');" + " var likeTrs = likeTableBody.querySelectorAll('tr');" + " for (var i=0; ispan');" + " var rawdate = span.textContent;" + " var date = rawdate.split(' ')[0];" + "" + " if (datemap.get(date) == undefined)" + " {" + " datemap.set(date, 1);" + " }" + " else" + " {" + " datemap.set(date, datemap.get(date)+1);" + " }" + " }" + " datemap.forEach(function (item, key) {" + " var datecount = [key, item];" + " result.push(datecount);" + " });" + "" + " return result;" + "}" + "getLike();"; QString GetSafeUtf(const QString& _strData) @@ -467,6 +497,12 @@ void SNaverBlog::slotLoadFinished(bool ok) */ break; } + case E_CRAWL_MODE::LIKE: + { + m_pWebPage->runJavaScript(scriptLike, std::bind(&SNaverBlog::cbLike,this, _1)); + + break; + } } //emit signalDataOk(m_efData); } @@ -572,6 +608,24 @@ QString SNaverBlog::makeReplyUrl(const QString& _url) } +QString SNaverBlog::makeLikeUrl(const QString& _url) +{ + QStringList strList = _url.split("/"); + QString strOut = ""; + + if(strList.size() < 4) + emit signalError(E_ERROR_CODE::OUT_DATED_CRAWLER, "Check Body and LikeUrl\n"); + + //url example : http://blog.naver.com/SympathyHistoryList.nhn?blogId=yewonerang&logNo=220984900374 + strOut += "http://blog.naver.com/SympathyHistoryList.nhn?blogId="; + strOut += strList.at(3); + strOut += "&logNo="; + strOut += strList.at(4); + + return strOut; +} + + void SNaverBlog::cbBodyArticleDate(const QVariant& _result) { //qDebug() << "articledate"; @@ -743,6 +797,19 @@ void SNaverBlog::goReplyUrl() go(makeReplyUrl(m_strUrl), E_CRAWL_MODE::REPLY); } +void SNaverBlog::goLikeUrl() +{ + m_bBodyProcessed = true; + + if (!check(m_efData.body)) + { + emit signalError(E_ERROR_CODE::BLOCK_ERROR, "Block or Check naver"); + return; + } + + go(makeLikeUrl(m_strUrl), E_CRAWL_MODE::LIKE); +} + void SNaverBlog::cbReply(const QVariant& _result) { //id, nickname, date, commment, order, strParent; @@ -770,6 +837,24 @@ void SNaverBlog::cbReply(const QVariant& _result) qDebug() << "cbReply"; qDebug() << m_efData.reply.size(); */ +// emit signalDataOk(m_efData); + goLikeUrl(); +} + +void SNaverBlog::cbLike(const QVariant& _result) +{ + if (_result.isValid() && !_result.isNull()) + { + QList results = _result.toList(); + foreach (auto &result, results) + { + QStringList slResult = result.toStringList(); + QString date = ((QString)slResult.at(0)).replace(".", ""); + + m_efData.like[date] = ((QString)slResult.at(1)).toInt(); + } + } + emit signalDataOk(m_efData); } diff --git a/EffectProcess/snaverblog.h b/EffectProcess/snaverblog.h index e5ee2ce..574e147 100644 --- a/EffectProcess/snaverblog.h +++ b/EffectProcess/snaverblog.h @@ -11,7 +11,8 @@ enum class E_CRAWL_MODE { BODY = 0, - REPLY + REPLY, + LIKE }; static const QString scriptArticleDate; @@ -42,11 +43,13 @@ public: private: QString makeReplyUrl(const QString& _url); + QString makeLikeUrl(const QString& _url); QString changeUrl(const QString& _url); void initConnect(); bool check(const DataForm& _data); bool check(const QVector& _data); void goReplyUrl(); + void goLikeUrl(); /* DataForm getBody(); @@ -73,6 +76,8 @@ private: void cbBodyArticleOrder(const QVariant& result); void cbBodyReplyUrl(const QVariant& _result); void cbBodyLikeCount(const QVariant& _result); + void cbReply(const QVariant& _result); + void cbLike(const QVariant& _result); bool doneBodyCrawler(E_FUNC _func_type); @@ -83,11 +88,10 @@ private: static const QString scriptLikeCount; static const QString scriptArticleNickname; static const QString scriptArticleOrder; - bool m_abOk[E_FUNC_MAX]; - - void cbReply(const QVariant& _result); static const QString scriptReply; + static const QString scriptLike; + bool m_abOk[E_FUNC_MAX]; private: std::shared_ptr m_pWebPage; diff --git a/EffectProcess/snaverblogprocess.cpp b/EffectProcess/snaverblogprocess.cpp index 4c4a02d..6839b9d 100644 --- a/EffectProcess/snaverblogprocess.cpp +++ b/EffectProcess/snaverblogprocess.cpp @@ -15,8 +15,9 @@ State_s1_effect SNaverBlogProcess::processData(const EffectData& _data) result.event_num = eventCode(); result.likecount = getlikeCount(_data); - //result.replybuzz = getReplyBuzz(_data); result.replybuzz = getReplyBuzz(_data, m_pParam[E_PARAM_START_DATE]); + result.likebuzz = getLikeBuzz(_data, m_pParam[E_PARAM_START_DATE]); + result.totalbuzz = summaryLikeAndReply(result.replybuzz, result.likebuzz); result.viewcount = getViewCount(_data); result.interactioncount = getInteractionCount(_data); result.replycount = getReplyCount(_data); diff --git a/EffectProcess/snaverurlvalidator.cpp b/EffectProcess/snaverurlvalidator.cpp new file mode 100644 index 0000000..17a41a1 --- /dev/null +++ b/EffectProcess/snaverurlvalidator.cpp @@ -0,0 +1,128 @@ +#include "snaverurlvalidator.h" +#include +#include + +const QString SNaverUrlValidator::m_strSubDomain = "www"; +const QString SNaverUrlValidator::m_strProtocol = "http"; +const QString SNaverUrlValidator::m_strBaseHost = "blog.naver.com"; +const QString SNaverUrlValidator::m_strSecondaryHost = "blog.me"; + +SNaverUrlValidator::SNaverUrlValidator(QString url) : m_isBaseHost(false), m_isSecondaryHost(false) +{ + m_strUrl = url.trimmed(); +} + +QString SNaverUrlValidator::makeUrl() +{ + if (!validateUrl()) + { + return ""; + } + + QString strUrl = m_strProtocol + "://" + m_strBaseHost + "/" + m_strUserId + "/" + m_strArticleNum; + return strUrl; +} + +bool SNaverUrlValidator::validateUrl() +{ + int nStartIndex = getHostStartPosition(); + if (nStartIndex < 0) + { + return false; + } + + nStartIndex = checkHost(nStartIndex); + if (nStartIndex < 0) + { + return false; + } + + if (checkPath(nStartIndex) < 0) + { + return false; + } + + return true; +} + +int SNaverUrlValidator::getHostStartPosition() +{ + int nHostStartPosition = m_strUrl.indexOf(':'); + if (nHostStartPosition == -1) + { + return 0; + } + + if (m_strUrl.at(nHostStartPosition+1) != '/' || m_strUrl.at(nHostStartPosition+2) != '/') + { + return -1; + } + + return nHostStartPosition + 3; +} + +int SNaverUrlValidator::checkHost(int _nHostStartPosition) +{ + int nHostEndPosition = m_strUrl.indexOf('/', _nHostStartPosition) - 1; + if (nHostEndPosition < 0) + { + return -1; + } + + m_isBaseHost = m_strUrl.contains(m_strBaseHost); + m_isSecondaryHost = m_strUrl.contains(m_strSecondaryHost); + if ((m_isBaseHost == false) && (m_isSecondaryHost == false)) + { + return -2; + } + + if (m_isSecondaryHost) + { + int nHostLength = nHostEndPosition - _nHostStartPosition + 1; + QString strHost = m_strUrl.mid(_nHostStartPosition, nHostLength); + QStringList listHostSplit = strHost.split('.'); + for (int i=0; i + +class SNaverUrlValidator +{ +private: + static const QString m_strSubDomain; + static const QString m_strProtocol; + static const QString m_strBaseHost; + static const QString m_strSecondaryHost; + + QString m_strUserId; + QString m_strArticleNum; + + QString m_strUrl; + + bool m_isBaseHost; + bool m_isSecondaryHost; + +private: + bool validateUrl(); + int getHostStartPosition(); + int checkHost(int _nHostStartPosition); + int checkPath(int _nHostStartPosition); +public: + SNaverUrlValidator(QString url); + QString makeUrl(); +}; + + +#endif // SNAVERURLVALIDATOR_H diff --git a/EffectProcess/sresultsender.cpp b/EffectProcess/sresultsender.cpp index 7d172b3..2a83f18 100644 --- a/EffectProcess/sresultsender.cpp +++ b/EffectProcess/sresultsender.cpp @@ -95,7 +95,8 @@ bool SResultSender::send(const State_s1_effect& _result) QSqlQuery query(db); query.prepare(strQuery); query.bindValue(":event_num", _result.event_num); - query.bindValue(":replybuzz", _result.replybuzz); +// query.bindValue(":replybuzz", _result.replybuzz); + query.bindValue(":replybuzz", _result.totalbuzz); query.bindValue(":replycount", _result.replycount); query.bindValue(":likecount", _result.likecount); query.bindValue(":interactioncount", _result.interactioncount); diff --git a/EffectProcess/sutilclass.h b/EffectProcess/sutilclass.h index 807f0d9..62a78e5 100644 --- a/EffectProcess/sutilclass.h +++ b/EffectProcess/sutilclass.h @@ -5,6 +5,7 @@ #include #include #include +#include class STableWidgetItem : public QTableWidgetItem { @@ -195,13 +196,16 @@ struct EffectData { DataForm body; QVector reply; + QMap like; }; struct State_s1_effect { int event_num; QString view_buzz; - QString replybuzz; + QJsonArray replybuzz; + QJsonArray likebuzz; + QString totalbuzz; int replycount; int likecount; int viewcount; diff --git a/EffectProcess/sutilfunction.cpp b/EffectProcess/sutilfunction.cpp index de98084..a3bfac5 100644 --- a/EffectProcess/sutilfunction.cpp +++ b/EffectProcess/sutilfunction.cpp @@ -67,5 +67,22 @@ QString EnumErrorCodetostrErrorCode(E_ERROR_CODE _code) static_cast(_code) < static_cast(E_ERROR_CODE::MAX)) return ERROR_MESSAGE_CODE[static_cast(_code)]; else - return ERROR_MESSAGE_CODE[static_cast(E_ERROR_CODE::UNKNOWN_ERROR)]; + return ERROR_MESSAGE_CODE[static_cast(E_ERROR_CODE::UNKNOWN_ERROR)]; +} + +QString convertNaverBlogMeUrl(const QString& _str) +{ + QStringList listSplitUrl = _str.split("/"); + if (listSplitUrl.count() != 4) + return _str; + + QString strPostNumber = listSplitUrl[3]; + QStringList listSplitHostUrl = listSplitUrl[2].split("."); + if (listSplitHostUrl.count() != 3) + return _str; + + QString strUserId = listSplitHostUrl[0]; + QString strConvertedUrl = "http://blog.naver.com/" + strUserId + "/" + strPostNumber; + + return strConvertedUrl; } diff --git a/EffectProcess/sutilfunction.h b/EffectProcess/sutilfunction.h index fbcf7e6..698f419 100644 --- a/EffectProcess/sutilfunction.h +++ b/EffectProcess/sutilfunction.h @@ -8,5 +8,6 @@ void messageBoxError(const QString& title, const QString &body); QString errorCodeToString(E_ERROR_CODE _error_code); E_ERROR_CODE strErrorCodeToEnumErrorCode(const QString& _str); QString EnumErrorCodetostrErrorCode(E_ERROR_CODE _code); +QString convertNaverBlogMeUrl(const QString& _str); #endif // SUTILFUNCTION diff --git a/EffectUI/EffectUI.pro.user b/EffectUI/EffectUI.pro.user index 85bd407..c1ee0f9 100644 --- a/EffectUI/EffectUI.pro.user +++ b/EffectUI/EffectUI.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -779,8 +779,8 @@ 2 EffectUI - EffectUI2 - Qt4ProjectManager.Qt4RunConfiguration:C:/source/EffectUI2/EffectUI.pro + + Qt4ProjectManager.Qt4RunConfiguration:C:/source/EffectUI/EffectUI.pro true EffectUI.pro diff --git a/EffectUI/sutilfunction.cpp b/EffectUI/sutilfunction.cpp index f02f268..c5852ac 100644 --- a/EffectUI/sutilfunction.cpp +++ b/EffectUI/sutilfunction.cpp @@ -69,3 +69,20 @@ QString EnumErrorCodetostrErrorCode(E_ERROR_CODE _code) else return ERROR_MESSAGE_CODE[static_cast(E_ERROR_CODE::UNKNOWN_ERROR)]; } + +QString convertNaverBlogMeUrl(const QString& _str) +{ + QStringList listSplitUrl = _str.split("/"); + if (listSplitUrl.count() != 4) + return _str; + + QString strPostNumber = listSplitUrl[3]; + QStringList listSplitHostUrl = listSplitUrl[2].split("."); + if (listSplitHostUrl.count() != 3) + return _str; + + QString strUserId = listSplitHostUrl[0]; + QString strConvertedUrl = "http://blog.naver.com/" + strUserId + "/" + strPostNumber; + + return strConvertedUrl; +} diff --git a/EffectUI/sutilfunction.h b/EffectUI/sutilfunction.h index fbcf7e6..698f419 100644 --- a/EffectUI/sutilfunction.h +++ b/EffectUI/sutilfunction.h @@ -8,5 +8,6 @@ void messageBoxError(const QString& title, const QString &body); QString errorCodeToString(E_ERROR_CODE _error_code); E_ERROR_CODE strErrorCodeToEnumErrorCode(const QString& _str); QString EnumErrorCodetostrErrorCode(E_ERROR_CODE _code); +QString convertNaverBlogMeUrl(const QString& _str); #endif // SUTILFUNCTION diff --git a/Filter/Filter.pro.user b/Filter/Filter.pro.user index 826b174..c6d1e31 100644 --- a/Filter/Filter.pro.user +++ b/Filter/Filter.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -285,8 +285,8 @@ 2 Filter - - Qt4ProjectManager.Qt4RunConfiguration:C:/source/Filter2/Filter.pro + Filter2 + Qt4ProjectManager.Qt4RunConfiguration:C:/source/Filter/Filter.pro true Filter.pro diff --git a/FilterProcess/FilterProcess.pro.user b/FilterProcess/FilterProcess.pro.user index 5c0b5ef..150cab6 100644 --- a/FilterProcess/FilterProcess.pro.user +++ b/FilterProcess/FilterProcess.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -1273,8 +1273,8 @@ 2 FilterProcess - - Qt4ProjectManager.Qt4RunConfiguration:C:/source/FilterProcess/FilterProcess.pro + FilterProcess2 + Qt4ProjectManager.Qt4RunConfiguration:C:/source/FilterProcess2/FilterProcess.pro true FilterProcess.pro diff --git a/FilterProcess/main.cpp b/FilterProcess/main.cpp index 453fdee..67e7a16 100644 --- a/FilterProcess/main.cpp +++ b/FilterProcess/main.cpp @@ -13,7 +13,6 @@ int main(int argc, char *argv[]) cout << " "; cout << QString(__TIME__).toStdString() << endl; SFilterProcess filter; - if (argc != 4) { cout << "check argument " << endl; diff --git a/FilterProcess/sdatagroup.cpp b/FilterProcess/sdatagroup.cpp index 1d8a77b..481444d 100644 --- a/FilterProcess/sdatagroup.cpp +++ b/FilterProcess/sdatagroup.cpp @@ -166,6 +166,10 @@ bool SDatagroup::loadData(const int& _nDatagroupNumber) m_stBodyReplyCount.m_nAllBodyCount = m_mapBody.size(); m_stBodyReplyCount.m_nAllReplyCount = ncReply; + + makeBodyCountOfPlatform(); + makeUserCountOfPlatform(); + m_pSInitializer->insertLog("End Loading"); return true; } @@ -570,22 +574,77 @@ const QMap >* SDatagroup::getmapReply() int SDatagroup::getBodyCount() { - return m_SBody.getBodyCount(); + int nBodyCount = 0; + + QMapIterator iter(m_mapBodyCountOfPlatform); + while (iter.hasNext()) + { + iter.next(); + nBodyCount += iter.value(); + } + + return nBodyCount; } int SDatagroup::getUserCount() { - return m_SBody.getUserCount(); + int nUserCount = 0; + + QMapIterator iter(m_mapUserCountOfPlatform); + while (iter.hasNext()) + { + iter.next(); + nUserCount += iter.value(); + } + + return nUserCount; +} + +void SDatagroup::makeBodyCountOfPlatform() +{ + const int *anColumn = m_pSInitializer->getColumnIntArray(); + QMapIterator iter(m_mapBody); + while (iter.hasNext()) + { + iter.next(); + + QStringList columns = iter.value(); + QString strPlatform = columns[anColumn[SInitializer::E_DATA_platform_name]].trimmed(); + + m_mapBodyCountOfPlatform[strPlatform]++; + } +} + +void SDatagroup::makeUserCountOfPlatform() +{ + QMap> mapUserIdsOfPlatform; + const int *anColumn = m_pSInitializer->getColumnIntArray(); + QMapIterator iter(m_mapBody); + while (iter.hasNext()) + { + iter.next(); + + QStringList columns = iter.value(); + QString strPlatform = columns[anColumn[SInitializer::E_DATA_platform_name]].trimmed(); + QString strUserId = columns[anColumn[SInitializer::E_DATA_platform_id]].trimmed(); + + if (mapUserIdsOfPlatform[strPlatform].contains(strUserId)) + continue; + + mapUserIdsOfPlatform[strPlatform].insert(strUserId); + + m_mapUserCountOfPlatform[strPlatform]++; + } } QMap SDatagroup::getMapBodyCountOfPlatform() { - return m_SBody.getMapBodyCountOfPlatform(); + return m_mapBodyCountOfPlatform; } QMap SDatagroup::getMapUserCountOfPlatform() { - return m_SBody.getMapUserCountOfPlatform(); + return m_mapUserCountOfPlatform; } bool SDatagroup::SBody::putCategory(const QString &_url, const int &_nCategory) @@ -772,85 +831,85 @@ int SDatagroup::SBody::getBodyNum(const QString &_url) return -1; } -int SDatagroup::SBody::getBodyCount() -{ - int nBodyCount = 0; - QSet setUrl; - QMapIterator iter(m_mapBody); - while (iter.hasNext()) - { - iter.next(); +//int SDatagroup::SBody::getBodyCount() +//{ +// int nBodyCount = 0; +// QSet setUrl; +// QMapIterator iter(m_mapBody); +// while (iter.hasNext()) +// { +// iter.next(); - if (setUrl.contains(iter.value().url)) - continue; +// if (setUrl.contains(iter.value().url)) +// continue; - setUrl.insert(iter.key()); +// setUrl.insert(iter.key()); - nBodyCount++; - } +// nBodyCount++; +// } - return nBodyCount; -} +// return nBodyCount; +//} -int SDatagroup::SBody::getUserCount() -{ - int nUserCount = 0; - QSet setId; - QMapIterator iter(m_mapBody); - while (iter.hasNext()) - { - iter.next(); +//int SDatagroup::SBody::getUserCount() +//{ +// int nUserCount = 0; +// QSet setId; +// QMapIterator iter(m_mapBody); +// while (iter.hasNext()) +// { +// iter.next(); - if (setId.contains(iter.value().id_num)) - continue; +// if (setId.contains(iter.value().id_num)) +// continue; - setId.insert(iter.value().id_num); +// setId.insert(iter.value().id_num); - nUserCount++; - } +// nUserCount++; +// } - return nUserCount; -} +// return nUserCount; +//} -QMap SDatagroup::SBody::getMapBodyCountOfPlatform() -{ - QMap mapBodyCountOfPlatform; - QSet setUrl; - QMapIterator iter(m_mapBody); - while (iter.hasNext()) - { - iter.next(); +//QMap SDatagroup::SBody::getMapBodyCountOfPlatform() +//{ +// QMap mapBodyCountOfPlatform; +// QSet setUrl; +// QMapIterator iter(m_mapBody); +// while (iter.hasNext()) +// { +// iter.next(); - if (setUrl.contains(iter.value().url)) - continue; +// if (setUrl.contains(iter.value().url)) +// continue; - setUrl.insert(iter.key()); +// setUrl.insert(iter.key()); - mapBodyCountOfPlatform[iter.value().platformname_name]++; - } +// mapBodyCountOfPlatform[iter.value().platformname_name]++; +// } - return mapBodyCountOfPlatform; -} +// return mapBodyCountOfPlatform; +//} -QMap SDatagroup::SBody::getMapUserCountOfPlatform() -{ - QMap mapUserCountOfPlatform; - QSet setId; - QMapIterator iter(m_mapBody); - while (iter.hasNext()) - { - iter.next(); +//QMap SDatagroup::SBody::getMapUserCountOfPlatform() +//{ +// QMap mapUserCountOfPlatform; +// QSet setId; +// QMapIterator iter(m_mapBody); +// while (iter.hasNext()) +// { +// iter.next(); - if (setId.contains(iter.value().id_num)) - continue; +// if (setId.contains(iter.value().id_num)) +// continue; - setId.insert(iter.value().id_num); +// setId.insert(iter.value().id_num); - mapUserCountOfPlatform[iter.value().platformname_name]++; - } +// mapUserCountOfPlatform[iter.value().platformname_name]++; +// } - return mapUserCountOfPlatform; -} +// return mapUserCountOfPlatform; +//} void SDatagroup::SReply::put(const QString &_url, const int &_order, const stReply &_streply) { diff --git a/FilterProcess/sdatagroup.h b/FilterProcess/sdatagroup.h index 2c72ff8..fa73b4d 100644 --- a/FilterProcess/sdatagroup.h +++ b/FilterProcess/sdatagroup.h @@ -154,10 +154,10 @@ public: void setInitializer(SInitializer &initializer){ m_pSInitializer = &initializer; } stBody* get(const QString& _url); void clear(); - int getBodyCount(); - int getUserCount(); - QMap getMapBodyCountOfPlatform(); - QMap getMapUserCountOfPlatform(); +// int getBodyCount(); +// int getUserCount(); +// QMap getMapBodyCountOfPlatform(); +// QMap getMapUserCountOfPlatform(); }; class SReply @@ -248,9 +248,10 @@ private: QStringList m_slOrderedBodyUrl; QMap > m_mapReply; QMap m_mapBody; + QMap m_mapBodyCountOfPlatform; + QMap m_mapUserCountOfPlatform; QMap m_mapProfile; - SBody m_SBody; SReply m_SReply; SCommunity m_SCommunity; @@ -290,6 +291,8 @@ private: void init(); void setloadQuery(QString _astrQuery[], int _nDatagroupNumber); void makeProfile(const QStringList& _strList); + void makeBodyCountOfPlatform(); + void makeUserCountOfPlatform(); }; diff --git a/FilterProcess/sinfluencer.cpp b/FilterProcess/sinfluencer.cpp index 2daf660..9307cfa 100644 --- a/FilterProcess/sinfluencer.cpp +++ b/FilterProcess/sinfluencer.cpp @@ -211,7 +211,7 @@ bool SInfluencer::makeTable(SDatagroup &_datagroup) m_pSInitializer->insertLog("Make influencer influencer"); m_STInfluencer.makeTable(_datagroup, m_mapCategory); m_pSInitializer->insertLog("Make influencer stats_json"); - //m_SStatsJson.makeTable(_datagroup, m_mapCategory); +// m_SStatsJson.makeTable(_datagroup, m_mapCategory); m_SStatsJson.makeTable(_datagroup, m_STInfluencer); } return true; @@ -247,17 +247,23 @@ bool SInfluencer::STInfluencer::SaveDataFile(int _companyNum) stream.setAutoDetectUnicode(true); stream << "Category," << "ID," << "Nick," << "Title," << "Url," << "Like," << "Share," << "Body," << "Reply," << "Value" << "\n"; - QMapIterator> iter1(m_mapInfluencerOfCategory); - while (iter1.hasNext()) + QMapIterator>> iter(m_mapInfluencerOfGroup); + while (iter.hasNext()) { - iter1.next(); - int nCategoryNum = iter1.key(); - const QList listInfluencer = iter1.value(); - foreach (stInfluencer Influecner, listInfluencer) + iter.next(); + + QMapIterator> iter2(iter.value()); + while (iter2.hasNext()) { - stream << Influecner.category_num << "," << Influecner.id_id << "," << Influecner.nickname_nickname << "," << Influecner.community_title << "," - << "http://" + Influecner.community_url << "," << Influecner.likecount << "," << Influecner.sharecount << "," << Influecner.bodycount << "," - << Influecner.replycount << "," << Influecner.influencervalue << "\n"; + iter2.next(); + + const QList listInfluencer = iter2.value(); + foreach (stInfluencer Influecner, listInfluencer) + { + stream << Influecner.category_num << "," << Influecner.id_id << "," << Influecner.nickname_nickname << "," << Influecner.community_title << "," + << "http://" + Influecner.community_url << "," << Influecner.likecount << "," << Influecner.sharecount << "," << Influecner.bodycount << "," + << Influecner.replycount << "," << Influecner.influencervalue << "\n"; + } } } @@ -273,10 +279,12 @@ void SInfluencer::STInfluencer::makeTable(SDatagroup &_datagroup, const QMapgetColumnIntArray(); + m_mapInfluencerGroupInfo = m_pSInitializer->getInfluencerGroup(); for (QMap::const_iterator iterPos = _mapCategory.constBegin(); iterPos != _mapCategory.constEnd(); iterPos++) { QMap mapRank; + int nCategoryNum = iterPos.key(); const stReal& streal = iterPos.value(); foreach (const QString& _url, *orderedUrl) { @@ -293,7 +301,7 @@ void SInfluencer::STInfluencer::makeTable(SDatagroup &_datagroup, const QMapcommunity_num; mapRank[stprofileurlkey].profile = (*(_datagroup.getmapBody(stprofileurlkey)))[anColumn[SInitializer::E_DATA_article_profile]].trimmed(); mapRank[stprofileurlkey].profileurl = (*(_datagroup.getmapBody(stprofileurlkey)))[anColumn[SInitializer::E_DATA_article_profileurl]].trimmed(); - mapRank[stprofileurlkey].category_num = iterPos.key(); + mapRank[stprofileurlkey].category_num = nCategoryNum; //mapRank[stprofileurlkey].community_title = _datagroup.getstCommunity(*(_datagroup.getmapBody(stprofileurlkey)))->title; //mapRank[stprofileurlkey].community_url = _datagroup.getstCommunity(*(_datagroup.getmapBody(stprofileurlkey)))->url; //mapRank[stprofileurlkey].community_id = _datagroup.getstCommunity(*(_datagroup.getmapBody(stprofileurlkey)))->id; @@ -321,7 +329,6 @@ void SInfluencer::STInfluencer::makeTable(SDatagroup &_datagroup, const QMap* mapstReply = _datagroup.getstReply(_url); if (mapstReply == 0) continue; @@ -339,7 +346,6 @@ void SInfluencer::STInfluencer::makeTable(SDatagroup &_datagroup, const QMap::iterator iterPos1 = mapRank.begin(); iterPos1 != mapRank.end(); iterPos1++) { stInfluencer &val = iterPos1.value(); @@ -347,174 +353,18 @@ void SInfluencer::STInfluencer::makeTable(SDatagroup &_datagroup, const QMap::iterator iterPos1 = mapRank.begin(); iterPos1 != mapRank.end(); iterPos1++) -// { -// stInfluencer &val = iterPos1.value(); -// //val.influencervalue = val.bodycount * m_pSInitializer->getInfluencerParam(0) + val.replycount * m_pSInitializer->getInfluencerParam(1); -// if (val.bodycount == 0) -// val.influencervalue = 0; -// else -// val.influencervalue = static_cast(val.replycount + val.sharecount + val.likecount) * m_pSInitializer->getInfluencerParam().A / -// (val.bodycount * m_pSInitializer->getInfluencerParam().B); -// } - - SInfluencerWeight influecnerWeight; - for (QMap::iterator iter = mapRank.begin(); iter != mapRank.end(); iter++) - { - stInfluencer &influencer = iter.value(); - influecnerWeight.insert(influencer); - } - - influecnerWeight.calculateWeight(); - - for (QMap::iterator iter = mapRank.begin(); iter != mapRank.end(); iter++) - { - stInfluencer &influencer = iter.value(); - influencer.influencervalue = influecnerWeight.getInfluenceValue(influencer); - } - - - QList listmap = mapRank.values(); - qSort(listmap.begin(), listmap.end(), isGreaterInfluencerValue()); - int rank = 1; - for (QList::iterator iterPos1 = listmap.begin(); iterPos1 != listmap.end(); iterPos1++) - { - iterPos1->rank = rank++; - } - m_listMap.append(listmap); + int nInfluencerGroupNum = getInfluencerGroupNum(nCategoryNum); + m_mapInfluencerOfGroup[nInfluencerGroupNum][nCategoryNum].append(mapRank.values()); } + setInfluencerValueWieght(); + processDuplicatedInfluencer(); + setInfluecnerRank(); - //Make Map Influencer Group by Category within limit range, Sort by rank - int nInfluencerLimitFrom = m_pSInitializer->getInfluencerLimitFrom().toInt(); - int nInfluencerLimitTo = m_pSInitializer->getInfluencerLimitTo().toInt(); - QListIterator iter(m_listMap); - while (iter.hasNext()) - { - const stInfluencer& influencer = iter.next(); - if (influencer.rank < nInfluencerLimitFrom || nInfluencerLimitTo < influencer.rank) - continue; - - m_mapInfluencerOfCategory[influencer.category_num].append(influencer); - } - - for (QMap>::iterator iter = m_mapInfluencerOfCategory.begin(); iter != m_mapInfluencerOfCategory.end(); iter++) - { - QList& listInfluencer = iter.value(); - qSort(listInfluencer.begin(), listInfluencer.end(), isGreaterInfluencerRank()); - } - - - - + copyInfluencerFromGroupToList(); } -/* -bool SInfluencer::STInfluencer::uploadData(QSqlDatabase &_db, const int &_nCompany) -{ - QString strQuery = "delete from influencer where company_num = " + QString::number(_nCompany); - QSqlQuery query(_db); - if (query.exec(strQuery.toUtf8()) == false) - { - m_pSInitializer->insertLog(query.lastQuery()); - m_pSInitializer->insertLog(query.lastError().text()); - return false; - } - strQuery = "insert into influencer (rank,company_num,id_num,nickname_num,community_num,bodycount,replycount,influencervalue,profile,profileurl,id_id)" - " VALUES (:RANK,:COMPANY_NUM,:ID_NUM,:NICKNAME_NUM,:COMMUNITY_NUM,:BODY_COUNT,:REPLY_COUNT,:INPL,:PROFILE,:PROFILE_URL,:ID_ID)"; - - query.clear(); - query.prepare(strQuery.toUtf8()); - - foreach (const stInfluencer& stinfluencer, m_listMap) - { - query.bindValue(":RANK", stinfluencer.rank); - query.bindValue(":COMPANY_NUM", _nCompany); - query.bindValue(":ID_NUM", stinfluencer.id_num); - query.bindValue(":NICKNAME_NUM", stinfluencer.nickname_num); - query.bindValue(":COMMUNITY_NUM", stinfluencer.community_num); - query.bindValue(":BODY_COUNT", stinfluencer.bodycount); - query.bindValue(":REPLY_COUNT", stinfluencer.replycount); - query.bindValue(":ID_ID", stinfluencer.id_id); - query.bindValue(":INPL", QString::number(stinfluencer.influencervalue, 'g', 3)); - //query.bindValue(":PROFILE", ((stinfluencer.profile.trimmed().isEmpty())? " " : sqlString(stinfluencer.profile).trimmed().replace(QChar(160), ""))); - //query.bindValue(":PROFILE_URL", ((stinfluencer.profileurl.trimmed().isEmpty())? " ", stinfluencer.profileurl.trimmed())); - query.bindValue(":PROFILE", sqlString(stinfluencer.profile).trimmed().replace(QChar(160), "")); - query.bindValue(":PROFILE_URL", stinfluencer.profileurl.trimmed()); - if (query.exec() == false) - { - m_pSInitializer->insertLog(query.lastQuery()); - m_pSInitializer->insertLog(query.lastError().text()); - return false; - } - } - - strQuery = "update dbinfo set influencercount = " + QString::number(m_listMap.size()) + " where company_num = " - + QString::number(_nCompany); - query.exec(strQuery); - - return true; -} -*/ - -//bool SInfluencer::STInfluencer::uploadData(QSqlDatabase &_db, const int &_nCompany) -//{ -// QString strQuery = "delete from influencer_" + QString::number(_nCompany) + "_update"; -// QSqlQuery query(_db); -// if (query.exec(strQuery.toUtf8()) == false) -// { -// m_pSInitializer->insertLog(query.lastQuery()); -// m_pSInitializer->insertLog(query.lastError().text()); -// return false; -// } -// strQuery = "insert into influencer_" + QString::number(_nCompany) + -// "_update (rank,category_num,id_num,nickname_num,community_num,bodycount,replycount, likecount, sharecount, influencervalue,profile,profileurl,id_id," -// "community_title,community_url,community_id,nickname_nickname,nickname_exnickname,platformname_num,idrankbyinteraction,platformname_name) VALUES ("; - -// query.clear(); - -// foreach (const stInfluencer& stinfluencer, m_listMap) -// { -// QString str = strQuery; -// str += QString::number(stinfluencer.rank) + ","; -// str += QString::number(stinfluencer.category_num) + ","; -// str += QString::number(stinfluencer.id_num) + ","; -// str += QString::number(stinfluencer.nickname_num) + ","; -// str += QString::number(stinfluencer.community_num) + ","; -// str += QString::number(stinfluencer.bodycount) + ","; -// str += QString::number(stinfluencer.replycount) + ","; -// str += QString::number(stinfluencer.likecount) + ","; -// str += QString::number(stinfluencer.sharecount) + ","; -// str += QString::number(stinfluencer.influencervalue, 'g', 3) + ","; -// str += "'" + sqlString(stinfluencer.profile).trimmed().replace(QChar(160), "") + "',"; -// str += "'" + sqlString(stinfluencer.profileurl.trimmed()) + "',"; -// str += "'" + sqlString(stinfluencer.id_id) + "',"; -// str += "'" + sqlString(stinfluencer.community_title) + "',"; -// str += "'" + sqlString(stinfluencer.community_url) + "',"; -// str += "'" + sqlString(stinfluencer.community_id) + "',"; -// str += "'" + sqlString(stinfluencer.nickname_nickname) + "',"; -// str += "'" + sqlString(stinfluencer.nickname_exnickname) + "',"; -// str += QString::number(stinfluencer.platformname_num) + ","; -//str += "'" + sqlString(stinfluencer.interactionrank) + "',"; -// str += "'" + sqlString(stinfluencer.platformname_name) + "')"; - -// if (query.exec(str.toUtf8()) == false) -// { -// m_pSInitializer->insertLog(query.lastQuery()); -// m_pSInitializer->insertLog(query.lastError().text()); -// return false; -// } -// } - -// strQuery = "update dbinfo set influencercount = " + QString::number(m_listMap.size()) + " where company_num = " -// + QString::number(_nCompany); -// query.exec(strQuery); - -// return true; -//} - bool SInfluencer::STInfluencer::uploadData(QSqlDatabase &_db, const int &_nCompany) { QString strQuery = "delete from influencer_" + QString::number(_nCompany) + "_update"; @@ -531,94 +381,39 @@ bool SInfluencer::STInfluencer::uploadData(QSqlDatabase &_db, const int &_nCompa query.clear(); - QMapIterator> iter1(m_mapInfluencerOfCategory); - while (iter1.hasNext()) + foreach (const stInfluencer& stinfluencer, m_listMap) { - iter1.next(); - const QList& listInfluencer = iter1.value(); - foreach (stInfluencer stinfluencer, listInfluencer) + QString str = strQuery; + str += QString::number(stinfluencer.rank) + ","; + str += QString::number(stinfluencer.category_num) + ","; + str += QString::number(stinfluencer.id_num) + ","; + str += QString::number(stinfluencer.nickname_num) + ","; + str += QString::number(stinfluencer.community_num) + ","; + str += QString::number(stinfluencer.bodycount) + ","; + str += QString::number(stinfluencer.replycount) + ","; + str += QString::number(stinfluencer.likecount) + ","; + str += QString::number(stinfluencer.sharecount) + ","; + str += QString::number(stinfluencer.influencervalue, 'g', 3) + ","; + str += "'" + sqlString(stinfluencer.profile).trimmed().replace(QChar(160), "") + "',"; + str += "'" + sqlString(stinfluencer.profileurl.trimmed()) + "',"; + str += "'" + sqlString(stinfluencer.id_id) + "',"; + str += "'" + sqlString(stinfluencer.community_title) + "',"; + str += "'" + sqlString(stinfluencer.community_url) + "',"; + str += "'" + sqlString(stinfluencer.community_id) + "',"; + str += "'" + sqlString(stinfluencer.nickname_nickname) + "',"; + str += "'" + sqlString(stinfluencer.nickname_exnickname) + "',"; + str += QString::number(stinfluencer.platformname_num) + ","; + str += "'" + sqlString(stinfluencer.interactionrank) + "',"; + str += "'" + sqlString(stinfluencer.platformname_name) + "')"; + + if (query.exec(str.toUtf8()) == false) { - QString str = strQuery; - str += QString::number(stinfluencer.rank) + ","; - str += QString::number(stinfluencer.category_num) + ","; - str += QString::number(stinfluencer.id_num) + ","; - str += QString::number(stinfluencer.nickname_num) + ","; - str += QString::number(stinfluencer.community_num) + ","; - str += QString::number(stinfluencer.bodycount) + ","; - str += QString::number(stinfluencer.replycount) + ","; - str += QString::number(stinfluencer.likecount) + ","; - str += QString::number(stinfluencer.sharecount) + ","; - str += QString::number(stinfluencer.influencervalue, 'g', 3) + ","; - str += "'" + sqlString(stinfluencer.profile).trimmed().replace(QChar(160), "") + "',"; - str += "'" + sqlString(stinfluencer.profileurl.trimmed()) + "',"; - str += "'" + sqlString(stinfluencer.id_id) + "',"; - str += "'" + sqlString(stinfluencer.community_title) + "',"; - str += "'" + sqlString(stinfluencer.community_url) + "',"; - str += "'" + sqlString(stinfluencer.community_id) + "',"; - str += "'" + sqlString(stinfluencer.nickname_nickname) + "',"; - str += "'" + sqlString(stinfluencer.nickname_exnickname) + "',"; - str += QString::number(stinfluencer.platformname_num) + ","; - str += "'" + sqlString(stinfluencer.interactionrank) + "',"; - str += "'" + sqlString(stinfluencer.platformname_name) + "')"; - - if (query.exec(str.toUtf8()) == false) - { - m_pSInitializer->insertLog(query.lastQuery()); - m_pSInitializer->insertLog(query.lastError().text()); - return false; - } - - + m_pSInitializer->insertLog(query.lastQuery()); + m_pSInitializer->insertLog(query.lastError().text()); + return false; } } - -// foreach (const stInfluencer& stinfluencer, m_listMap) -// { -// QString str = strQuery; -// str += QString::number(stinfluencer.rank) + ","; -// str += QString::number(stinfluencer.category_num) + ","; -// str += QString::number(stinfluencer.id_num) + ","; -// str += QString::number(stinfluencer.nickname_num) + ","; -// str += QString::number(stinfluencer.community_num) + ","; -// str += QString::number(stinfluencer.bodycount) + ","; -// str += QString::number(stinfluencer.replycount) + ","; -// str += QString::number(stinfluencer.likecount) + ","; -// str += QString::number(stinfluencer.sharecount) + ","; -// str += QString::number(stinfluencer.influencervalue, 'g', 3) + ","; -// str += "'" + sqlString(stinfluencer.profile).trimmed().replace(QChar(160), "") + "',"; -// str += "'" + sqlString(stinfluencer.profileurl.trimmed()) + "',"; -// str += "'" + sqlString(stinfluencer.id_id) + "',"; -// str += "'" + sqlString(stinfluencer.community_title) + "',"; -// str += "'" + sqlString(stinfluencer.community_url) + "',"; -// str += "'" + sqlString(stinfluencer.community_id) + "',"; -// str += "'" + sqlString(stinfluencer.nickname_nickname) + "',"; -// str += "'" + sqlString(stinfluencer.nickname_exnickname) + "',"; -// str += QString::number(stinfluencer.platformname_num) + ","; -//str += "'" + sqlString(stinfluencer.interactionrank) + "',"; -// str += "'" + sqlString(stinfluencer.platformname_name) + "')"; - -// if (query.exec(str.toUtf8()) == false) -// { -// m_pSInitializer->insertLog(query.lastQuery()); -// m_pSInitializer->insertLog(query.lastError().text()); -// return false; -// } -// } - - - - -// strQuery = "delete from influencer_" + QString::number(_nCompany) + "_update " + -// "where rank < " + m_pSInitializer->getInfluencerLimitFrom() + " or rank > " + m_pSInitializer->getInfluencerLimitTo(); -// if (query.exec(strQuery.toUtf8()) == false) -// { -// m_pSInitializer->insertLog(query.lastQuery()); -// m_pSInitializer->insertLog(query.lastError().text()); -// return false; -// } - - strQuery = "select count(*) from influencer_" + QString::number(_nCompany) + "_update"; if (query.exec(strQuery.toUtf8()) == false) { @@ -657,6 +452,209 @@ m_pSInitializer->insertLog("influencer_" + QString::number(_nCompany) + " rename return true; } +int SInfluencer::STInfluencer::getInfluencerGroupNum(int _nCategoryNum) +{ + QMapIterator> iter(m_mapInfluencerGroupInfo); + while (iter.hasNext()) + { + iter.next(); + + int nGroupNum = iter.key(); + QList listCategoryInfo = iter.value(); + for (int i=0; i>> iter(m_mapInfluencerOfGroup); + while (iter.hasNext()) + { + iter.next(); + + SInfluencerWeight influencerWeight; + QMutableMapIterator> iter2(iter.value()); + while (iter2.hasNext()) + { + QList &listInfluencer = iter2.next().value(); + for (QList::iterator iter3 = listInfluencer.begin(); iter3 != listInfluencer.end(); iter3++) + { + influencerWeight.insert(*iter3); + } + + influencerWeight.calculateWeight(); + + for (QList::iterator iter3 = listInfluencer.begin(); iter3 != listInfluencer.end(); iter3++) + { + iter3->influencervalue = influencerWeight.getInfluenceValue(*iter3); + } + } + } +} + +void SInfluencer::STInfluencer::processDuplicatedInfluencer() +{ + QMutableMapIterator>> iter(m_mapInfluencerOfGroup); + while (iter.hasNext()) + { + iter.next(); + + QMap> mapInfluencerValuesOfId = makeInfluencerValuesOfId(iter.value()); + QMap> mapFilteredInfluencerValuesOfId = filterInfluencerValuesOfId(mapInfluencerValuesOfId); + sortInfluencerValuesOfId(mapFilteredInfluencerValuesOfId); + + setDuplicatedInfluencerFlag(iter.value(), mapFilteredInfluencerValuesOfId); + } +} + +QMap> SInfluencer::STInfluencer::makeInfluencerValuesOfId(QMap> &_mapInfluencersOfCategory) +{ + QMap> mapInfluencerValuesOfId; + + QMutableMapIterator> iter(_mapInfluencersOfCategory); + while (iter.hasNext()) + { + iter.next(); + + QList &listInfluencer = iter.value(); + for (QList::iterator iter2 = listInfluencer.begin(); iter2 != listInfluencer.end(); iter2++) + { + mapInfluencerValuesOfId[iter2->id_id].append(iter2->influencervalue); + } + } + + return mapInfluencerValuesOfId; +} + +QMap> SInfluencer::STInfluencer::filterInfluencerValuesOfId(QMap> &_mapInfluencerValuesOfId) +{ + QMap> mapFilteredInfluencerValuesOfId; + + QMutableMapIterator> iter(_mapInfluencerValuesOfId); + while (iter.hasNext()) + { + iter.next(); + + QString id = iter.key(); + QList &listValue = iter.value(); + if (listValue.count() <= 1) + continue; + + mapFilteredInfluencerValuesOfId[id].append(listValue); + } + + return mapFilteredInfluencerValuesOfId; +} + +void SInfluencer::STInfluencer::sortInfluencerValuesOfId(QMap> &_mapInfluencerValuesOfId) +{ + QMutableMapIterator> iter(_mapInfluencerValuesOfId); + while (iter.hasNext()) + { + iter.next(); + + QList &listValue = iter.value(); + qSort(listValue.begin(), listValue.end(), qGreater()); + } +} + +void SInfluencer::STInfluencer::copyInfluencerFromGroupToList() +{ + m_listMap.clear(); + + QMapIterator>> iter(m_mapInfluencerOfGroup); + while (iter.hasNext()) + { + iter.next(); + + QMapIterator> iter2(iter.value()); + while (iter2.hasNext()) + { + iter2.next(); + + m_listMap.append(iter2.value()); + } + } +} + +void SInfluencer::STInfluencer::sortInfluencerByValue() +{ + QMutableMapIterator>> iter(m_mapInfluencerOfGroup); + while (iter.hasNext()) + { + iter.next(); + + QMutableMapIterator> iter2(iter.value()); + while (iter2.hasNext()) + { + iter2.next(); + + QList &listInfluencer = iter2.value(); + qSort(listInfluencer.begin(), listInfluencer.end(), isGreaterInfluencerValue()); + } + } +} + +void SInfluencer::STInfluencer::setInfluecnerRank() +{ + sortInfluencerByValue(); + + QMutableMapIterator>> iter(m_mapInfluencerOfGroup); + while (iter.hasNext()) + { + iter.next(); + + QMutableMapIterator> iter2(iter.value()); + while (iter2.hasNext()) + { + QList &listInfluencer = iter2.next().value(); + + int rank = 1; + for (QList::iterator iter3 = listInfluencer.begin(); iter3 != listInfluencer.end(); iter3++) + { + iter3->rank = rank++; + } + } + } +} + +void SInfluencer::STInfluencer::setDuplicatedInfluencerFlag(QMap> &_mapInfluencersOfCategory, QMap> &_mapInfluencerValuesOfId) +{ + QMutableMapIterator> iter(_mapInfluencersOfCategory); + while (iter.hasNext()) + { + iter.next(); + + QList &listInfluencer = iter.value(); + for (QList::iterator iter2 = listInfluencer.begin(); iter2 != listInfluencer.end(); iter2++) + { + QString id = iter2->id_id; + if (!_mapInfluencerValuesOfId.contains(id)) + continue; + + double fValue = iter2->influencervalue; + double fMaxValue = _mapInfluencerValuesOfId[id].first(); + + if (fMaxValue == fValue && fMaxValue >= 0) + { + iter2->isSelected = "true"; + _mapInfluencerValuesOfId[id][0] = -1; + } + else + { + iter2->isSelected = "false"; + } + } + } +} + void SInfluencer::SStatsInfBloggerRank::makeTable(SDatagroup &_datagroup, const QMap& _mapCategory) { const QMap* mapBody = _datagroup.getmapBody(); @@ -1348,135 +1346,6 @@ struct stDate stDate():dStart(2020, 1, 1), dEnd(1990, 1, 1){} }; - -//void SInfluencer::SStatsJson::makeTable(SDatagroup &_datagroup, const QMap &_mapCategory) -//{ -// const QMap* mapBody = _datagroup.getmapBody(); -// const QMap >* mapReply = _datagroup.getmapReply(); -// const int* anColumn = m_pSInitializer->getColumnIntArray(); -// const QStringList *slOrderedUrl = _datagroup.getOrderedUrl(); - -// QMap mapCount; -// QMap mapBodyDate; - -// foreach (const QString& strUrl, *slOrderedUrl) -// { -// if (mapBody->contains(strUrl)) -// { -// QString strKey = (*mapBody)[strUrl][anColumn[SInitializer::E_DATA_platform_name]].trimmed() + strSeparator + (*mapBody)[strUrl][anColumn[SInitializer::E_DATA_platform_form]].trimmed(); -// if (!mapCount.contains(strKey)) -// mapCount.insert(strKey, stCount()); - -// mapCount[strKey].body += 1; -// mapCount[strKey].id.insert((*mapBody)[strUrl][anColumn[SInitializer::E_DATA_article_id]].trimmed()); - -// if (mapReply->contains(strUrl)) -// mapCount[strKey].reply += (*mapReply)[strUrl].size(); - -// if (!mapBodyDate.contains(strKey)) -// mapBodyDate.insert(strKey, stDate()); -// QDate dBodyDate = QDateTime::fromString((*mapBody)[strUrl][anColumn[SInitializer::E_DATA_article_date]].trimmed().replace("T", " "), "yyyy-MM-dd hh:mm:ss").date(); -// mapBodyDate[strKey].dStart = (mapBodyDate.value(strKey).dStart < dBodyDate) ? mapBodyDate.value(strKey).dStart : dBodyDate; -// mapBodyDate[strKey].dEnd = (mapBodyDate.value(strKey).dEnd > dBodyDate) ? mapBodyDate.value(strKey).dEnd : dBodyDate; -// } -// } - -// QSet setRealAllUrl; - -// for (QMap::const_iterator iterPos = _mapCategory.constBegin(); iterPos != _mapCategory.constEnd(); iterPos++) -// { -// stStatsJson ststatsjson; -// ststatsjson.category_num = iterPos.key(); -// ststatsjson.platformname_num = 1; -// ststatsjson.servicenum = 1; -// ststatsjson.title = "info"; -// ststatsjson.subtitle = ""; - -// const stReal& streal = iterPos.value(); -// QSet setPlatformType; - -// foreach (const QString& strUrl, streal.m_setRealAllUrl) -// { -// if (mapBody->contains(strUrl)) -// setPlatformType.insert((*mapBody)[strUrl][anColumn[SInitializer::E_DATA_platform_name]].trimmed() + strSeparator + (*mapBody)[strUrl][anColumn[SInitializer::E_DATA_platform_form]].trimmed()); -// setRealAllUrl.insert(strUrl); -// } - -// unsigned int nBody = 0; -// unsigned int nUser = 0; -// QJsonObject jsonObj; - -// foreach (const QString& strKey, setPlatformType) -// { -// if (strKey == "naver!@#blog") -// { -// nBody += ((mapBodyDate.value(strKey).dStart.daysTo(mapBodyDate.value(strKey).dEnd) + 1) * 1000); -// if (setPlatformType.size() == 1) -// jsonObj["pagenum"] = m_pSInitializer->getBlogPageNum(); -// } -// else -// { -// nBody += mapCount[strKey].body; -// } - -// nUser += mapCount[strKey].id.size(); -// } - -// unsigned int nTotalCount = nBody; -// jsonObj["totalcount"] = static_cast(nTotalCount); -// jsonObj["totalusercount"] = static_cast(nUser); -// if (!jsonObj.contains("pagenum")) -// jsonObj["pagenum"] = -1; -// QJsonDocument jsonDoc(jsonObj); -// ststatsjson.jdata = jsonDoc.toJson(); -// m_listMap.append(ststatsjson); -// } - -// { -// stStatsJson ststatsjson; -// ststatsjson.category_num = -1; -// ststatsjson.platformname_num = 1; -// ststatsjson.servicenum = 1; -// ststatsjson.title = "info"; -// ststatsjson.subtitle = ""; - -// QSet setPlatformType; - -// foreach (const QString& strUrl, setRealAllUrl) -// { -// if (mapBody->contains(strUrl)) -// setPlatformType.insert((*mapBody)[strUrl][anColumn[SInitializer::E_DATA_platform_name]].trimmed() + strSeparator + (*mapBody)[strUrl][anColumn[SInitializer::E_DATA_platform_form]].trimmed()); -// } - -// unsigned int nBody = 0; -// unsigned int nUser = 0; -// QJsonObject jsonObj; - -// foreach (const QString& strKey, setPlatformType) -// { -// if (strKey == "naver!@#blog") -// { -// nBody += ((mapBodyDate.value(strKey).dStart.daysTo(mapBodyDate.value(strKey).dEnd) + 1) * 1000); -// if (setPlatformType.size() == 1) -// jsonObj["pagenum"] = m_pSInitializer->getBlogPageNum(); -// } -// else -// { -// nBody += mapCount[strKey].body; -// } -// nUser += mapCount[strKey].id.size(); -// } -// unsigned int nTotalCount = nBody; -// jsonObj["totalcount"] = static_cast(nTotalCount); -// jsonObj["totalusercount"] = static_cast(nUser); -// if (!jsonObj.contains("pagenum")) -// jsonObj["pagenum"] = -1; -// QJsonDocument jsonDoc(jsonObj); -// ststatsjson.jdata = jsonDoc.toJson(); -// m_listMap.append(ststatsjson); -// } -//} - void SInfluencer::SStatsJson::makeGroupStatsJson(SGroupStatistics _groupStatistics, SPlatformStatistics _platformStatistics) { QList listGroup = m_pSInitializer->getInfluencerGroup().keys(); diff --git a/FilterProcess/sinfluencer.h b/FilterProcess/sinfluencer.h index 912d452..d432f08 100644 --- a/FilterProcess/sinfluencer.h +++ b/FilterProcess/sinfluencer.h @@ -40,10 +40,12 @@ public: int platformname_num; int sharecount; int likecount; -QString interactionrank; -QMap> interactions; -int interactionsTotalReplyCount; -int interactionsTotalCount; + QString interactionrank; +QString isSelected; + QMap> interactions; + int interactionsTotalReplyCount; + int interactionsTotalCount; + stInfluencer():id_num(0),nickname_num(0),community_num(0),category_num(0),bodycount(0),replycount(0),rank(0),influencervalue(0.0),platformname_num(0), sharecount(0), likecount(0), interactionsTotalReplyCount(0), interactionsTotalCount(0) {} @@ -117,6 +119,8 @@ int interactionsTotalCount; SInitializer *m_pSInitializer; QList m_listMap; QMap> m_mapInfluencerOfCategory; +QMap> m_mapInfluencerGroupInfo; +QMap>> m_mapInfluencerOfGroup; public: void setInitiaizer(SInitializer &_initializer){ m_pSInitializer = &_initializer; } void makeTable(SDatagroup &_datagroup, const QMap& _mapCategory); @@ -127,6 +131,16 @@ int interactionsTotalCount; QList& getInfluencerList(); int getInfluencerCount(); QMap getInfluencerCountOfPlatform(); +int getInfluencerGroupNum(int _nCategoryNum); +void setInfluencerValueWieght(); +void processDuplicatedInfluencer(); +QMap> makeInfluencerValuesOfId(QMap> &_mapInfluencersOfCategory); +QMap> filterInfluencerValuesOfId(QMap> &_mapInfluencerValuesOfId); +void sortInfluencerValuesOfId(QMap> &_mapInfluencerValuesOfId); +void copyInfluencerFromGroupToList(); +void sortInfluencerByValue(); +void setInfluecnerRank(); +void setDuplicatedInfluencerFlag(QMap> &_mapInfluencersOfCategory, QMap> &_mapInfluencerValuesOfId); }; class SStatsInfBloggerRank diff --git a/FilterProcess/sinitializer.h b/FilterProcess/sinitializer.h index 331a5d1..ee5b1dc 100644 --- a/FilterProcess/sinitializer.h +++ b/FilterProcess/sinitializer.h @@ -199,7 +199,7 @@ private: int m_nBlogPageNum; QMap m_mapConsumerMaketers; QMap m_mapConsumerCheckListUser; - QMap> m_mapInfluencerGroup; + QMap > m_mapInfluencerGroup; QStringList m_slConsumerCheckList; bool m_bUpload; bool m_bDebug; @@ -243,7 +243,7 @@ public: QStringList getConsumerCheckList(); QMap getConsumerCheckListUser(); bool isUpload(); - QMap> getInfluencerGroup(); + QMap > getInfluencerGroup(); QString getInfluencerLimitFrom(); QString getInfluencerLimitTo(); //bool disableIndex(QSqlDatabase& db, QString _tableName, QStringList _strIndexNames, int _nMode = MODE);