38
38
import org .apache .seatunnel .connectors .seatunnel .tdengine .typemapper .TDengineTypeMapper ;
39
39
40
40
import org .apache .commons .lang3 .ArrayUtils ;
41
- import org .apache .commons .lang3 .StringUtils ;
42
41
43
42
import com .google .auto .service .AutoService ;
44
- import com .google .common .collect .Lists ;
45
43
import lombok .SneakyThrows ;
46
44
47
45
import java .sql .Connection ;
48
46
import java .sql .DriverManager ;
49
47
import java .sql .ResultSet ;
48
+ import java .sql .SQLException ;
50
49
import java .sql .Statement ;
50
+ import java .util .ArrayList ;
51
51
import java .util .List ;
52
52
53
53
import static org .apache .seatunnel .connectors .seatunnel .tdengine .config .TDengineSourceConfig .ConfigNames .DATABASE ;
67
67
public class TDengineSource
68
68
implements SeaTunnelSource <SeaTunnelRow , TDengineSourceSplit , TDengineSourceState > {
69
69
70
- private SeaTunnelRowType seaTunnelRowType ;
70
+ private StableMetadata stableMetadata ;
71
71
private TDengineSourceConfig tdengineSourceConfig ;
72
72
73
73
@ Override
@@ -87,45 +87,7 @@ public void prepare(Config pluginConfig) throws PrepareFailException {
87
87
"TDengine connection require url/database/stable/username/password. All of these must not be empty." );
88
88
}
89
89
tdengineSourceConfig = buildSourceConfig (pluginConfig );
90
-
91
- // add subtable_name and tags to `seaTunnelRowType`
92
- SeaTunnelRowType originRowType = getSTableMetaInfo (tdengineSourceConfig );
93
- seaTunnelRowType = addHiddenAttribute (originRowType );
94
- }
95
-
96
- @ SneakyThrows
97
- private SeaTunnelRowType getSTableMetaInfo (TDengineSourceConfig config ) {
98
- String jdbcUrl =
99
- StringUtils .join (
100
- config .getUrl (),
101
- config .getDatabase (),
102
- "?user=" ,
103
- config .getUsername (),
104
- "&password=" ,
105
- config .getPassword ());
106
- Connection conn = DriverManager .getConnection (jdbcUrl );
107
- List <String > fieldNames = Lists .newArrayList ();
108
- List <SeaTunnelDataType <?>> fieldTypes = Lists .newArrayList ();
109
- try (Statement statement = conn .createStatement ()) {
110
- final ResultSet metaResultSet =
111
- statement .executeQuery (
112
- "desc " + config .getDatabase () + "." + config .getStable ());
113
- while (metaResultSet .next ()) {
114
- fieldNames .add (metaResultSet .getString (1 ));
115
- fieldTypes .add (TDengineTypeMapper .mapping (metaResultSet .getString (2 )));
116
- }
117
- }
118
- return new SeaTunnelRowType (
119
- fieldNames .toArray (new String [0 ]), fieldTypes .toArray (new SeaTunnelDataType <?>[0 ]));
120
- }
121
-
122
- private SeaTunnelRowType addHiddenAttribute (SeaTunnelRowType originRowType ) {
123
- // 0-subtable_name / 1-n field_names /
124
- String [] fieldNames = ArrayUtils .add (originRowType .getFieldNames (), 0 , "subtable_name" );
125
- // n+1-> tags
126
- SeaTunnelDataType <?>[] fieldTypes =
127
- ArrayUtils .add (originRowType .getFieldTypes (), 0 , BasicType .STRING_TYPE );
128
- return new SeaTunnelRowType (fieldNames , fieldTypes );
90
+ stableMetadata = getStableMetadata (tdengineSourceConfig );
129
91
}
130
92
131
93
@ Override
@@ -135,7 +97,7 @@ public Boundedness getBoundedness() {
135
97
136
98
@ Override
137
99
public SeaTunnelDataType <SeaTunnelRow > getProducedType () {
138
- return seaTunnelRowType ;
100
+ return stableMetadata . getRowType () ;
139
101
}
140
102
141
103
@ Override
@@ -147,14 +109,74 @@ public SourceReader<SeaTunnelRow, TDengineSourceSplit> createReader(Context read
147
109
public SourceSplitEnumerator <TDengineSourceSplit , TDengineSourceState > createEnumerator (
148
110
SourceSplitEnumerator .Context <TDengineSourceSplit > enumeratorContext ) {
149
111
return new TDengineSourceSplitEnumerator (
150
- seaTunnelRowType , tdengineSourceConfig , enumeratorContext );
112
+ stableMetadata , tdengineSourceConfig , enumeratorContext );
151
113
}
152
114
153
115
@ Override
154
116
public SourceSplitEnumerator <TDengineSourceSplit , TDengineSourceState > restoreEnumerator (
155
117
SourceSplitEnumerator .Context <TDengineSourceSplit > enumeratorContext ,
156
118
TDengineSourceState checkpointState ) {
157
119
return new TDengineSourceSplitEnumerator (
158
- seaTunnelRowType , tdengineSourceConfig , checkpointState , enumeratorContext );
120
+ stableMetadata , tdengineSourceConfig , checkpointState , enumeratorContext );
121
+ }
122
+
123
+ private StableMetadata getStableMetadata (TDengineSourceConfig config ) throws SQLException {
124
+ String timestampFieldName = null ;
125
+ List <String > subTableNames = new ArrayList <>();
126
+ List <String > fieldNames = new ArrayList <>();
127
+ List <SeaTunnelDataType <?>> fieldTypes = new ArrayList <>();
128
+
129
+ String jdbcUrl =
130
+ String .join (
131
+ "" ,
132
+ config .getUrl (),
133
+ config .getDatabase (),
134
+ "?user=" ,
135
+ config .getUsername (),
136
+ "&password=" ,
137
+ config .getPassword ());
138
+ try (Connection conn = DriverManager .getConnection (jdbcUrl )) {
139
+ try (Statement statement = conn .createStatement ()) {
140
+ ResultSet metaResultSet =
141
+ statement .executeQuery (
142
+ "desc " + config .getDatabase () + "." + config .getStable ());
143
+ while (metaResultSet .next ()) {
144
+ if (timestampFieldName == null ) {
145
+ timestampFieldName = metaResultSet .getString (1 );
146
+ }
147
+ fieldNames .add (metaResultSet .getString (1 ));
148
+ fieldTypes .add (TDengineTypeMapper .mapping (metaResultSet .getString (2 )));
149
+ }
150
+ }
151
+ try (Statement statement = conn .createStatement ()) {
152
+ String metaSQL =
153
+ "select table_name from information_schema.ins_tables where db_name = '"
154
+ + config .getDatabase ()
155
+ + "' and stable_name='"
156
+ + config .getStable ()
157
+ + "';" ;
158
+ ResultSet subTableNameResultSet = statement .executeQuery (metaSQL );
159
+ while (subTableNameResultSet .next ()) {
160
+ String subTableName = subTableNameResultSet .getString (1 );
161
+ subTableNames .add (subTableName );
162
+ }
163
+ }
164
+ }
165
+
166
+ SeaTunnelRowType rowType = addHiddenAttribute (fieldNames , fieldTypes );
167
+ return new StableMetadata (rowType , timestampFieldName , subTableNames );
168
+ }
169
+
170
+ private SeaTunnelRowType addHiddenAttribute (
171
+ List <String > fieldNames , List <SeaTunnelDataType <?>> fieldTypes ) {
172
+ // add subtable_name and tags to `seaTunnelRowType`
173
+ // 0-subtable_name / 1-n field_names /
174
+ String [] newFieldNames =
175
+ ArrayUtils .add (fieldNames .toArray (new String [0 ]), 0 , "subtable_name" );
176
+ // n+1-> tags
177
+ SeaTunnelDataType <?>[] newFieldTypes =
178
+ ArrayUtils .add (
179
+ fieldTypes .toArray (new SeaTunnelDataType [0 ]), 0 , BasicType .STRING_TYPE );
180
+ return new SeaTunnelRowType (newFieldNames , newFieldTypes );
159
181
}
160
182
}
0 commit comments