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

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;
    }
}
相关推荐
万物得其道者成10 分钟前
React Zustand状态管理库的使用
开发语言·javascript·ecmascript
奈斯。zs14 分钟前
yjs08——矩阵、数组的运算
人工智能·python·线性代数·矩阵·numpy
Melody205015 分钟前
tensorflow-dataset 内网下载 指定目录
人工智能·python·tensorflow
学步_技术16 分钟前
Python编码系列—Python抽象工厂模式:构建复杂对象家族的蓝图
开发语言·python·抽象工厂模式
wn53140 分钟前
【Go - 类型断言】
服务器·开发语言·后端·golang
Narutolxy1 小时前
Python 单元测试:深入理解与实战应用20240919
python·单元测试·log4j
Hello-Mr.Wang1 小时前
vue3中开发引导页的方法
开发语言·前端·javascript
救救孩子把1 小时前
Java基础之IO流
java·开发语言
WG_171 小时前
C++多态
开发语言·c++·面试
宇卿.1 小时前
Java键盘输入语句
java·开发语言