Skip to content

Commit

Permalink
TEIID-2685: Adding SAP-NW, a Odata based translator that understands …
Browse files Browse the repository at this point in the history
…the SAP metadata
  • Loading branch information
rareddy committed Oct 4, 2013
1 parent 8efbb1b commit e5d81df
Show file tree
Hide file tree
Showing 11 changed files with 496 additions and 57 deletions.
Expand Up @@ -68,6 +68,7 @@ connect
/profile=ha/subsystem=teiid/translator=map-cache:add(module=org.jboss.teiid.translator.object)
/profile=ha/subsystem=teiid/translator=google-spreadsheet:add(module=org.jboss.teiid.translator.google)
/profile=ha/subsystem=teiid/translator=odata:add(module=org.jboss.teiid.translator.odata)
/profile=ha/subsystem=teiid/translator=sap-nw-gateway:add(module=org.jboss.teiid.translator.odata)
/profile=ha/subsystem=teiid/translator=mongodb:add(module=org.jboss.teiid.translator.mongodb)
/profile=ha/subsystem=teiid/translator=cassandra:add(module=org.jboss.teiid.translator.cassandra)

Expand Down
Expand Up @@ -64,6 +64,7 @@ connect
/subsystem=teiid/translator=map-cache:add(module=org.jboss.teiid.translator.object)
/subsystem=teiid/translator=google-spreadsheet:add(module=org.jboss.teiid.translator.google)
/subsystem=teiid/translator=odata:add(module=org.jboss.teiid.translator.odata)
/subsystem=teiid/translator=sap-nw-gateway:add(module=org.jboss.teiid.translator.odata)
/subsystem=teiid/translator=mongodb:add(module=org.jboss.teiid.translator.mongodb)
/subsystem=teiid/translator=cassandra:add(module=org.jboss.teiid.translator.cassandra)

Expand Down
Expand Up @@ -357,6 +357,7 @@
<translator name="infinispan-cache" module="org.jboss.teiid.translator.object"/>
<translator name="map-cache" module="org.jboss.teiid.translator.object"/>
<translator name="odata" module="org.jboss.teiid.translator.odata"/>
<translator name="sap-nw-gateway" module="org.jboss.teiid.translator.odata"/>
<translator name="mongodb" module="org.jboss.teiid.translator.mongodb"/>
<translator name="cassandra" module="org.jboss.teiid.translator.cassandra"/>
</subsystem>
Expand Down
Expand Up @@ -75,11 +75,22 @@ public class ODataExecutionFactory extends ExecutionFactory<ConnectionFactory, W
protected Map<String, FunctionModifier> functionModifiers = new TreeMap<String, FunctionModifier>(String.CASE_INSENSITIVE_ORDER);
private String databaseTimeZone;
private TimeZone timeZone = DEFAULT_TIME_ZONE;
private boolean supportsOdataFilter;
private boolean supportsOdataOrderBy;
private boolean supportsOdataCount;
private boolean supportsOdataSkip;
private boolean supportsOdataTop;

public ODataExecutionFactory() {
setSourceRequiredForMetadata(true);
setSupportsOrderBy(true);


setSupportsOdataCount(true);
setSupportsOdataFilter(true);
setSupportsOdataOrderBy(true);
setSupportsOdataSkip(true);
setSupportsOdataTop(true);

registerFunctionModifier(SourceSystemFunctions.CONVERT, new AliasModifier("cast")); //$NON-NLS-1$
registerFunctionModifier(SourceSystemFunctions.LOCATE, new AliasModifier("indexof")); //$NON-NLS-1$
registerFunctionModifier(SourceSystemFunctions.LCASE, new AliasModifier("tolower")); //$NON-NLS-1$
Expand Down Expand Up @@ -121,14 +132,17 @@ public void getMetadata(MetadataFactory metadataFactory, WSConnection conn) thro

try {
EdmDataServices eds = new EdmxFormatParser().parseMetadata(StaxUtil.newXMLEventReader(new InputStreamReader(out.getBinaryStream())));
ODataMetadataProcessor metadataProcessor = new ODataMetadataProcessor();
ODataMetadataProcessor metadataProcessor = getMetadataProcessor();
PropertiesUtils.setBeanProperties(metadataProcessor, metadataFactory.getModelProperties(), "importer"); //$NON-NLS-1$
metadataProcessor.getMetadata(metadataFactory, eds);
} catch (SQLException e) {
throw new TranslatorException(e, e.getMessage());
}
}

