8000 added support for fields from extract · kgtdbx/document-api-python@3f83b7c · GitHub
[go: up one dir, main page]

Skip to content

Commit 3f83b7c

Browse files
author
Richard Kooijman
committed
added support for fields from extract
added support for columns from extract
1 parent bf53711 commit 3f83b7c

File tree

4 files changed

+39
-6
lines changed

4 files changed

+39
-6
lines changed

samples/connection-query/show_sql.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from tableaudocumentapi import Datasource
22

33
sourceTDS = Datasource.from_file('Sales.tds')
4-
print(sourceTDS.has_extract())
4+
print(sourceTDS.fields)
5+
print(sourceTDS.extract_fields)
56

67
print(sourceTDS.get_query())
78

tableaudocumentapi/connection.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ def __init__(self, connxml):
2626
def __repr__(self):
2727
return "'<Connection server='{}' dbname='{}' @ {}>'".format(self._server, self._dbname, hex(id(self)))
2828

29+
@property
30+
def connection_xml(self):
31+
return self._connectionXML
32+
2933
@classmethod
3034
def from_attributes(cls, server, dbname, username, dbclass, port=None, query_band=None,
3135
initial_sql=None, authentication=''):

tableaudocumentapi/datasource.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,11 @@ def _extract_federated_connections(self):
120120
connections = list(map(Connection, self._dsxml.findall('.//named-connections/named-connection/*')))
121121
# 'sqlproxy' connections (Tableau Server Connections) are not embedded into named-connection elements
122122
# extract them manually for now
123-
connections.extend(map(Connection, self._dsxml.findall("./connection[@class='sqlproxy']")))
123+
connections.extend(map(Connection, self._dsxml.findall(".//connection[@class='sqlproxy']")))
124124
return connections
125125

126126
def _extract_legacy_connection(self):
127-
return list(map(Connection, self._dsxml.findall('connection')))
127+
return list(map(Connection, self._dsxml.children('connection')))
128128

129129
def get_connections(self):
130130
"""Find and return all connections based on file format version."""
@@ -156,11 +156,13 @@ def __init__(self, dsxml, filename=None):
156156
self._caption = self._datasourceXML.get('caption', '')
157157
self._connection_parser = ConnectionParser(self._datasourceXML, version=self._version)
158158
self._connections = self._connection_parser.get_connections()
159+
self._db_columns = self._get_db_column_objects()
160+
self._extract_columns = self._get_extract_column_objects()
159161
self._fields = None
162+
self._extract_fields = None
160163
self._parameter_parser = ParameterParser(self._datasourceXML, version=self._version)
161164
self._parameters = self._parameter_parser.get_parameters()
162165
self._columns = None
163-
self._db_columns = self._get_db_column_objects()
164166

165167
self._relations = list(map(Relation, self._datasourceXML.findall("./connection[@class='federated']/relation")))
166168
self._extracts = list(map(Extract, self._datasourceXML.findall("./extract")))
@@ -255,6 +257,12 @@ def fields(self):
255257
self._fields = self._get_all_fields()
256258
return self._fields
257259

260+
@property
261+
def extract_fields(self):
262+
if not self._extract_fields:
263+
self._extract_fields = self._get_extract_fields()
264+
return self._extract_fields
265+
258266
@property
259267
def columns(self):
260268
if not self._columns:
@@ -281,17 +289,29 @@ def _get_all_fields(self):
281289

282290
return FieldDictionary({k: v for k, v in field_objects})
283291

292+
def _get_extract_fields(self):
293+
self._extract_metadata_objects = (x for x in self._get_extract_metadata_objects())
294+
return FieldDictionary({k: v for k, v in self._extract_metadata_objects})
295+
284296
def _get_metadata_objects(self):
285297
return (_column_object_from_metadata_xml(xml)
286298
for xml in self._datasourceTree.findall(".//metadata-record[@class='column']"))
287299

300+
def _get_extract_metadata_objects(self):
301+
return (_column_object_from_metadata_xml(xml)
302+
for xml in self._datasourceTree.findall(".//extract/connection/metadata-records/metadata-record[@class='column']"))
303+
288304
def _get_column_objects(self):
289305
return [_column_object_from_column_xml(self._datasourceTree, xml)
290-
for xml in self._datasourceTree.findall('.//column')]
306+
for xml in self._datasourceTree.findall('./column')]
291307

292308
def _get_db_column_objects(self):
293309
return dict([_db_column_object_from_db_column_xml(self._datasourceTree, xml)
294-
for xml in self._datasourceTree.findall('./connection/cols/map')])
310+
for xml in self._datasourceTree.findall('.//connection/cols/map')])
311+
312+
def _get_extract_column_objects(self):
313+
return dict([_db_column_object_from_db_column_xml(self._datasourceTree, xml)
314+
for xml in self._datasourceTree.findall('.//extract/connection/cols/map')])
295315

296316
def has_extract(self):
297317
return len(self._extracts) > 0 and self._extracts[0].enabled == 'true'

tableaudocumentapi/field.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,14 @@ def caption(self):
147147
""" Name of the field as displayed in Tableau unless an aliases is defined """
148148
return self._caption
149149

150+
@property
151+
def parent(self):
152+
return self._parent
153+
154+
@property
155+
def family(self):
156+
return self._family
157+
150158
@caption.setter
151159
def caption(self, caption):
152160
self._caption = caption

0 commit comments

Comments
 (0)
0