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;
 
 import java.util.List;
 
 import  org.apache.olingo.commons.api.edm.EdmEntitySet;
 import  org.apache.olingo.commons.api.edm.EdmEntityType;
 import  org.apache.olingo.commons.api.edm.EdmNavigationProperty;
 import  org.apache.olingo.server.api.uri.UriParameter;
 import  org.apache.olingo.server.api.uri.UriResource;
 import  org.apache.olingo.server.api.uri.UriResourceEntitySet;
 import  org.apache.olingo.server.api.uri.UriResourceKind;
 import  org.apache.olingo.server.api.uri.UriResourceNavigation;
 import  org.apache.olingo.server.api.uri.UriResourcePrimitiveProperty;
 import  org.apache.olingo.server.api.uri.queryoption.CountOption;
 import  org.apache.olingo.server.api.uri.queryoption.FilterOption;
 import  org.apache.olingo.server.api.uri.queryoption.OrderByItem;
 import  org.apache.olingo.server.api.uri.queryoption.OrderByOption;
 import  org.apache.olingo.server.api.uri.queryoption.SelectItem;
 import  org.apache.olingo.server.api.uri.queryoption.SelectOption;
 import  org.apache.olingo.server.api.uri.queryoption.SkipOption;
 import  org.apache.olingo.server.api.uri.queryoption.TopOption;
 
 	private final MetadataStore metadata;
 	private boolean prepared = true;
 	private final ArrayList<SQLParamparams = new ArrayList<SQLParam>();
 	private final AtomicInteger groupCount = new AtomicInteger(1);
 
 	private FromClause fromClause;
 	private Criteria criteria;
 	private EdmEntitySet edmEntitySet;
 	private Table edmEntityTable;
 	private SkipOption skipOption;
 	private TopOption topOption;
 	private boolean countOption;
 	private OrderBy orderBy;
 	private boolean selectionComplete;
 
 	public ODataSQLBuilder(MetadataStore metadataboolean prepared) {
 		this. = metadata;
 		this. = prepared;
 	}
 
 	public EdmEntitySet getEntitySet() {
 		return this.;
 	}
 
		return this.;
	}
		return this.;
	}
	public boolean isCountQuery() {
		return ;
	}
	public Integer getSkip() {
		if ( == null) {
			return null;
		}
		return .getValue();
	}
	public Integer getTop() {
		if ( == null) {
			return null;
		}
		return .getValue();
	}
	public Query selectQuery(boolean countQuerythrows TeiidException {
		if (!this..isEmpty()) {
			throw this..get(0);
		}
		Select select = new Select();//
		for (ProjectedColumn column:this.) {
		    select.addSymbol(column.getExpression());
		}
		Query query = new Query();
		From from = new From();
		query.setSelect(select);
		query.setFrom(from);
		query.setCriteria(this.);
		if (countQuery) {
			AggregateSymbol aggregateSymbol = new AggregateSymbol(...name(), falsenull);
			select = new Select(Arrays.asList(aggregateSymbol));
			query.setSelect(select);
		}
		else {
			if (this. != null && this. != null) {
				query.setLimit(new Limit(new Constant(this..getValue()), new Constant(this..getValue())));
			}
			else if (this. != null) {
				query.setLimit(new Limit(new Constant(0), new Constant(this..getValue())));
			}
		}
		if (this. != null & !countQuery) {
			query.setOrderBy(this.);
		}
		return query;
	}
		return this.;
	}
	private Table findTable(EdmEntitySet entitySetMetadataStore store) {
		return findTable(entitySet.getEntityType(), store);
	}
	private Table findTable(EdmEntityType entityTypeMetadataStore store) {
		Schema schema = store.getSchema(entityType.getNamespace());
		return schema.getTable(entityType.getName());
	}
	private Column findColumn(Table tableString propertyName) {
		return table.getColumnByName(propertyName);
	}
		return this.;
	}
	public void visit(UriResourceEntitySet info) {
		this. = info.getEntitySet();
		this. = new GroupSymbol("g0"this..getFullName()); //$NON-NLS-1$
		// URL is like /entitySet(key)s
		if (info.getKeyPredicates() != null && !info.getKeyPredicates().isEmpty()) {
			List<UriParameter> keys = info.getKeyPredicates();
			try {
catch (TeiidException e) {
				this..add(e);
			}
		}
	}
	private Criteria buildEntityKeyCriteria(Table tableGroupSymbol entityGroupList<UriParameter> keysthrows TeiidException {
		KeyRecord pk = table.getPrimaryKey();
		if (keys.size() == 1) {
			if (pk.getColumns().size() != 1) {
			}
			Column column = table.getPrimaryKey().getColumns().get(0);
			return new CompareCriteria(new ElementSymbol(column.getName(), entityGroup), .visitor.getExpression(keys.get(0).getExpression()));
		}
		// complex (multi-keyed)
		List<CriteriacritList = new ArrayList<Criteria>();
		if (pk.getColumns().size() != keys.size()) {
		}
		for (UriParameter key : keys) {
			Column column = findColumn(tablekey.getName());
			critList.add(new CompareCriteria(new ElementSymbol(column.getName(), entityGroup), .visitor.getExpression(key.getExpression())));
		}
		return new CompoundCriteria(.critList);
	}
	public void visit(SkipOption option) {
		this. = option;
	}
	public void visit(TopOption option) {
		this. = option;
	}
	public void visit(CountOption info) {
		this. = info.getValue();
	}
	public void visit(SelectOption option) {
	    if (this.) {
	        return;
	    }
		if (option == null) {
			// default select columns
		}
		else {
			for (SelectItem si:option.getSelectItems()) {
				if (si.isStar()) {
					continue;
				}
				UriResource resource = ResourcePropertyCollector.getUriResource(si.getResourcePath());
				if (resource.getKind() != UriResourceKind.primitiveProperty) {
					continue;
				}
				UriResourcePrimitiveProperty primitiveProp = (UriResourcePrimitiveProperty)resource;
				addSelectColumn(new ElementSymbol(primitiveProp.getProperty().getName(), this.));
			}
		}
	}
	private void addAllColumns() {
		for (final Column column : this..getColumns()) {
		}
	}
	private void addSelectColumn(final Expression expr) {
		addProjectedColumn(exprtrue);
	}
	private void addProjectedColumn(final Expression exprfinal boolean visibility) {
	    int i = 0;
	    for (i = 0; i < this..size(); i++) {
	        ProjectedColumn pc = this..get(i);
	        if (pc.getExpression().equals(expr)) {
	            this..remove(i);
	            break;
	        }
	    }
				return expr;
			}
			public boolean isVisible() {
				return visibility;
			}
		});
	}
	public void visit(OrderByOption option) {
		this. = new OrderBy();
		if (option == null || option.getOrders().isEmpty()) {
			// provide implicit ordering for cursor logic
			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.);
				this..addVariable(expr);
				addProjectedColumn(exprfalse);
			}
		}
		else {
			List<OrderByItem> orderBys = option.getOrders();
			for (OrderByItem orderby:orderBys) {
				Expression expr = visitor.getExpression(orderby.getExpression());
				this..addVariable(expr, !orderby.isDescending());
				addProjectedColumn(exprfalse);
			}
		}
	}
	public void visit(FilterOption info) {
		this. = (Criteria)visitor.getExpression(info.getExpression());
	}
	public void visit(UriResourceNavigation info) {
		// typically navigation only happens in $entity-id situations,
		EdmNavigationProperty property = info.getProperty();
		String navigationName = property.getName();
		EdmEntityType type = property.getType();
    	String aliasGroup = getNextAliasGroup();
    	for (ForeignKey fk : this..getForeignKeys()) {
    		if (fk.getName().equals(navigationName)) {
    			List<StringrefColumns = fk.getReferenceColumns();
    			if (refColumns == null) {
    				refColumns = getColumnNames(this..getPrimaryKey().getColumns());
    			}
    			Table joinTable = findTable(typethis.);
    			GroupSymbol joinGroup = new GroupSymbol(aliasGroupjoinTable.getFullName());
    	    	List<UriParameter> keys = info.getKeyPredicates();
    	    	try {
					if (keys != null && keys.size() > 0) {
						// here the previous entityset is verbose; need to be canonicalized
					   	this. = buildEntityKeyCriteria(joinTablejoinGroupkeys);
					   	this. = new UnaryFromClause(joinGroup);
					}
					else {
						this. = addJoinTable(.joinGroupthis.refColumnsgetColumnNames(fk.getColumns()));
					}
	    			this. = joinGroup;
	    			this. = joinTable;
catch (TeiidException e) {
					this..add(e);
				}
    			break;
    		}
    	}
	}
		String aliasGroup = "g"+this..getAndIncrement(); //$NON-NLS-1$
		return aliasGroup;
	}
	private FromClause addJoinTable(final JoinType joinType,
			final GroupSymbol joinGroupfinal 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 new JoinPredicate(this.new UnaryFromClause(joinGroup), joinTypecrit);
	}
	static List<StringgetColumnNames(List<Columncolumns){
		ArrayList<StringcolumnNames = new ArrayList<String>();
		for (Column column:columns) {
			columnNames.add(column.getName());
		}
		return columnNames;
	}
    @Override
    public void visit(UriResourcePrimitiveProperty info) {
        addSelectColumn(new ElementSymbol(info.getProperty().getName(), this.));
        this. = true;
    }
New to GrepCode? Check out our FAQ X