Skip to content

Commit a5720d4

Browse files
authored
Merge pull request #14 from Hugoberry/dax-columns
Surface DAX columns
2 parents b17f5e3 + abfd39b commit a5720d4

File tree

8 files changed

+46
-8
lines changed

8 files changed

+46
-8
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ To access DAX measures in a dataframe with `TableName`, `Name`, `Expression`, `D
5959
dax_measures = model.dax_measures
6060
print(dax_measures)
6161
```
62+
### Calculated Columns
63+
To access calculated column DAX expressions in a dataframe with `TableName`,`ColumnName` and `Expression` columns:
64+
```python
65+
dax_columns = model.dax_columns
66+
print(dax_columns)
67+
```
6268
### Schema
6369
To get details about the data model schema and column types in a dataframe with `TableName`, `ColumnName`, and `PandasDataType` columns:
6470
```python
8.89 MB
Binary file not shown.

data/output/metadata.sqlitedb

700 KB
Binary file not shown.

demo.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,18 @@
3636
ic(model.size)
3737
ic(model.schema)
3838
ic(model.relationships)
39-
ic(model.get_table("Fruit_RLE"))
39+
ic(model.dax_columns)
40+
ic(model.get_table("Fruit_RLE"))
41+
42+
model = PBIXRay(r"C:\git\hub\pbixray\data\2020SU11 Blog Demo - November.pbix")
43+
ic(model.tables)
44+
ic(model.metadata)
45+
ic(model.power_query)
46+
ic(model.statistics)
47+
ic(model.dax_tables)
48+
ic(model.dax_measures)
49+
ic(model.dax_columns)
50+
ic(model.size)
51+
ic(model.schema)
52+
ic(model.relationships)
53+
ic(model.get_table("Reseller"))

pbixray/column_data/idfmeta.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ def __init__(self, _io, _parent=None, _root=None):
132132

133133
def _read(self):
134134
self.cp = IdfmetaParser.CPElement(self._io, self, self._root)
135-
self.sdos = IdfmetaParser.SDOsElement(self._io, self, self._root)
135+
if self._io.size() > self._io.pos():
136+
self.sdos = IdfmetaParser.SDOsElement(self._io, self, self._root)
136137

137138

138139
class CSDOs1Element(KaitaiStruct):

pbixray/core.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ def dax_tables(self):
3939
def dax_measures(self):
4040
return self._metadata_handler.metadata.dax_measures_df
4141

42+
@property
43+
def dax_columns(self):
44+
return self._metadata_handler.metadata.dax_columns_df
45+
4246
@property
4347
def metadata(self):
4448
return self._metadata_handler.metadata.metadata_df

pbixray/meta/metadata_query.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ def __init__(self, sqlite_handler):
88
self.m_df = self.__populate_m()
99
self.dax_tables_df = self.__populate_dax_tables()
1010
self.dax_measures_df = self.__populate_dax_measures()
11-
self.metadata_df = self.populate_metadata()
12-
self.relationships_df = self.populate_relationships()
11+
self.dax_columns_df = self.__populate_dax_columns()
12+
self.metadata_df = self.__populate_metadata()
13+
self.relationships_df = self.__populate_relationships()
1314
self.handler.close_connection()
1415

1516
def __populate_schema(self):
@@ -41,7 +42,7 @@ def __populate_schema(self):
4142
--IDF
4243
JOIN ColumnPartitionStorage cps ON cps.ColumnStorageID = cs.ID
4344
JOIN StorageFile sfi ON sfi.ID = cps.StorageFileID
44-
WHERE c.Type = 1
45+
WHERE c.Type IN (1,2)
4546
ORDER BY t.Name, cs.StoragePosition
4647
"""
4748
return self.handler.execute_query(sql)
@@ -80,16 +81,28 @@ def __populate_dax_measures(self):
8081
JOIN [Table] t ON m.TableID = t.ID;
8182
"""
8283
return self.handler.execute_query(sql)
84+
85+
def __populate_dax_columns(self):
86+
sql = """
87+
SELECT
88+
t.Name AS TableName,
89+
c.ExplicitName AS ColumnName,
90+
c.Expression
91+
FROM Column c
92+
JOIN [Table] t ON c.TableID = t.ID
93+
WHERE c.Type = 2;
94+
"""
95+
return self.handler.execute_query(sql)
8396

84-
def populate_metadata(self):
97+
def __populate_metadata(self):
8598
sql = """
8699
SELECT Name,Value
87100
FROM Annotation
88101
WHERE ObjectType = 1
89102
"""
90103
return self.handler.execute_query(sql)
91104

92-
def populate_relationships(self):
105+
def __populate_relationships(self):
93106
sql = """
94107
SELECT
95108
ft.Name AS FromTableName,

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
setup(
44
name='pbixray',
5-
version='0.1.19',
5+
version='0.1.20',
66
packages=find_packages(),
77
install_requires=[
88
'kaitaistruct',

0 commit comments

Comments
 (0)