Skip to content
This repository was archived by the owner on Sep 4, 2019. It is now read-only.

Commit a18fff9

Browse files
author
jiangnan
committed
update version
1 parent 6bf8f53 commit a18fff9

File tree

8 files changed

+153
-31
lines changed

8 files changed

+153
-31
lines changed

CHANGELOG

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,6 @@
1515
2019-4-24: 将elasticsearch-sql添加为elasticsearch插件
1616

1717
2019-4-28: 添加like not like 查询
18+
19+
2019-5-5: 添加desc语法获取index(或者index/field)的mapping,无法直接获取实际的mapping,必须结合restClient使用,且desc后面只能加一个index的名称
20+

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,20 @@ POST _isql
4141
"sql":"select * from fruit"
4242
}
4343
```
44+
###### 语法:desc [index]
45+
```
46+
POST _isql
47+
{
48+
"sql":"desc fruit"
49+
}
50+
```
51+
###### 语法:desc [index]/[field]
52+
```
53+
POST _isql
54+
{
55+
"sql":"desc fruit/name"
56+
}
57+
```
4458

4559
##### 2. 将sql解析成elasticsearch的dsl
4660
```
@@ -66,6 +80,7 @@ CHANGELOG
6680
2019-4-11: 添加Function Score<br/>
6781
2019-4-24: 将elasticsearch-sql添加为elasticsearch插件<br/>
6882
2019-4-28: 添加like not like 查询<br/>
83+
2019-5-5: 添加desc语法获取index(或者index/field)的mapping,无法直接获取实际的mapping,必须结合restClient使用,且desc后面只能加一个index的名称</br>
6984

