Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source.
   * See the COPYRIGHT.txt file distributed with this work for information
   * regarding copyright ownership.  Some portions may be licensed
   * to Red Hat, Inc. under one or more contributor license agreements.
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  * 02110-1301 USA.
  */
 package org.teiid.olingo.service;
 
 import java.util.List;
 
 
 public class EntityResource {
     private Table table;
     private GroupSymbol groupSymbol;
     private EdmEntityType edmEntityType;
     private List<UriParameterkeyPredicates;
     private FromClause fromClause;
     private Criteria criteria;
     private List<EntityResourcesibilings = new ArrayList<EntityResource>();
     private List<EntityResourceexpands = new ArrayList<EntityResource>();
     private boolean distinct;
         
     public static EntityResource build(EdmEntityType type,
             List<UriParameterkeyPredicatesMetadataStore metadata,
             UniqueNameGenerator nameGeneratorboolean useAlias,
             UriInfo uriInfoURLParseService parseService)
             throws TeiidException {
         EntityResource resource = new EntityResource();
         return build(resourcetypekeyPredicatesmetadatanameGeneratoruseAliasuriInfoparseService);
     }
     
     public static EntityResource build(EntityResource resource,
             EdmEntityType typeList<UriParameterkeyPredicates,
             MetadataStore metadataUniqueNameGenerator nameGenerator,
             boolean useAliasUriInfo uriInfoURLParseService parseService)
             throws TeiidException {
 
         Table table = findTable(typemetadata);
         GroupSymbol gs = null;
         
         if (useAlias) {
             gs = new GroupSymbol(nameGenerator.getNextGroup(), table.getFullName()); //$NON-NLS-1$
         } else {
             gs = new GroupSymbol(table.getFullName()); //$NON-NLS-1$
         }
 
         resource.setTable(table);
         resource.setGroupSymbol(gs);
         resource.setEdmEntityType(type);
        resource.setKeyPredicates(keyPredicates);
        resource.setFromClause(new UnaryFromClause(gs));
        
        if (keyPredicates != null && !keyPredicates.isEmpty()) {
            Criteria criteria = EntityResource.buildEntityKeyCriteria(resource,
                    uriInfometadatanameGeneratorparseService);
            resource.setCriteria(criteria);
        }        
        return resource;
    }    
    
    static Table findTable(EdmEntityType entityTypeMetadataStore store) {
        FullQualifiedName fqn = entityType.getFullQualifiedName();
        // remove the vdb name
        String withoutVDB = fqn.getNamespace().substring(fqn.getNamespace().lastIndexOf('.')+1);
        Schema schema = store.getSchema(withoutVDB);
        return schema.getTable(entityType.getName());
    }    
    
    static Table findTable(EdmEntitySet entitySetMetadataStore store) {
        return findTable(entitySet.getEntityType(), store);
    }
            UriInfo uriInfoMetadataStore store,
            UniqueNameGenerator nameGeneratorURLParseService parseService)
            throws TeiidException {
        
        KeyRecord pk = resource.getTable().getPrimaryKey();
        if (resource.getKeyPredicates().size() == 1) {
            if (pk.getColumns().size() != 1) {
                throw new TeiidException(..,
                        ..gs(..resource.getTable().getFullName()));
            }
            Column column = resource.getTable().getPrimaryKey().getColumns().get(0);
            
            ODataExpressionToSQLVisitor visitor = new ODataExpressionToSQLVisitor(
                    resourcefalseuriInfostorenameGeneratornullparseService);
            return new CompareCriteria(new ElementSymbol(column.getName(),
                    resource.getGroupSymbol()), .,
                    visitor.getExpression(resource.getKeyPredicates().get(0)
                            .getExpression()));
        }
        // complex (multi-keyed)
        List<CriteriacritList = new ArrayList<Criteria>();
        if (pk.getColumns().size() != resource.getKeyPredicates().size()) {
            throw new TeiidException(..,
                    ..gs(..resource.getTable().getFullName()));
        }
        for (UriParameter key : resource.getKeyPredicates()) {
            Column column = findColumn(resource.getTable(), key.getName());
            ODataExpressionToSQLVisitor visitor = new ODataExpressionToSQLVisitor(
                    resourcefalseuriInfostorenameGeneratornullparseService);
            critList.add(new CompareCriteria(new ElementSymbol(column.getName(), resource.getGroupSymbol()), 
                    .visitor.getExpression(key.getExpression())));
        }
        return new CompoundCriteria(.critList);
    }
    
    static Column findColumn(Table tableString propertyName) {
        return table.getColumnByName(propertyName);
    }
    
    public void buildEntityKeyCriteria(UriInfo uriInfoMetadataStore metadata,
            UniqueNameGenerator nameGeneratorURLParseService parseServicethrows TeiidException {
        // URL is like /entitySet(key)s
        if (getKeyPredicates() != null && !getKeyPredicates().isEmpty()) {
            this. = buildEntityKeyCriteria(thisuriInfometadatanameGeneratorparseService);
        }        
    }
    
    public EntityResource() {
    }
    
    public EntityResource(Table tableGroupSymbol gsEdmEntityType type) {
        this. = table;
        this. = gs;
        this. = type;        
    }
    
    public Table getTable() {
        return ;
    }
        
    public GroupSymbol getGroupSymbol() {
        return ;
    }
        
    public EdmEntityType getEdmEntityType() {
        return ;
    }
    public FromClause getFromClause() {
        return ;
    }
    public void setFromClause(FromClause fromClause) {
        this. = fromClause;
    }
    public Criteria getCriteria() {
        return ;
    }
    public void setCriteria(Criteria criteria) {
        this. = criteria;
    }
    public void setTable(Table table) {
        this. = table;
    }
    public void setGroupSymbol(GroupSymbol groupSymbol) {
        this. = groupSymbol;
    }
    public void setEdmEntityType(EdmEntityType edmEntityType) {
        this. = edmEntityType;
    }
    
    void addAllColumns(boolean onlyPK) {
        if (onlyPK) {
            for (final Column column : getTable().getPrimaryKey().getColumns()) {
                addVisibleColumn(column.getName(), new ElementSymbol(column.getName(), getGroupSymbol()));
            }            
        }
        else {
            for (final Column column : getTable().getColumns()) {
                addVisibleColumn(column.getName(), new ElementSymbol(column.getName(), getGroupSymbol()));
            }
        }
    }
    void addVisibleColumn(final String columnNamefinal Expression expr) {
        addProjectedColumn(columnNameexprtrue);
    }
    
    void addProjectedColumn(final String columnName,
            final Expression exprboolean visibility) {
        EdmPropertyImpl edmProperty = (EdmPropertyImplthis..getProperty(columnName);
        addProjectedColumn(exprvisibilityedmProperty.getType(),
                edmProperty.isCollection());
    }
    void addProjectedColumn(final Expression exprfinal boolean visibility,
            final EdmType typefinal boolean collection) {
        
        int i = 0;
        for (i = 0; i < this..size(); i++) {
            ProjectedColumn pc = this..get(i);
            if (pc.getExpression().equals(expr)) {
                this..remove(i);
                break;
            }
        }
        this..add(new ProjectedColumn(exprvisibilitytypecollection));
    }
    
        OrderBy orderBy = new OrderBy();
        // provide implicit ordering for cursor logic
        KeyRecord record = this..getPrimaryKey();
        if (record == null) {
            // if PK is not available there MUST at least one unique key
            record = this..getUniqueKeys().get(0);
        }
        // provide implicit ordering for cursor logic
        for (Column column:record.getColumns()) {
            ElementSymbol expr = new ElementSymbol(column.getName(), this.);
            orderBy.addVariable(expr);
            addProjectedColumn(column.getName(), exprfalse);
        }
        return orderBy;
    }
        return ;
    }
        ArrayList<ProjectedColumncolumns = new ArrayList<ProjectedColumn>();
        columns.addAll(this.);
        for (EntityResource er:this.) {
            columns.addAll(er.getAllProjectedColumns());
        }
        for(EntityResource er:this.) {
            columns.addAll(er.getAllProjectedColumns());
        }
        
        return columns;
    }    
    
    public List<UriParametergetKeyPredicates() {
        return ;
    }
    public void setKeyPredicates(List<UriParameterkeyPredicates) {
        this. = keyPredicates;
    }
    
    public void addSibiling(EntityResource resource) {
        this..add(resource);
    }
    
    public List<EntityResourcegetSibilings(){
        return this.;
    }
    public void addExpand(EntityResource resource) {
        this..add(resource);
    }
    
    public List<EntityResourcegetExpands(){
        return this.;
    }
    
    public Query buildQuery() {
        
        Select select = new Select();
        AtomicInteger ordinal = new AtomicInteger(1);
        addProjectedColumns(selectordinalgetProjectedColumns());
        for (EntityResource sibiling:this.) {
            addProjectedColumns(selectordinalsibiling.getProjectedColumns());
        }
        for (EntityResource expand:this.) {
            addProjectedColumns(selectordinalexpand.getProjectedColumns());
        }        
        select.setDistinct(this.);
        Query query = new Query();
        From from = new From();
        
        from.addClause(this.);
        for (EntityResource sibiling:this.) {
            from.addClause(sibiling.getFromClause());
        }
        
        query.setSelect(select);
        query.setFrom(from);
        query.setCriteria(this.);
        
        return query;
    }
    private void addProjectedColumns(Select selectAtomicInteger ordinal,
            List<ProjectedColumnprojected) {
        for (ProjectedColumn column:projected) {
            select.addSymbol(column.getExpression());
            column.setOrdinal(ordinal.getAndIncrement());
        }
    }
    
    EntityResource joinTable(EntityResource joinResourceboolean isCollectionJoinType joinTypethrows TeiidException {
        ForeignKey fk = null;
        if (isCollection) {
            fk = joinFK(joinResource.getTable(), getTable());    
        }
        else {
            fk = joinFK(getTable(), joinResource.getTable());
        }
        
        if (fk == null) {
            throw new TeiidException("Fk not found");
        }
        
        FromClause fromClause;
        if (joinResource.getKeyPredicates() != null && joinResource.getKeyPredicates().size() > 0) {
            // here the previous entityset is verbose; need to be canonicalized
            fromClause = new UnaryFromClause(joinResource.getGroupSymbol());
        }
        else {
            fromClause = addJoinTable(joinTypejoinResourcethis);
        }
        
        joinResource.setFromClause(fromClause);        
        return joinResource;
    }
    
    static ForeignKey joinFK(Table currentTableTable referenceTable) {
        for (ForeignKey fk : currentTable.getForeignKeys()) {
            String refSchemaName = fk.getReferenceKey().getParent().getParent().getName();
            if (referenceTable.getParent().getName().equals(refSchemaName)
                    && referenceTable.getName().equals(fk.getReferenceTableName())) {
                return fk;
            }
        }
        return null;
    }    
    private static FromClause addJoinTable(final JoinType joinTypeEntityResource fromEntityResource to) {
        Criteria crit = buildJoinCriteria(fromto);
        if (crit == null) {
            crit = buildJoinCriteria(tofrom);
        }        
        return new JoinPredicate(to.getFromClause(), new UnaryFromClause(from.getGroupSymbol()), joinTypecrit);
    }
        Criteria criteria = null;
        for (ForeignKey fk:from.getTable().getForeignKeys()) {
            if (fk.getReferenceKey().getParent().equals(to.getTable())) {
                List<StringfkColumns = EntityResource.getColumnNames(fk.getColumns());
                if (fkColumns == null) {
                    fkColumns = EntityResource.getColumnNames(from.getTable().getPrimaryKey().getColumns());
                }                   
                
                List<StringpkColumns = EntityResource.getColumnNames(to.getTable().getPrimaryKey().getColumns());
                criteria = EntityResource.buildJoinCriteria(
                        from.getGroupSymbol(),
                        to.getGroupSymbol(), pkColumnsfkColumns);
            }
        } 
        return criteria;
    }
    
    static Criteria buildJoinCriteria(final GroupSymbol joinGroup,
            final GroupSymbol entityGroupList<StringpkColumns,
            List<StringrefColumns) {
        List<CriteriacritList = new ArrayList<Criteria>();
        for (int i = 0; i < refColumns.size(); i++) {
            critList.add(new CompareCriteria(new ElementSymbol(pkColumns.get(i), entityGroup), .new ElementSymbol(refColumns.get(i), joinGroup)));
        }
        Criteria crit = critList.get(0);
        for (int i = 1; i < critList.size(); i++) {
            crit = new CompoundCriteria(.critcritList.get(i));
        }
        return crit;
    }
    static List<StringgetColumnNames(List<Columncolumns){
        if (columns == null || columns.isEmpty()) {
            return null;
        }
        
        ArrayList<StringcolumnNames = new ArrayList<String>();
        for (Column column:columns) {
            columnNames.add(column.getName());
        }
        return columnNames;
    }
    public void setDistinct(boolean b) {
        this. = b;
    }
    
    public void addCriteria(Criteria criteria) {
        if (criteria != null) {
            if (this. == null) {
                this. = criteria;
            }
            else {
                this. = new CompoundCriteria(.this.criteria);
            }
        }
    }
    
    public String toString() {
        return .getFullName();
    }
New to GrepCode? Check out our FAQ X