此博客用于个人学习,来源于网上,对知识点进行一个整理。
1. 索引操作:
我们之前实现了将数据库中的索引信息导入到文件中, 目的是在检索的过程中实现数据的加载,构造全量索引。 但是由于写入文件的数据格式和索引的数据格式不一样,于是我们要定义好索引的操作。但由于我们之前定义了索引的增删改查方法,于是我们只需要直接调用就可以实现从文件中获取信息构造全量索引。
1.1 索引操作 handler 的定义与说明:
定义一个枚举,对应索引的操作类型。
public enum OpType {
ADD,
UPDATE,
DELETE,
OTHER;
}
由于我们定义的索引方法都需要一个 key-value 的键值对的形式,于是我们在这个操作类中也需要这样子定义。
/**
* 1. 索引之间存在着层级的划分,也就是依赖关系的划分
* 2. 加载全量索引其实是增量索引 “增加” 的一种特殊实现
*/
@Slf4j
public class AdLevelDataHandler {
private static <K,V> void handleBinlogEvent(IndexAware<K,V> index, K key, V value, OpType type){
switch (type){
case ADD:
index.add(key, value);
break;
case UPDATE:
index.update(key, value);
break;
case DELETE:
index.delete(key, value);
break;
default:
break;
}
}
}
1.2 定义第二层级的索引操作:
由于广告计划和广告创意并没有依赖于其他索引,于是将其定义为第二层级的索引,先构建这两个索引对应的方法。逻辑为:通过索引表数据构建索引对象,调用之前定义的索引操作。
public static void handleLevel2(AdPlanTable planTable,OpType type){
AdPlanObject planObject = new AdPlanObject(
planTable.getUserId(),
planTable.getUserId(),
planTable.getPlanStatus(),
planTable.getStartDate(),
planTable.getEndDate()
);
handleBinlogEvent(
DataTable.of(AdPlanIndex.class),
planObject.getPlanId(),
planObject,
type
);
}
public static void handleLevel2(CreativeTable creativeTable, OpType type){
CreativeObject creativeObject = new CreativeObject(
creativeTable.getAdId(),
creativeTable.getName(),
creativeTable.getType(),
creativeTable.getMaterialType(),
creativeTable.getHeight(),
creativeTable.getWidth(),
creativeTable.getAuditStatus(),
creativeTable.getAdUrl()
);
handleBinlogEvent(
DataTable.of(CreativeIndex.class),
creativeObject.getAdId(),
creativeObject,
type
);
}
1.3 定义第三层级的索引操作:
由于广告单元关联于广告计划,广告单元创意中间表关联于广告创意,所以将其归类为第三层级。相比于第二层级的对象,不仅需要判断本身对应的索引对象是否为空,还得判断关联的索引对象是否为空。
public static void handleLevel3(AdUnitTable