package io.github.iamazy.elasticsearch.dsl.sql.parser.query.nested;

import io.github.iamazy.elasticsearch.dsl.antlr4.ElasticsearchParser;
import io.github.iamazy.elasticsearch.dsl.sql.model.AtomicQuery;
import io.github.iamazy.elasticsearch.dsl.sql.parser.BoolExpressionParser;
import io.github.iamazy.elasticsearch.dsl.sql.parser.ExpressionQueryParser;
import org.apache.lucene.search.join.ScoreMode;
import org.elasticsearch.index.query.NestedQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;

/**
 * @author iamazy
 * @date 2019/8/2
 * @descrition
 **/
public class NestedQueryParser implements ExpressionQueryParser<ElasticsearchParser.NestedContext> {



    @Override
    public AtomicQuery parse(ElasticsearchParser.NestedContext expression) {
        String nestedPath=expression.nestedClause().nestedPath.getText();
        BoolExpressionParser  boolExpressionParser=new BoolExpressionParser();
        QueryBuilder queryBuilder = boolExpressionParser.parseBoolQueryExpr(expression.nestedClause().query);
        NestedQueryBuilder nestedQueryBuilder= QueryBuilders.nestedQuery(nestedPath,queryBuilder, ScoreMode.Avg);
        return new AtomicQuery(nestedQueryBuilder);
    }

    @Override
    public boolean isMatchExpressionInvocation(Class clazz) {
        return ElasticsearchParser.NestedContext.class==clazz;
    }
}