Project

General

Profile

bulkinsert2.diff

admin, 08/30/2008 11:03 PM

View differences:

home/sphilips/projects/quassel/src/client/messagemodel.cpp 2008-08-30 22:46:53.000000000 +0000
51 51
  return false;
52 52
}
53 53

  
54

  
55

  
54 56
bool MessageModel::insertMessage(const Message &msg, bool fakeMsg) {
55 57
  MsgId id = msg.msgId();
56 58
  int idx = indexForId(id);
......
66 68
  return true;
67 69
}
68 70

  
71

  
72
void MessageModel::insertMessageGroup(const QList<Message> &msglist) {
73
  if(msglist.isEmpty()) return;
74

  
75
  int idx = indexForId(msglist.first().msgId());
76
  beginInsertRows(QModelIndex(), idx, idx+msglist.count()-1);
77

  
78
  foreach(Message msg, msglist) {
79
    _messageList.insert(idx, createMessageModelItem(msg));
80
    idx++;
81
  }
82

  
83
  endInsertRows();
84
}
85

  
86

  
69 87
void MessageModel::insertMessages(const QList<Message> &msglist) {
70 88
  if(msglist.isEmpty()) return;
71
  // FIXME make this more efficient by grouping msgs
72
  foreach(Message msg, msglist)
73
    insertMessage(msg);
89

  
90
  //QTime start = QTime::currentTime();
91

  
92
  int idx = indexForId(msglist.first().msgId());
93
  QList<Message> grouplist;
94

  
95
  MsgId id = idx < _messageList.count() ? _messageList.value(idx)->data(0, MsgIdRole).value<MsgId>() : NULL;
96

  
97
  foreach(Message msg, msglist) {
98
    if (id != NULL && msg.msgId() > id) {
99
      insertMessageGroup(grouplist);
100
      idx += indexForId(msg.msgId());
101
      grouplist.clear();
102
      id = idx < _messageList.count() ? _messageList.value(idx)->data(0, MsgIdRole).value<MsgId>() : NULL;
103
    }
104
    grouplist.append(msg);
105
  }
106

  
107
  if (!grouplist.isEmpty())
108
    insertMessageGroup(grouplist);
109

  
110
  //qDebug() << "Inserted Group: " << msglist.count() << " items in " << start.msecsTo(QTime::currentTime()) << " msec";
74 111
}
75 112

  
113

  
76 114
void MessageModel::clear() {
77 115
  beginRemoveRows(QModelIndex(), 0, rowCount() - 1);
78 116
  qDeleteAll(_messageList);
......
80 118
  endRemoveRows();
81 119
}
82 120

  
121

  
83 122
// returns index of msg with given Id or of the next message after that (i.e., the index where we'd insert this msg)
84 123
int MessageModel::indexForId(MsgId id) {
85 124
  if(_messageList.isEmpty() || id <= _messageList.value(0)->data(0, MsgIdRole).value<MsgId>()) return 0;
......
119 158
  }
120 159
}
121 160

  
161

  
162
// Stuff for later
163
bool MessageModelItem::lessThan(const MessageModelItem *m1, const MessageModelItem *m2){ 
164
  return (*m1) < (*m2);
165
}
166

  
167
bool MessageModelItem::operator<(const MessageModelItem &other) const {
168
  return _msgId < other._msgId;
169
}
170

  
171
bool MessageModelItem::operator==(const MessageModelItem &other) const {
172
  return _msgId == other._msgId;
173
}
174

  
175
bool MessageModelItem::operator>(const MessageModelItem &other) const {
176
  return _msgId > other._msgId;
177
}
home/sphilips/projects/quassel/src/client/messagemodel.h 2008-08-30 22:10:12.000000000 +0000
65 65

  
66 66
  bool insertMessage(const Message &, bool fakeMsg = false);
67 67
  void insertMessages(const QList<Message> &);
68
  void insertMessageGroup(const QList<Message> &);
68 69

  
69 70
  void clear();
70 71

  
......
73 74

  
74 75
private:
75 76
  QList<MessageModelItem *> _messageList;
76

  
77 77
  int indexForId(MsgId);
78 78
};
79 79

  
......
96 96
  inline Message::Type msgType() const { return _type; }
97 97
  inline Message::Flags msgFlags() const { return _flags; }
98 98
  
99
  // For sorting
100
  bool operator<(const MessageModelItem &) const;
101
  bool operator==(const MessageModelItem &) const;
102
  bool operator>(const MessageModelItem &) const;
103
  static bool lessThan(const MessageModelItem *m1, const MessageModelItem *m2);
104

  
99 105
private:
100 106
  QDateTime _timestamp;
101 107
  MsgId _msgId;