如何自定义语法与其他语句进行映射

1、如何自定义注解与hbase的api进行通信,自动进行类映射

2、如何定义一个对象 与sql中语法进行匹配

各种场景,都可以写一个针对特定软件的语法,进映射

复制代码
package hbase;

import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Row;
import org.apache.hadoop.hbase.util.Bytes;
import org.springframework.beans.factory.InitializingBean;

import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Stream;

public abstract class AbstractHbaseService<DO> implements InitializingBean {


    private final Map<String, Field> columnFieldMap=new LinkedHashMap<>();

    private static final ConcurrentHashMap<Class, List<Field>> query_field_cache=new ConcurrentHashMap();

    protected abstract Class<DO> getHbaseDOClass();


    protected Row convertToRow(DO doObj) throws IllegalAccessException {
       return convertToRow(doObj,null);
    }

    protected DO convertToDO(Row rowObj) throws InstantiationException, IllegalAccessException {
        DO doObj=getHbaseDOClass().newInstance();
        for(Map.Entry<String,Field> entry:columnFieldMap.entrySet()){
            byte[] row = rowObj.getRow();
            entry.getValue().set(doObj,row);
        }
        return doObj;
    }


    protected Row convertToRow(DO doObj,Long tsLong) throws IllegalAccessException {
        for(Map.Entry<String,Field> entry:columnFieldMap.entrySet()){
            Object value=entry.getValue().get(doObj);
            if(value!=null){
                if(tsLong==null){
                    return new Put(Bytes.toBytes((String)value));
                }else {
                    return new Put(Bytes.toBytes((String)value));
                }
            }
        }
        return null;
    }


    private List<Field> getIndexFields(BaseQueryParams queryParams){
        List<Field> fieldList=query_field_cache.get(queryParams.getClass());
        if(fieldList!=null){
            return fieldList;
        }
        fieldList=new ArrayList<>();
        for(Field field:queryParams.getClass().getDeclaredFields()){
            HbaseIndex index=field.getAnnotation(HbaseIndex.class);
            if(index==null){
                continue;
            }
            fieldList.add(field);
        }
        query_field_cache.put(queryParams.getClass(),fieldList);
        return fieldList;
    }

    private Object getFieldValue(Field field,Object input){
        Object fieldValue=null;
        try {
            field.setAccessible(true);
            fieldValue=field.get(input);
        }catch (Exception e){

        }
        return fieldValue;
    }

    protected List<Row> buildHbaseQuery(BaseQueryParams queryParams){
        List<Row> conditions=new ArrayList<>();
        for(Field field :getIndexFields(queryParams)){
            HbaseIndex index=field.getAnnotation(HbaseIndex.class);
            if(index==null|| index.relation()==null){
                continue;
            }
            Object fieldObjct=getFieldValue(field,queryParams);
            if(fieldObjct==null){
                continue;
            }
            if(index.relation().getOp()!=null){
                //此处就是把自定义的与hbase的请求进行映射,
            }
        }
        return conditions;
    }


    @Override
    public void afterPropertiesSet() throws Exception {
        buildFieldMap(getHbaseDOClass());
        if(getHbaseDOClass().getSuperclass()!=null){
            buildFieldMap(getHbaseDOClass().getSuperclass());
        }
    }

    private void  buildFieldMap(Class c){
        Field[] fields = c.getDeclaredFields();
        Stream.of(fields).forEach(field -> {
            HbaseColumn column=field.getAnnotation(HbaseColumn.class);
            if(column==null|| StringUtils.isBlank(column.name())){
                return;
            }
            if(!field.isAccessible()){
                field.setAccessible(true);
            }
            columnFieldMap.put(column.name(),field);
        });
    }
}

package hbase;

public abstract class BaseQueryParams {

    private Integer pageSize=10;

    private int start=0;

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public int getStart() {
        return start;
    }

    public void setStart(int start) {
        this.start = start;
    }
}

package hbase;

import java.lang.annotation.*;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface HbaseColumn {

    String name() default "";
}

package hbase;

import java.lang.annotation.*;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface HbaseIndex {

    String name() default "";


    HbaseRelationEnum relation() default HbaseRelationEnum.EQUAL;

}

package hbase;

import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.RowFilter;

public enum HbaseRelationEnum {
    LESS("<", CompareFilter.CompareOp.LESS),

    LESS_OR_EQUAL("<=", CompareFilter.CompareOp.LESS_OR_EQUAL),

    EQUAL("=", CompareFilter.CompareOp.EQUAL),

    NOT_EQUAL("<>", CompareFilter.CompareOp.NOT_EQUAL),

    GREATER_OR_EQUAL(">=", CompareFilter.CompareOp.GREATER_OR_EQUAL),

    GREATERL(">", CompareFilter.CompareOp.GREATER),

    IN("in",null),

    NOT_IN("not in",null);
    ;

    private String code;

    private RowFilter.CompareOp op;


    HbaseRelationEnum(String code, RowFilter.CompareOp op) {
        this.code = code;
        this.op = op;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public RowFilter.CompareOp getOp() {
        return op;
    }

    public void setOp(RowFilter.CompareOp op) {
        this.op = op;
    }
}
相关推荐
fantasy_arch21 分钟前
pytorch例子计算两张图相似度
人工智能·pytorch·python
七七&5561 小时前
2024年08月13日 Go生态洞察:Go 1.23 发布与全面深度解读
开发语言·网络·golang
java坤坤1 小时前
GoLand 项目从 0 到 1:第八天 ——GORM 命名策略陷阱与 Go 项目启动慢问题攻坚
开发语言·后端·golang
元清加油1 小时前
【Golang】:函数和包
服务器·开发语言·网络·后端·网络协议·golang
健康平安的活着2 小时前
java之 junit4单元测试Mockito的使用
java·开发语言·单元测试
WBluuue2 小时前
数学建模:智能优化算法
python·机器学习·数学建模·爬山算法·启发式算法·聚类·模拟退火算法
赴3353 小时前
矿物分类案列 (一)六种方法对数据的填充
人工智能·python·机器学习·分类·数据挖掘·sklearn·矿物分类
大模型真好玩3 小时前
一文深度解析OpenAI近期发布系列大模型:意欲一统大模型江湖?
人工智能·python·mcp
RPA+AI十二工作室3 小时前
亚马逊店铺绩效巡检_影刀RPA源码解读
chrome·python·rpa·影刀
DjangoJason3 小时前
C++ 仿RabbitMQ实现消息队列项目
开发语言·c++·rabbitmq