7085
[CHANGELOG](https://github.com/iamazy/elasticsearch-sql/edit/master/CHANGELOG)
7186

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<url>https://github.com/iamazy/elasticsearch-sql</url>
1111

1212
<properties>
13-
<elasticsearch.version>7.0.1</elasticsearch.version>
13+
<elasticsearch.version>7.0.0</elasticsearch.version>
1414
<java.version>1.8</java.version>
1515
<elasticsearch.plugin.name>isql</elasticsearch.plugin.name>
1616
<elasticsearch.plugin.classname>io.github.iamazy.elasticsearch.dsl.plugin.SqlPlugin</elasticsearch.plugin.classname>

src/main/java/io/github/iamazy/elasticsearch/dsl/plugin/RestSqlAction.java

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package io.github.iamazy.elasticsearch.dsl.plugin;
22

3+
import com.carrotsearch.hppc.cursors.ObjectObjectCursor;
34
import io.github.iamazy.elasticsearch.dsl.sql.exception.ElasticSql2DslException;
45
import io.github.iamazy.elasticsearch.dsl.sql.model.ElasticSqlParseResult;
56
import io.github.iamazy.elasticsearch.dsl.sql.parser.ElasticSql2DslParser;
67
import org.apache.commons.lang3.StringUtils;
78
import org.elasticsearch.client.node.NodeClient;
9+
import org.elasticsearch.cluster.metadata.MappingMetaData;
10+
import org.elasticsearch.common.collect.ImmutableOpenMap;
811
import org.elasticsearch.common.settings.Settings;
9-
import org.elasticsearch.common.xcontent.XContentBuilder;
10-
import org.elasticsearch.common.xcontent.XContentFactory;
11-
import org.elasticsearch.common.xcontent.XContentParser;
12-
import org.elasticsearch.common.xcontent.XContentType;
12+
import org.elasticsearch.common.xcontent.*;
1313
import org.elasticsearch.rest.*;
1414

1515
import java.io.IOException;
@@ -22,12 +22,12 @@
2222
**/
2323
public class RestSqlAction extends BaseRestHandler {
2424

25-
RestSqlAction(Settings settings, RestController restController){
25+
RestSqlAction(Settings settings, RestController restController) {
2626
super(settings);
27-
restController.registerHandler(RestRequest.Method.POST,"/_isql/_explain",this);
28-
restController.registerHandler(RestRequest.Method.GET,"/_isql/_explain",this);
29-
restController.registerHandler(RestRequest.Method.POST,"/_isql",this);
30-
restController.registerHandler(RestRequest.Method.GET,"/_isql",this);
27+
restController.registerHandler(RestRequest.Method.POST, "/_isql/_explain", this);
28+
restController.registerHandler(RestRequest.Method.GET, "/_isql/_explain", this);
29+
restController.registerHandler(RestRequest.Method.POST, "/_isql", this);
30+
restController.registerHandler(RestRequest.Method.GET, "/_isql", this);
3131
}
3232

3333

@@ -38,26 +38,36 @@ public String getName() {
3838

3939
@Override
4040
protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient nodeClient) throws IOException {
41-
try(XContentParser parser=restRequest.contentOrSourceParamParser()){
42-
parser.mapStrings().forEach((k,v)->restRequest.params().putIfAbsent(k,v));
43-
}catch (IOException e){
44-
return channel -> channel.sendResponse(new BytesRestResponse(RestStatus.BAD_REQUEST,XContentType.JSON.mediaType(),"please use json format params, like: {\"sql\":\"select * from test\"}"));
41+
try (XContentParser parser = restRequest.contentOrSourceParamParser()) {
42+
parser.mapStrings().forEach((k, v) -> restRequest.params().putIfAbsent(k, v));
43+
} catch (IOException e) {
44+
return channel -> channel.sendResponse(new BytesRestResponse(RestStatus.BAD_REQUEST, XContentType.JSON.mediaType(), "please use json format params, like: {\"sql\":\"select * from test\"}"));
4545
}
4646
try {
47-
String sql=restRequest.param("sql");
48-
if(StringUtils.isBlank(sql)){
49-
return channel -> channel.sendResponse(new BytesRestResponse(RestStatus.BAD_REQUEST,XContentType.JSON.mediaType(),"{\"error\":\"sql语句不能为空!!!\"}"));
47+
String sql = restRequest.param("sql");
48+
if (StringUtils.isBlank(sql)) {
49+
return channel -> channel.sendResponse(new BytesRestResponse(RestStatus.BAD_REQUEST, XContentType.JSON.mediaType(), "{\"error\":\"sql语句不能为空!!!\"}"));
5050
}
51-
ElasticSql2DslParser sql2DslParser=new ElasticSql2DslParser();
51+
ElasticSql2DslParser sql2DslParser = new ElasticSql2DslParser();
5252
ElasticSqlParseResult parseResult = sql2DslParser.parse(sql);
5353
XContentBuilder builder = XContentFactory.jsonBuilder().prettyPrint();
54-
if(restRequest.path().endsWith("/_explain")){
54+
if (restRequest.path().endsWith("/_explain")) {
5555
return channel -> channel.sendResponse(new BytesRestResponse(RestStatus.OK, builder.value(parseResult.toRequest().source())));
56-
}else{
57-
return channel -> channel.sendResponse(new BytesRestResponse(RestStatus.OK,builder.value(nodeClient.search(parseResult.toRequest()).actionGet())));
56+
} else {
57+
if (parseResult.toFieldMapping() != null) {
58+
return channel -> channel.sendResponse(new BytesRestResponse(RestStatus.OK, builder.value(nodeClient.admin().indices().getFieldMappings(parseResult.toFieldMapping()).actionGet())));
59+
} else if (parseResult.toMapping()!=null) {
60+
ImmutableOpenMap<String, MappingMetaData> objectObjectCursors = nodeClient.admin().indices().getMappings(parseResult.toMapping()).actionGet().mappings().get(parseResult.getIndices().get(0));
61+
for (ObjectObjectCursor<String, MappingMetaData> objectObjectCursor : objectObjectCursors) {
62+
return channel -> channel.sendResponse(new BytesRestResponse(RestStatus.OK, builder.value(objectObjectCursor.value.getSourceAsMap())));
63+
}
64+
throw new ElasticSql2DslException("sql语句解析失败!!!");
65+
} else {
66+
return channel -> channel.sendResponse(new BytesRestResponse(RestStatus.OK, builder.value(nodeClient.search(parseResult.toRequest()).actionGet())));
67+
}
5868
}
59-
}catch (ElasticSql2DslException e){
60-
return channel -> channel.sendResponse(new BytesRestResponse(RestStatus.INTERNAL_SERVER_ERROR,XContentType.JSON.mediaType(),"{\"error\":\""+e.getMessage()+"\"}"));
69+
} catch (ElasticSql2DslException e) {
70+
return channel -> channel.sendResponse(new BytesRestResponse(RestStatus.INTERNAL_SERVER_ERROR, XContentType.JSON.mediaType(), "{\"error\":\"" + e.getMessage() + "\"}"));
6171
}
6272
}
6373

src/main/java/io/github/iamazy/elasticsearch/dsl/sql/model/ElasticSqlParseResult.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import lombok.extern.slf4j.Slf4j;
99
import org.apache.commons.collections4.CollectionUtils;
1010
import org.apache.commons.lang3.StringUtils;
11+
import org.elasticsearch.action.admin.indices.mapping.get.GetFieldMappingsRequest;
12+
import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsRequest;
1113
import org.elasticsearch.action.search.SearchRequest;
1214
import org.elasticsearch.action.search.SearchResponse;
1315
import org.elasticsearch.action.search.SearchScrollRequest;
@@ -43,7 +45,7 @@ public class ElasticSqlParseResult {
4345
private String scrollId;
4446

4547
private List<String> indices;
46-
// private String type = "_doc";
48+
private String type = "_doc";
4749
private String queryAs;
4850
/**
4951
* 需要高亮显示的字段
@@ -57,12 +59,15 @@ public class ElasticSqlParseResult {
5759
private transient List<AggregationBuilder> groupBy;
5860
private transient SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
5961

62+
private GetMappingsRequest mappingsRequest;
63+
private GetFieldMappingsRequest fieldMappingsRequest;
64+
6065
public DeleteByQueryRequest toDelRequest() {
6166
DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(toRequest().indices());
6267
deleteByQueryRequest.setQuery(searchSourceBuilder.query());
63-
// if (StringUtils.isNotBlank(type)) {
64-
// deleteByQueryRequest.types(type);
65-
// }
68+
if (StringUtils.isNotBlank(type)) {
69+
deleteByQueryRequest.types(type);
70+
}
6671
if (CollectionUtils.isNotEmpty(routingBy)) {
6772
deleteByQueryRequest.setRouting(routingBy.get(0));
6873
}
@@ -75,6 +80,14 @@ public DeleteByQueryRequest toDelRequest() {
7580
return deleteByQueryRequest;
7681
}
7782

83+
public GetFieldMappingsRequest toFieldMapping(){
84+
return fieldMappingsRequest;
85+
}
86+
87+
public GetMappingsRequest toMapping(){
88+
return mappingsRequest;
89+
}
90+
7891
public SearchResponse toResponse(RestHighLevelClient restHighLevelClient, RequestOptions requestOptions) throws IOException {
7992
if (StringUtils.isNotBlank(scrollExpire) && StringUtils.isBlank(scrollId)) {
8093
return restHighLevelClient.search(toRequest(), requestOptions);
@@ -93,9 +106,9 @@ public SearchRequest toRequest() {
93106
if (CollectionUtils.isNotEmpty(indices)) {
94107
searchRequest.indices(indices.toArray(new String[0]));
95108
}
96-
// if (StringUtils.isNotBlank(type)) {
97-
// searchRequest.types(type);
98-
// }
109+
if (StringUtils.isNotBlank(type)) {
110+
searchRequest.types(type);
111+
}
99112

100113

101114
if (from < 0) {
@@ -112,6 +125,7 @@ public SearchRequest toRequest() {
112125
searchSourceBuilder.size(size);
113126
}
114127

128+
115129
if(CollectionUtils.isNotEmpty(highlighter)) {
116130
HighlightBuilder highlightBuilder = HighlightBuilders.highlighter(highlighter);
117131
searchSourceBuilder.highlighter(highlightBuilder);
@@ -156,6 +170,7 @@ public SearchRequest toRequest() {
156170
final Scroll scroll = new Scroll(TimeValue.parseTimeValue(scrollExpire, StringUtils.EMPTY));
157171
searchRequest.scroll(scroll);
158172
}
173+
159174
return searchRequest.source(searchSourceBuilder);
160175
}
161176

src/main/java/io/github/iamazy/elasticsearch/dsl/sql/parser/ElasticSql2DslParser.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,15 @@
1313
import io.github.iamazy.elasticsearch.dsl.sql.druid.ElasticSqlSelectQueryBlock;
1414
import io.github.iamazy.elasticsearch.dsl.sql.exception.ElasticSql2DslException;
1515
import io.github.iamazy.elasticsearch.dsl.sql.parser.aggs.GroupByAggregationParser;
16+
import io.github.iamazy.elasticsearch.dsl.sql.parser.query.method.mapping.MappingQueryParser;
1617
import io.github.iamazy.elasticsearch.dsl.sql.parser.sql.*;
1718
import io.github.iamazy.elasticsearch.dsl.sql.model.ElasticDslContext;
1819
import io.github.iamazy.elasticsearch.dsl.sql.model.ElasticSqlParseResult;
20+
import org.elasticsearch.action.admin.indices.mapping.get.GetFieldMappingsRequest;
21+
import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsRequest;
1922

2023

24+
import java.util.Arrays;
2125
import java.util.List;
2226

2327
/**
@@ -42,6 +46,22 @@ public ElasticSqlParseResult parse(String sql) throws ElasticSql2DslException {
4246
elasticDslContext.getParseResult().setSize(((SQLIntegerExpr) sqlLimit.getRowCount()).getNumber().intValue());
4347
return elasticDslContext.getParseResult();
4448
}
49+
case DESC:{
50+
Object mappingsRequest = MappingQueryParser.parse(sql);
51+
ElasticDslContext elasticDslContext=new ElasticDslContext(null);
52+
if(mappingsRequest instanceof GetMappingsRequest) {
53+
GetMappingsRequest getMappingsRequest=(GetMappingsRequest) mappingsRequest;
54+
elasticDslContext.getParseResult().setMappingsRequest(getMappingsRequest);
55+
elasticDslContext.getParseResult().setIndices(Arrays.asList(getMappingsRequest.indices()));
56+
}else if(mappingsRequest instanceof GetFieldMappingsRequest) {
57+
GetFieldMappingsRequest getFieldMappingsRequest=(GetFieldMappingsRequest) mappingsRequest;
58+
elasticDslContext.getParseResult().setFieldMappingsRequest((GetFieldMappingsRequest) mappingsRequest);
59+
elasticDslContext.getParseResult().setIndices(Arrays.asList(getFieldMappingsRequest.indices()));
60+
}else{
61+
throw new ElasticSql2DslException("[syntax error] not support desc like this syntax");
62+
}
63+
return elasticDslContext.getParseResult();
64+
}
4565
case SELECT:
4666
default: {
4767
ElasticSqlExprParser elasticSqlExprParser = new ElasticSqlExprParser(sql);
@@ -54,7 +74,7 @@ public ElasticSqlParseResult parse(String sql) throws ElasticSql2DslException {
5474
sqlParser.parse(elasticDslContext);
5575
}
5676
} else {
57-
throw new ElasticSql2DslException("[syntax error] Sql only support Select,Delete Sql");
77+
throw new ElasticSql2DslException("[syntax error] Sql only support Select,Delete,Desc Sql");
5878
}
5979
return elasticDslContext.getParseResult();
6080
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.github.iamazy.elasticsearch.dsl.sql.parser.query.method.mapping;
2+
3+
4+
import io.github.iamazy.elasticsearch.dsl.sql.exception.ElasticSql2DslException;
5+
import org.apache.commons.lang3.StringUtils;
6+
import org.elasticsearch.action.admin.indices.mapping.get.GetFieldMappingsRequest;
7+
import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsRequest;
8+
9+
/**
10+
* @author iamazy
11+
* @date 2019/5/5
12+
* @descrition
13+
**/
14+
public class MappingQueryParser {
15+
16+
public static Object parse(String sql) {
17+
String[] descItems = StringUtils.split(sql, " ");
18+
GetFieldMappingsRequest getFieldMappingsRequest = new GetFieldMappingsRequest();
19+
GetMappingsRequest getMappingsRequest = new GetMappingsRequest();
20+
if (descItems.length == 2) {
21+
String[] items = descItems[1].split("/");
22+
switch (items.length) {
23+
case 2: {
24+
getFieldMappingsRequest.indices(items[0]);
25+
getFieldMappingsRequest.fields(items[1]);
26+
return getFieldMappingsRequest;
27+
}
28+
case 1:
29+
default: {
30+
getMappingsRequest.indices(items[0]);
31+
return getMappingsRequest;
32+
}
33+
}
34+
} else {
35+
throw new ElasticSql2DslException("[syntax error] desc must have table name or table/field name");
36+
}
37+
}
38+
39+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.github.iamazy.elasticsearch.dsl.sql;
2+
3+
import io.github.iamazy.elasticsearch.dsl.sql.model.ElasticSqlParseResult;
4+
import io.github.iamazy.elasticsearch.dsl.sql.parser.ElasticSql2DslParser;
5+
import org.junit.Test;
6+
7+
/**
8+
* @author iamazy
9+
* @date 2019/5/5
10+
* @descrition
11+
**/
12+
public class DescTest {
13+
14+
@Test
15+
public void test3(){
16+
String sql="desc device_info";
17+
ElasticSql2DslParser sql2DslParser=new ElasticSql2DslParser();
18+
ElasticSqlParseResult parseResult = sql2DslParser.parse(sql);
19+
}
20+
}

0 commit comments

Comments
 (0)