protected ODataMetadataProcessor getMetadataProcessor() {
return new ODataMetadataProcessor();
}

@Override
public ResultSetExecution createResultSetExecution(QueryExpression command, ExecutionContext executionContext, RuntimeMetadata metadata, WSConnection connection) throws TranslatorException {
Expand Down Expand Up @@ -199,29 +213,74 @@ public List<String> getDefaultSupportedFunctions(){
return Arrays.asList(new String[] { "+", "-", "*", "/" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}

@TranslatorProperty(display="Supports $Filter", description="True, $filter is supported", advanced=true)
public boolean supportsOdataFilter() {
return supportsOdataFilter;
}

public void setSupportsOdataFilter(boolean supports) {
this.supportsOdataFilter = supports;
}

@TranslatorProperty(display="Supports $OrderBy", description="True, $orderby is supported", advanced=true)
public boolean supportsOdataOrderBy() {
return supportsOdataOrderBy;
}

public void setSupportsOdataOrderBy(boolean supports) {
this.supportsOdataOrderBy = supports;
}

@TranslatorProperty(display="Supports $count", description="True, $count is supported", advanced=true)
public boolean supportsOdataCount() {
return supportsOdataCount;
}

public void setSupportsOdataCount(boolean supports) {
this.supportsOdataCount = supports;
}

@TranslatorProperty(display="Supports $skip", description="True, $skip is supported", advanced=true)
public boolean supportsOdataSkip() {
return supportsOdataSkip;
}

public void setSupportsOdataSkip(boolean supports) {
this.supportsOdataSkip = supports;
}

@TranslatorProperty(display="Supports $top", description="True, $top is supported", advanced=true)
public boolean supportsOdataTop() {
return supportsOdataTop;
}

public void setSupportsOdataTop(boolean supports) {
this.supportsOdataTop = supports;
}

@Override
public boolean supportsCompareCriteriaEquals() {
return true;
return this.supportsOdataFilter;
}

@Override
public boolean supportsCompareCriteriaOrdered() {
return true;
return supportsOdataFilter;
}

@Override
public boolean supportsIsNullCriteria() {
return true;
return supportsOdataFilter;
}

@Override
public boolean supportsOrCriteria() {
return true;
return supportsOdataFilter;
}

@Override
public boolean supportsNotCriteria() {
return true;
return supportsOdataFilter;
}

@Override
Expand All @@ -234,29 +293,35 @@ public boolean supportsQuantifiedCompareCriteriaAll() {
return false; // TODO:FOR ALL
}

@Override
@TranslatorProperty(display="Supports ORDER BY", description="True, if this connector supports ORDER BY", advanced=true)
public boolean supportsOrderBy() {
return supportsOdataOrderBy;
}

@Override
public boolean supportsOrderByUnrelated() {
return true;
return this.supportsOdataOrderBy;
}

@Override
public boolean supportsAggregatesCount() {
return true;
return supportsOdataCount;
}

@Override
public boolean supportsAggregatesCountStar() {
return true;
return supportsOdataCount;
}

@Override
public boolean supportsRowLimit() {
return true;
return supportsOdataTop;
}

@Override
public boolean supportsRowOffset() {
return true;
return supportsOdataSkip;
}

@Override
Expand Down
Expand Up @@ -63,7 +63,7 @@ public void getMetadata(MetadataFactory mf, EdmDataServices eds) throws Translat

// add entity sets as tables
for (EdmEntitySet entitySet:container.getEntitySets()) {
addEntitySetAsTable(mf, entitySet.getName(), entitySet.getType());
addEntitySetAsTable(mf, entitySet);
}

// build relations ships among tables
Expand All @@ -80,16 +80,20 @@ public void getMetadata(MetadataFactory mf, EdmDataServices eds) throws Translat
}
}


Table addEntitySetAsTable(MetadataFactory mf, String name, EdmEntityType entity) throws TranslatorException {
Table table = mf.addTable(name);
table.setProperty(ENTITY_TYPE, entity.getFullyQualifiedTypeName());
protected Table buildTable(MetadataFactory mf, EdmEntitySet entitySet) {
Table table = mf.addTable(entitySet.getName());
table.setSupportsUpdate(true);
return table;
}

protected Table addEntitySetAsTable(MetadataFactory mf, EdmEntitySet entitySet) throws TranslatorException {
Table table = buildTable(mf, entitySet);
table.setProperty(ENTITY_TYPE, entitySet.getType().getFullyQualifiedTypeName());

// add columns
for (EdmProperty ep:entity.getProperties().toList()) {
for (EdmProperty ep:entitySet.getType().getProperties().toList()) {
if (ep.getType().isSimple()) {
addPropertyAsColumn(mf, table, ep);
addPropertyAsColumn(mf, table, ep, entitySet);
}
else {
// this is complex type, i.e treat them as embeddable in the same table add all columns.
Expand All @@ -99,19 +103,19 @@ Table addEntitySetAsTable(MetadataFactory mf, String name, EdmEntityType entity)
EdmComplexType embedded = (EdmComplexType)ep.getType();
for (EdmProperty property:embedded.getProperties().toList()) {
if (property.getType().isSimple()) {
Column column = addPropertyAsColumn(mf, table, property, ep.getName());
Column column = addPropertyAsColumn(mf, table, property, entitySet, ep.getName());
column.setProperty(COMPLEX_TYPE, embedded.getName()); // complex type
column.setProperty(COLUMN_GROUP, ep.getName()); // name of parent column
}
else {
throw new TranslatorException(ODataPlugin.Util.gs(ODataPlugin.Event.TEIID17002, name, ep.getName()));
throw new TranslatorException(ODataPlugin.Util.gs(ODataPlugin.Event.TEIID17002, entitySet.getName(), ep.getName()));
}
}
}
}

// add PK
mf.addPrimaryKey("PK", entity.getKeys(), table); //$NON-NLS-1$
mf.addPrimaryKey("PK", entitySet.getType().getKeys(), table); //$NON-NLS-1$
return table;
}

Expand Down Expand Up @@ -299,28 +303,34 @@ private boolean matchesWithPkOrUnique(List<String> names, Table table) {
return false;
}

private Column addPropertyAsColumn(MetadataFactory mf, Table table, EdmProperty ep) {
return addPropertyAsColumn(mf, table, ep, null);
private Column addPropertyAsColumn(MetadataFactory mf, Table table, EdmProperty ep, EdmEntitySet entitySet) {
return addPropertyAsColumn(mf, table, ep, entitySet, null);
}

private Column addPropertyAsColumn(MetadataFactory mf, Table table, EdmProperty ep, String prefix) {
String columnName = ep.getName();
if (prefix != null) {
columnName = prefix+"_"+columnName; //$NON-NLS-1$
}
Column c = mf.addColumn(columnName, ODataTypeManager.teiidType(ep.getType().getFullyQualifiedTypeName()), table);
c.setNameInSource(ep.getName());
private Column addPropertyAsColumn(MetadataFactory mf, Table table, EdmProperty ep, EdmEntitySet entitySet, String prefix) {
Column c = buildColumn(mf, table, ep, entitySet, prefix);
if (ep.getFixedLength() != null) {
c.setFixedLength(ep.getFixedLength());
}
c.setNullType(ep.isNullable()?NullType.Nullable:NullType.No_Nulls);
if (ep.getMaxLength() != null) {
c.setLength(ep.getMaxLength());
}
c.setUpdatable(true);

return c;
}

@SuppressWarnings("unused")
protected Column buildColumn(MetadataFactory mf, Table table, EdmProperty ep, EdmEntitySet entitySet, String prefix) {
String columnName = ep.getName();
if (prefix != null) {
columnName = prefix+"_"+columnName; //$NON-NLS-1$
}
Column c = mf.addColumn(columnName, ODataTypeManager.teiidType(ep.getType().getFullyQualifiedTypeName()), table);
c.setNameInSource(ep.getName());
c.setUpdatable(true);
return c;
}

void addFunctionImportAsProcedure(MetadataFactory mf, EdmFunctionImport function) throws TranslatorException {
Procedure procedure = mf.addProcedure(function.getName());
Expand Down

0 comments on commit e5d81df

Please sign in to comment.