in holo-client/src/main/java/com/alibaba/hologres/client/impl/collector/RecordCollector.java [73:166]
public boolean append(Record record) {
if (startTimeMs == -1) {
startTimeMs = System.currentTimeMillis();
}
Map<RecordKey, Record> recordMap = records;
Map<RecordKey, Record> deleteMap = deleteRecords;
RecordKey key = new RecordKey(record);
Record origin = recordMap.get(key);
if (origin != null) {
switch (record.getType()) {
case DELETE:
Record deleteRecord = deleteMap.get(key);
/*
* 如果delete列表没有这个key
* record.attachmentList=origin.attachmentList+record.attachmentList
* 否则
* record.attachmentList=deleteRecord.attachmentList+origin.attachmentList+record.attachmentList
* */
if (null != deleteRecord) {
size += -1;
byteSize -= deleteRecord.getByteSize();
origin.cover(deleteRecord);
}
record.cover(origin);
recordMap.remove(key);
byteSize -= origin.getByteSize();
byteSize += record.getByteSize();
deleteMap.put(key, record);
break;
case INSERT:
switch (mode) {
case INSERT_OR_UPDATE:
byteSize -= origin.getByteSize();
origin.merge(record);
byteSize += origin.getByteSize();
origin.setType(Put.MutationType.INSERT);
break;
case INSERT_OR_IGNORE:
origin.addAttachmentList(record.getAttachmentList());
break;
case INSERT_OR_REPLACE:
record.cover(origin);
byteSize -= origin.getByteSize();
byteSize += record.getByteSize();
recordMap.put(key, record);
break;
default:
break;
}
break;
default:
break;
}
} else {
Record baseRecord;
switch (record.getType()) {
case DELETE:
baseRecord = deleteMap.get(key);
if (baseRecord == null) {
size += 1;
} else {
byteSize -= baseRecord.getByteSize();
record.cover(baseRecord);
}
byteSize += record.getByteSize();
deleteMap.put(key, record);
break;
case INSERT:
byteSize += record.getByteSize();
recordMap.put(key, record);
if (mode == WriteMode.INSERT_OR_REPLACE) {
baseRecord = deleteMap.get(key);
if (baseRecord == null) {
size += 1;
} else {
byteSize -= baseRecord.getByteSize();
record.cover(baseRecord);
deleteMap.remove(key);
}
} else {
++size;
}
break;
default:
break;
}
}
BatchState bs = getBatchState();
if (bs != BatchState.NotEnough) {
return true;
}
return false;
}