class ModelMetadata(object):
dimensions = {}
dateDimensions = {}
measures = []
accounts = {}
versions = {}
<EntityType Name="FactData">
<Key>
<PropertyRef Name="Account_BestRunJ_sold"/>
<PropertyRef Name="Store_3z2g5g06m4"/>
<PropertyRef Name="Location_4nm2e04531"/>
<PropertyRef Name="Product_3e315003an"/>
<PropertyRef Name="Sales_Manager__5w3m5d06b5"/>
<PropertyRef Name="Date_703i1904sd"/>
<PropertyRef Name="Version_BestRunJsold_V"/>
</Key>
<Property Name="Account_BestRunJ_sold" Type="Edm.String" MaxLength="256">
<Annotation Term="Integration.OriginalDataType">
<String>NVARCHAR</String>
</Annotation>
</Property>
<Property Name="Store_3z2g5g06m4" Type="Edm.String" MaxLength="256">
<Annotation Term="Integration.OriginalDataType">
<String>NVARCHAR</String>
</Annotation>
</Property>
<Property Name="Location_4nm2e04531" Type="Edm.String" MaxLength="256">
<Annotation Term="Integration.OriginalDataType">
<String>NVARCHAR</String>
</Annotation>
</Property>
<Property Name="Product_3e315003an" Type="Edm.String" MaxLength="256">
<Annotation Term="Integration.OriginalDataType">
<String>NVARCHAR</String>
</Annotation>
</Property>
<Property Name="Sales_Manager__5w3m5d06b5" Type="Edm.String" MaxLength="256">
<Annotation Term="Integration.OriginalDataType">
<String>NVARCHAR</String>
</Annotation>
</Property>
<Property Name="Date_703i1904sd" Type="Edm.String" MaxLength="6">
<Annotation Term="Integration.OriginalDataType">
<String>VARCHAR</String>
</Annotation>
</Property>
<Property Name="Version_BestRunJsold_V" Type="Edm.String" MaxLength="300">
<Annotation Term="Integration.OriginalDataType">
<String>NVARCHAR</String>
</Annotation>
</Property>
<Property Name="SignedData" Type="Edm.Decimal" MaxLength="32" Precision="31" Scale="7">
<Annotation Term="Integration.OriginalDataType">
<String>DECIMAL</String>
</Annotation>
</Property>
<Annotation Term="Integration.CDataID">
<String>sap.epm:BestRunJuice_SampleModel</String>
</Annotation>
</EntityType>
def getModelMetadata(self, providerID):
modelMetadata = ModelMetadata()
urlMetadata = self.urlProviderRoot + "/" + providerID + "/$metadata"
response = self.oauth.get(urlMetadata)
xmlData = minidom.parseString(response.text.encode("UTF-8"))
for entityTypeElement in xmlData.getElementsByTagName("EntityType"):
nameAttribute = entityTypeElement.getAttribute("Name")
if nameAttribute.find("FactData") > -1:
# There will be more than one EntityType element, but only one named "FactData"
# all non-measure columns appear in the PropertyRef elements
dimList = []
for propertyRefElement in entityTypeElement.getElementsByTagName("PropertyRef"):
prnAtt = propertyRefElement.getAttribute("Name")
dimList.append(prnAtt)
# Property elements include all columns
for propertyElement in entityTypeElement.getElementsByTagName("Property"):
prAtt = propertyElement.getAttribute("Name")
dataType = ""
urlCurrDimMetadata = self.urlProviderRoot + "/" + providerID + "/" + prAtt + "Master"
currDimResponse = self.oauth.get(urlCurrDimMetadata)
currDimResponseJson = json.loads(currDimResponse.text)
if prAtt not in dimList:
# Measures and versions show up in the modelMetadata.measures list
if prAtt not in modelMetadata.dimensions:
modelMetadata.measures.append(prAtt)
else:
# modelMetadata.dateDimensions
# modelMetadata.accounts
# modelMetadata.versions
# modelMetadata.dimensions
isAccount = False
isVersion = False
isDate = False
mdMembers = {}
for cdMember in currDimResponseJson["value"]:
cmID = cdMember["ID"]
cmDesc = cdMember["Description"]
mdMembers[cmID] = cmDesc
if 'VERSION' in cdMember:
isVersion = True
elif "accType" in cdMember:
isAccount = True
elif "DATE" in cdMember:
isDate = True
if isAccount:
modelMetadata.accounts[prAtt] = mdMembers
elif isVersion:
modelMetadata.versions[prAtt] = mdMembers
elif isVersion:
modelMetadata.dateDimensions[prAtt] = mdMembers
else:
modelMetadata.dimensions[prAtt] = mdMembers
self.modelMetadata[providerID] = modelMetadata
return modelMetadata
def getModelMetadata(self, providerID):
try:
modelMetadata = ModelMetadata()
urlMetadata = self.urlProviderRoot + "/" + providerID + "/$metadata"
response = self.oauth.get(urlMetadata)
xmlData = minidom.parseString(response.text.encode("UTF-8"))
for entityTypeElement in xmlData.getElementsByTagName("EntityType"):
nameAttribute = entityTypeElement.getAttribute("Name")
if nameAttribute.find("FactData") > -1:
# There will be more than one EntityType element, but only one named "FactData"
# all non-measure columns appear in the PropertyRef elements
dimList = []
for propertyRefElement in entityTypeElement.getElementsByTagName("PropertyRef"):
prnAtt = propertyRefElement.getAttribute("Name")
dimList.append(prnAtt)
# Property elements include all columns
for propertyElement in entityTypeElement.getElementsByTagName("Property"):
prAtt = propertyElement.getAttribute("Name")
dataType = ""
# occurs oncce, so this little for loop will fetch us our only String grandchild of Property
for stringElement in propertyElement.getElementsByTagName("String"):
dataType = stringElement.childNodes[0].data
urlCurrDimMetadata = self.urlProviderRoot + "/" + providerID + "/" + prAtt + "Master"
currDimResponse = self.oauth.get(urlCurrDimMetadata)
currDimResponseJson = json.loads(currDimResponse.text)
# sort dimensions into the dimension dicts and measures into the measure list
if prAtt not in dimList:
# Measures and versions show up in the modelMetadata.measures list
if prAtt not in modelMetadata.dimensions:
modelMetadata.measures.append(prAtt)
else:
# modelMetadata.dateDimensions
# modelMetadata.accounts
# modelMetadata.versions
# modelMetadata.dimensions
isAccount = False
isVersion = False
isDate = False
mdMembers = {}
for cdMember in currDimResponseJson["value"]:
cmID = cdMember["ID"]
cmDesc = cdMember["Description"]
mdMembers[cmID] = cmDesc
if 'VERSION' in cdMember:
isVersion = True
elif "accType" in cdMember:
isAccount = True
elif "DATE" in cdMember:
isDate = True
if isAccount:
modelMetadata.accounts[prAtt] = mdMembers
elif isVersion:
modelMetadata.versions[prAtt] = mdMembers
elif isVersion:
modelMetadata.dateDimensions[prAtt] = mdMembers
else:
modelMetadata.dimensions[prAtt] = mdMembers
self.modelMetadata[providerID] = modelMetadata
dimList = list(modelMetadata.dimensions.keys())
self.addFilterProvider(providerID)
return modelMetadata
except Exception as e:
errorMsg = "Unknown error during token acquisition."
if e.status_code:
errorMsg = "%s Status code %s from server. %s" % (errorMsg, e.status_code, e.error)
raise RESTError(errorMsg)
else:
errorMsg = "%s %s" % (errorMsg, e.error)
raise Exception(errorMsg)
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
36 | |
25 | |
17 | |
13 | |
8 | |
7 | |
7 | |
6 | |
6 | |
6 |