1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.infra.binder.context.statement.dal;
19
20 import lombok.Getter;
21 import org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext;
22 import org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext;
23 import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
24 import org.apache.shardingsphere.sql.parser.sql.common.extractor.TableExtractor;
25 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
26 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
27 import org.apache.shardingsphere.sql.parser.sql.common.statement.dal.ExplainStatement;
28 import org.apache.shardingsphere.sql.parser.sql.dialect.handler.dal.ExplainStatementHandler;
29
30 import java.util.Collection;
31 import java.util.LinkedList;
32
33
34
35
36 @Getter
37 public final class ExplainStatementContext extends CommonSQLStatementContext implements TableAvailable {
38
39 private final TablesContext tablesContext;
40
41 public ExplainStatementContext(final ExplainStatement sqlStatement) {
42 super(sqlStatement);
43 tablesContext = new TablesContext(extractTablesFromExplain(sqlStatement), getDatabaseType());
44 }
45
46 private Collection<SimpleTableSegment> extractTablesFromExplain(final ExplainStatement sqlStatement) {
47 Collection<SimpleTableSegment> result = new LinkedList<>();
48 ExplainStatementHandler.getSimpleTableSegment(sqlStatement).ifPresent(result::add);
49 SQLStatement explainableStatement = sqlStatement.getStatement().orElse(null);
50 TableExtractor extractor = new TableExtractor();
51
52 extractor.extractTablesFromSQLStatement(explainableStatement);
53 result.addAll(extractor.getRewriteTables());
54 return result;
55 }
56
57 @Override
58 public ExplainStatement getSqlStatement() {
59 return (ExplainStatement) super.getSqlStatement();
60 }
61
62 @Override
63 public Collection<SimpleTableSegment> getAllTables() {
64 return extractTablesFromExplain(getSqlStatement());
65 }
66 }