Commit 4f450b8d authored by armin's avatar armin
Browse files

Merge branch 'fasterChannelInsert' into 'master'

faster insertion of channels into view

See merge request !126
parents 5a15fd3b f55f8044
......@@ -58,8 +58,9 @@ QVariant ChannelModel::data( const QModelIndex &index, int role ) const
if ( message->getMessageType() == QStringLiteral( "file" ) || message->getMessageType() == QStringLiteral( "image" ) || message->getMessageType() == QStringLiteral( "audio" ) ) {
return tr( QByteArrayLiteral( "file upload" ) );
}
auto messageText =message->getMessageString();
messageText = messageText.replace("<img height='20' width='20'","<img height='10' width='10'");
auto messageText = message->getMessageString();
messageText = messageText.replace( "<img height='20' width='20'", "<img height='10' width='10'" );
return messageText;
}
......@@ -147,13 +148,15 @@ bool ChannelModel::addChannel( const QSharedPointer<RocketChatChannel> &channel
connect( channel.data(), &RocketChatChannel::unreadMessagesChanged, this, &ChannelModel::onUnreadMessageChanged, Qt::UniqueConnection );
connect( channel.data(), &RocketChatChannel::dataChanged, this, &ChannelModel::onDataChanged, Qt::UniqueConnection );
connect( channel.data(), &RocketChatChannel::channelDeleted, this, &ChannelModel::onDeleted, Qt::UniqueConnection );
connect(channel.data(), &RocketChatChannel::updatedChanged, this, &ChannelModel::onChannelOrderChanged);
connect( channel.data(), &RocketChatChannel::updatedChanged, this, &ChannelModel::onChannelOrderChanged );
duplicateCheck.insert( channel->getRoomId() );
int pos = channelList.findPosition( channel );
if(pos <0){
if ( pos < 0 ) {
pos = 0;
}
beginInsertRows( QModelIndex(), pos, pos );
channelList.insertSort( channel );
endInsertRows();
......@@ -165,32 +168,35 @@ bool ChannelModel::addChannel( const QSharedPointer<RocketChatChannel> &channel
}
bool ChannelModel::addChannelsSlot(const QVector<QSharedPointer<RocketChatChannel> > &pChannels)
bool ChannelModel::addChannelsSlot( const QVector<QSharedPointer<RocketChatChannel> > &pChannels )
{
// beginResetModel();
int from =-1;
int from = -1;
int to = -1;
for(const auto &channel: pChannels){
if ( !channel.isNull() && channel->getRoomId() != "" && !duplicateCheck.contains( channel->getRoomId() ) ) {
for ( const auto &channel : pChannels ) {
if ( !channel.isNull() && !channel->getRoomId().isEmpty() && !duplicateCheck.contains( channel->getRoomId() ) ) {
//connect( channel.data(), &RocketChatChannel::messageAdded, this, &ChannelModel::onNewerMessage, Qt::UniqueConnection );
connect( channel.data(), &RocketChatChannel::unreadMessagesChanged, this, &ChannelModel::onUnreadMessageChanged, Qt::UniqueConnection );
connect( channel.data(), &RocketChatChannel::dataChanged, this, &ChannelModel::onDataChanged, Qt::UniqueConnection );
connect( channel.data(), &RocketChatChannel::channelDeleted, this, &ChannelModel::onDeleted, Qt::UniqueConnection );
connect(channel.data(), &RocketChatChannel::updatedChanged, this, &ChannelModel::onChannelOrderChanged);
connect( channel.data(), &RocketChatChannel::updatedChanged, this, &ChannelModel::onChannelOrderChanged );
duplicateCheck.insert( channel->getRoomId() );
auto index = channelList.insertSort( channel );
if(from == -1){
if ( from == -1 ) {
from = index;
to = index;
}
if(index<from){
if ( index < from ) {
from = index;
}else if(index>to){
} else if ( index > to ) {
to = index;
}
}
}
beginInsertRows( QModelIndex(), from, to );
endInsertRows();
// endResetModel();
......@@ -308,14 +314,13 @@ void ChannelModel::onDeleted( const QString &pId, bool deleted )
}
void ChannelModel::onChannelOrderChanged(const QString &pId, qint64 pTimestamp)
void ChannelModel::onChannelOrderChanged( const QString &pId, qint64 pTimestamp )
{
static int counter = 0;
counter++;
qDebug() << counter;
beginResetModel();
channelList.reOrder();
endResetModel();
auto changed = channelList.reOrder();
emit dataChanged( createIndex( std::get<0>( changed ), 0 ), createIndex( std::get<1>( changed ), 0 ) );
}
void ChannelModel::addChannelSlot( const QSharedPointer<RocketChatChannel> &channel )
......
......@@ -35,13 +35,9 @@ int SortedVector<T>::insertSort( const QSharedPointer<T> &pointer )
return ( *first ) > ( *second );
} );
row = std::distance(this->begin(), elementSmallerThanNew);
row = std::distance( this->begin(), elementSmallerThanNew );
this->insert( elementSmallerThanNew, pointer );
if(row <0 || row>1000){
qDebug()<<elementSmallerThanNew;
qDebug()<<"error";
}
}
return row;
......@@ -54,7 +50,7 @@ int SortedVector<T>::findInsertPosition( const QSharedPointer<T> &pointer ) cons
return ( *first ) < ( *second );
} );
return elementSmallerThanNew - this->begin();;
return std::distance( this->begin(), elementSmallerThanNew );
}
......@@ -62,14 +58,39 @@ template<typename T>
int SortedVector<T>::findPosition( const QSharedPointer<T> &pointer ) const
{
auto pos = find( this->begin(), this->end(), pointer );
return pos - this->begin();
return std::distance( this->begin(), pos );
}
template<typename T>
void SortedVector<T>::reOrder()
std::tuple<int, int> SortedVector<T>::reOrder()
{
std::vector<QSharedPointer<T>> indices( this->size() );
for ( const auto &elem : *this ) {
indices.push_back( elem );
}
std::sort( this->begin(), this->end(), [ = ]( const QSharedPointer<T> &first, const QSharedPointer<T> &second )->bool{
return ( *first ) > ( *second );
} );
int from = -1;
int to = -1;
for ( int i = 0; i < this->size() - 1; i++ ) {
if ( indices[i] != ( *this )[i] ) {
from = i;
break;
}
}
for ( int i = this->size() - 1; i >= 0; i-- ) {
if ( indices[i] != ( *this )[i] ) {
to = i;
break;
}
}
return std::make_tuple( from, to );
}
......@@ -26,9 +26,8 @@
#include <QSharedPointer>
#include <QMutex>
struct SortedVectorProperties
{
enum class sortOrder{
struct SortedVectorProperties {
enum class sortOrder {
asc,
dsc
};
......@@ -40,14 +39,14 @@ template<typename T> class SortedVector : public QVector<QSharedPointer<T>>
int insertSort( const QSharedPointer<T> & );
int findInsertPosition( const QSharedPointer<T> & ) const;
int findPosition( const QSharedPointer<T> & ) const;
void reOrder();
std::tuple<int, int> reOrder();
bool operator =( const QVector<QSharedPointer<T>> &o )
{
this->clear();
this->append( o );
return true;
}
private:
private:
mutable QMutex mSortMutex;
};
#include "sortedvector.cpp"
......
......@@ -83,7 +83,7 @@ const QString &RocketChatChannel::getName() const
void RocketChatChannel::setName( const QString &value )
{
if ( mName != value ) {
if ( mName != value && !value.isEmpty() ) {
mName = value;
emit dataChanged( mName, "name" );
}
......@@ -167,9 +167,11 @@ QList<QSharedPointer<RocketChatMessage>> RocketChatChannel::addMessages( const Q
}
}
}
if(newMessages.count()){
if ( newMessages.count() ) {
// emit messageAdded( getRoomId(), 0 );
}
return newMessages;
}
......@@ -192,7 +194,8 @@ unsigned int RocketChatChannel::getUnreadMessages() const
void RocketChatChannel::setUnreadMessages( unsigned int value )
{
qDebug() << "set unread to: " << value;
if(mUnreadMessages != value){
if ( mUnreadMessages != value ) {
mUnreadMessages = value;
emit unreadMessagesChanged( mRoomId, value );
}
......@@ -205,7 +208,7 @@ const QString &RocketChatChannel::getType() const
void RocketChatChannel::setType( const QString &pType )
{
if ( mType != pType ) {
if ( mType != pType && !pType.isEmpty() ) {
mType = pType;
emit dataChanged( mRoomId, "type" );
}
......@@ -290,7 +293,7 @@ const QString &RocketChatChannel::getOwnerName() const
void RocketChatChannel::setOwnerName( const QString &pOwner )
{
if ( mOwnerName != pOwner ) {
if ( mOwnerName != pOwner && !pOwner.isEmpty() ) {
mOwnerName = pOwner;
emit dataChanged( mRoomId, "ownerName" );
}
......@@ -303,7 +306,7 @@ const QString &RocketChatChannel::getOwnerId() const
void RocketChatChannel::setOwnerId( const QString &ownerId )
{
if ( mOwnerId != ownerId ) {
if ( mOwnerId != ownerId && !ownerId.isEmpty() ) {
mOwnerId = ownerId;
emit dataChanged( mRoomId, "ownerId" );
}
......@@ -316,7 +319,7 @@ const QString &RocketChatChannel::getUsername() const
void RocketChatChannel::setUsername( const QString &username )
{
if ( mUsername != username ) {
if ( mUsername != username && !username.isEmpty() ) {
mUsername = username;
emit dataChanged( mRoomId, "username" );
}
......@@ -329,7 +332,7 @@ const QSharedPointer<RocketChatUser> &RocketChatChannel::getChatPartner() const
void RocketChatChannel::setChatPartner( const QSharedPointer<RocketChatUser> &chatPartner )
{
if(mChatPartner != chatPartner){
if ( mChatPartner != chatPartner && !chatPartner.isNull() ) {
mChatPartner = chatPartner;
connect( chatPartner.data(), &RocketChatUser::statusChanged, this, [ = ]() {
emit dataChanged( mRoomId, "userStatus" );
......@@ -344,7 +347,7 @@ const QString &RocketChatChannel::getChatPartnerId() const
void RocketChatChannel::setChatPartnerId( const QString &chatPartnerId )
{
if ( mChatPartnerId != chatPartnerId ) {
if ( mChatPartnerId != chatPartnerId && !chatPartnerId.isEmpty() ) {
mChatPartnerId = chatPartnerId;
// emit dataChanged( mRoomId, "username" );
}
......@@ -357,7 +360,7 @@ QSharedPointer<TempFile> RocketChatChannel::getAvatarImg() const
void RocketChatChannel::setAvatarImg( const QSharedPointer<TempFile> &pAvatar )
{
if ( mAvatarImg != pAvatar ) {
if ( mAvatarImg != pAvatar && !pAvatar.isNull() ) {
mAvatarImg = pAvatar;
emit dataChanged( mRoomId, "avatarImg" );
}
......@@ -371,10 +374,11 @@ qint64 RocketChatChannel::getUpdatedAt() const
void RocketChatChannel::setUpdatedAt( const qint64 &updatedAt )
{
//skip signal the first time
if(mUpdatedAt != updatedAt && updatedAt != -1){
if(mUpdatedAt != -1 ){
emit updatedChanged(mRoomId,updatedAt);
if ( mUpdatedAt != updatedAt && updatedAt != -1 ) {
if ( mUpdatedAt != -1 ) {
emit updatedChanged( mRoomId, updatedAt );
}
mUpdatedAt = updatedAt;
}
}
......@@ -402,34 +406,39 @@ void RocketChatChannel::setBlocked( bool blocked )
}
}
QStringList RocketChatChannel::whiteList(const QList<QString> ids, const qint64 newest,const qint64 oldest)
QStringList RocketChatChannel::whiteList( const QList<QString> ids, const qint64 newest, const qint64 oldest )
{
auto idSet = ids.toSet();
auto currentList = mMessages.getElements().keys().toSet();
auto blacklist = currentList - idSet;
QList<QString> buffer = {};
std::copy_if (blacklist.begin(), blacklist.end(), std::back_inserter(buffer),
[=](const QString id){
std::copy_if( blacklist.begin(), blacklist.end(), std::back_inserter( buffer ),
[ = ]( const QString id ) {
bool keep = true;
if(mMessages.contains(id) && mMessages.get(id)->getRoomId() == getRoomId()){
auto message = mMessages.get(id);
keep = message->inTimeIntervall(newest,oldest);
if ( mMessages.contains( id ) && mMessages.get( id )->getRoomId() == getRoomId() ) {
auto message = mMessages.get( id );
keep = message->inTimeIntervall( newest, oldest );
}
return keep;
}
);
blacklist = buffer.toSet();
for(QString id : blacklist){
mMessages.remove(id);
for ( QString id : blacklist ) {
mMessages.remove( id );
}
return blacklist.toList();
}
void RocketChatChannel::deleteMessage(const QString id)
void RocketChatChannel::deleteMessage( const QString id )
{
emit messageDeleted(getRoomId(),id);
if(mMessages.contains(id)){
mMessages.remove(id);
emit messageDeleted( getRoomId(), id );
if ( mMessages.contains( id ) ) {
mMessages.remove( id );
}
......
......@@ -110,7 +110,7 @@ void MessageService::persistMessages( const MessageList &pMessage )
void MessageService::persist()
{
if(mServer){
if ( mServer ) {
mPersistanceLayer->transaction();
auto channels = mServer->getChannels();
......@@ -133,7 +133,7 @@ void MessageService::persist()
QSharedPointer<RocketChatMessage> MessageService::parseMessage( const QJsonObject &pMessageData,
bool linkify )
{
if(mServer){
if ( mServer ) {
ChatMessage message( nullptr );
QString userId = mServer->getUserId();
bool blocked = false;
......@@ -147,7 +147,7 @@ QSharedPointer<RocketChatMessage> MessageService::parseMessage( const QJsonObjec
msgString = Utils::linkiFy( msgString );
msgString = msgString.replace( QStringLiteral( "\n" ), QStringLiteral( "<br>" ) );
msgString = Utils::escapeHtml(msgString);
msgString = Utils::escapeHtml( msgString );
msgString = Utils::emojiFy( msgString, mEmojiRepo );
}
......@@ -222,7 +222,7 @@ QSharedPointer<RocketChatMessage> MessageService::parseMessage( const QJsonObjec
};
auto avatarUrl = "/avatar/" + author + ".jpg";
auto avatarRequest = QSharedPointer<FileRequest>::create( avatarUrl, "temp", then, true );
mFileService->getFileRessource( avatarRequest );
//mFileService->getFileRessource( avatarRequest );
message->setAuthor( author );
message->setFormattedDate( formattedDate );
......@@ -244,7 +244,8 @@ QSharedPointer<RocketChatMessage> MessageService::parseMessage( const QJsonObjec
if ( !blocked ) {
return message;
}
}
}
return nullptr;
}
......@@ -258,7 +259,7 @@ void MessageService::addUserToBlockList( const QString &pId )
void MessageService::addChannelToBlockList( const QString &pId )
{
if(mServer){
if ( mServer ) {
QString roomId = pId;
QString userId = mServer->getUserId();
QString otherUserId = roomId.replace( userId, "" );
......@@ -268,7 +269,7 @@ void MessageService::addChannelToBlockList( const QString &pId )
void MessageService::searchMessage( const QString &pTerm, const QString &pRoom )
{
if(mServer){
if ( mServer ) {
DdpCallback ddpSuccess = [ = ]( const QJsonObject & pResponse,
MeteorDDP * pDdp ) {
Q_UNUSED( pDdp )
......@@ -301,7 +302,7 @@ void MessageService::searchMessage( const QString &pTerm, const QString &pRoom )
void MessageService::loadHistoryFromServer( const QSharedPointer<LoadHistoryRequestContainer> &pContainer )
{
if ( !pContainer.isNull()&&mServer ) {
if ( !pContainer.isNull() && mServer ) {
auto requests = pContainer->getRequests();
pContainer->mAlredayReceived = 0;
......@@ -349,7 +350,7 @@ void MessageService::loadHistoryFromServer( const QSharedPointer<LoadHistoryRequ
auto messageObject = parseMessage( currentMessage.toObject(), true );
if ( !messageObject.isNull() && !duplicateCheck->contains( messageObject->getId() )) {
if ( !messageObject.isNull() && !duplicateCheck->contains( messageObject->getId() ) ) {
list->insert( messageObject->getRoomId(), messageObject );
duplicateCheck->insert( messageObject->getId() );
}
......@@ -575,26 +576,31 @@ QList<QSharedPointer<RocketChatAttachment>> MessageService::processAttachments(
return attachmentsList;
}
void MessageService::deleteMessagesNotInList(MessageMap *pMessages,QString pChannelId,bool pCheckForYounger)
void MessageService::deleteMessagesNotInList( MessageMap *pMessages, QString pChannelId, bool pCheckForYounger )
{
QMap<qint64,QSharedPointer<RocketChatMessage>> timeIndex;
QMap<qint64, QSharedPointer<RocketChatMessage>> timeIndex;
QList<QString> ids;
if(mServer){
auto channel = mServer->getChannels()->get(pChannelId);
for(const auto message : pMessages->values(pChannelId)){
if ( mServer ) {
auto channel = mServer->getChannels()->get( pChannelId );
for ( const auto message : pMessages->values( pChannelId ) ) {
timeIndex[message->getTimestamp()] = message;
ids.append(message->getId());
ids.append( message->getId() );
}
qint64 oldest = timeIndex.first()->getTimestamp();
qint64 newest = timeIndex.last()->getTimestamp();
qint64 youngest = channel->getYoungestMessage()->getTimestamp();
if(pCheckForYounger)
if ( pCheckForYounger ) {
newest = newest < youngest ? youngest : newest;
}
auto blacklist = channel->whiteList( ids, newest, oldest );
auto blacklist = channel->whiteList(ids,newest,oldest);
for(QString messageId : blacklist){
mPersistanceLayer->deleteMessage(messageId);
for ( QString messageId : blacklist ) {
mPersistanceLayer->deleteMessage( messageId );
}
}
}
......@@ -38,7 +38,7 @@ RocketChatChannelService::RocketChatChannelService( QObject *parent, RocketChatS
QSharedPointer<RocketChatChannel> RocketChatChannelService::createChannelObject( const QString &pRoomId, const QString &pName, const QString &pType, bool insertIntoRepo )
{
if(mServer){
if ( mServer ) {
auto ptr = QSharedPointer<RocketChatChannel>::create( mServer, mMessageService, pRoomId, pName, pType );
if ( Q_LIKELY( mChannels ) ) {
......@@ -50,14 +50,14 @@ QSharedPointer<RocketChatChannel> RocketChatChannelService::createChannelObject(
fillChannelWithMessages( ptr );
return ptr;
}else{
} else {
return nullptr;
}
}
QSharedPointer<RocketChatChannel> RocketChatChannelService::createChannelObject( const QString &pRoomId, const QString &pName, const QString &pType, const QString &pUsername, bool insertIntoRepo )
{
if(mServer){
if ( mServer ) {
auto ptr = QSharedPointer<RocketChatChannel>::create( mServer, mMessageService, pRoomId, pName, pType );
if ( pType == "d" ) {
......@@ -73,16 +73,16 @@ QSharedPointer<RocketChatChannel> RocketChatChannelService::createChannelObject(
}
//TODO: this should not be done here!
if (insertIntoRepo && Q_LIKELY( mChannels ) ) {
if ( insertIntoRepo && Q_LIKELY( mChannels ) ) {
mChannels->add( ptr );
} else {
} else if ( !mChannels ) {
qCritical() << "Channelsrepo not available to ChannelService";
}
fillChannelWithMessages( ptr );
return ptr;
}else{
} else {
return nullptr;
}
}
......@@ -92,7 +92,7 @@ QVector<QSharedPointer<RocketChatChannel> > RocketChatChannelService::processCha
{
QVector<QSharedPointer<RocketChatChannel> > vec;
if(mServer){
if ( mServer ) {
std::tuple<QString, QString> openChannelTupel = mStorage->getCurrentChannel();
QString openChannel = std::get<0>( openChannelTupel );
mStorage->transaction();
......@@ -216,7 +216,7 @@ QVector<QSharedPointer<RocketChatChannel> > RocketChatChannelService::processCha
}
mStorage->askForcommit();
}
}
return vec;
}
......@@ -295,7 +295,7 @@ void RocketChatChannelService::loadJoinedChannelsFromDb()
channelPointer->setReadOnly( roomHash["readOnly"].toBool() );
channelPointer->setJoined( roomHash["joined"].toBool() );
channelPointer->setChatPartnerId( roomHash["chatPartnerId"].toString() );
channelPointer->setUpdatedAt(roomHash["updatedAt"].toLongLong());
channelPointer->setUpdatedAt( roomHash["updatedAt"].toLongLong() );
if ( channelPointer->getType() == "d" ) {
auto user = users->getUserById( channelPointer->getChatPartnerId() );
......@@ -316,18 +316,20 @@ void RocketChatChannelService::loadJoinedChannelsFromDb()
}
channels.append( channelPointer );
if(channelPointer->getType() == "p"){
channelsP.append(channelPointer);
}else if(channelPointer->getType() == "c"){
channelsC.append(channelPointer);
}else if(channelPointer->getType() == "d"){
channelsD.append(channelPointer);
if ( channelPointer->getType() == "p" ) {
channelsP.append( channelPointer );
} else if ( channelPointer->getType() == "c" ) {
channelsC.append( channelPointer );
} else if ( channelPointer->getType() == "d" ) {
channelsD.append( channelPointer );
}
}
}
mChannels->add("p",channelsP);
mChannels->add("c",channelsC);
mChannels->add("d",channelsD);
mChannels->add( "p", channelsP );
mChannels->add( "c", channelsC );
mChannels->add( "d", channelsD );
emit channelsLoaded( channels, true );
}
}
......@@ -505,7 +507,9 @@ ChannelRepository *RocketChatChannelService::getChannels() const
void RocketChatChannelService::setChannels( ChannelRepository *pChannels )
{
if ( pChannels ) {
mChannels = pChannels;
}
}
void RocketChatChannelService::leaveChannel( const QString &pId )
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment