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

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;
    }
}
相关推荐
Csvn1 小时前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽2 小时前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
用户556918817534 小时前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维
兵慌码乱18 小时前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
luckdewei20 小时前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python
aqi001 天前
15天学会AI应用开发(八)使用向量数据库实现RAG功能
人工智能·python·大模型·ai编程·ai应用
Csvn1 天前
`functools.lru_cache` —— 一行代码搞定缓存加速
后端·python
金銀銅鐵2 天前
[Python] 从《千字文》中随机挑选汉字
后端·python
cup112 天前
[技术复盘] Windows Python 打包实战:Nuitka 环境踩坑总结与 CI 自动化构建全指南
python·ai·环境变量·ci·nuitka·skill