public void addIndex(Object originalMetadataId, List<TempMetadataID> index) { if (this.getTableData().indexes == null) { this.getTableData().indexes = new LinkedList<TempMetadataID>(); } TempMetadataID id = new TempMetadataID(ID, Collections.EMPTY_LIST, Type.INDEX); id.getTableData().elements = index; id.setOriginalMetadataID(originalMetadataId); this.getTableData().indexes.add(id); }
public static GroupSymbol addScalarGroup(String name, TempMetadataStore metadata, GroupContext externalGroups, List<? extends Expression> symbols, boolean[] updatable) { GroupSymbol variables = new GroupSymbol(name); externalGroups.addGroup(variables); TempMetadataID tid = metadata.addTempGroup(name, symbols); tid.setMetadataType(Type.SCALAR); int i = 0; for (TempMetadataID cid : tid.getElements()) { cid.setMetadataType(Type.SCALAR); cid.setUpdatable(updatable[i++]); } variables.setMetadataID(tid); return variables; }
public QueryNode getVirtualPlan(Object groupID) throws TeiidComponentException, QueryMetadataException { if (this.queryNodes != null) { QueryNode node = this.queryNodes.get(groupID); if (node != null) { return node; } } if(groupID instanceof TempMetadataID && !(actualMetadata instanceof TempMetadataAdapter)) { TempMetadataID tid = (TempMetadataID)groupID; QueryNode queryNode = tid.getQueryNode(); if (queryNode != null) { return queryNode; } throw new QueryMetadataException(QueryPlugin.Event.TEIID31265, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31265, tid.getName())); } return this.actualMetadata.getVirtualPlan(groupID); }
public List getElementIDsInKey(Object keyID) throws TeiidComponentException, QueryMetadataException { if (keyID instanceof List) { return (List)keyID; } if (keyID instanceof TempMetadataID) { TempMetadataID id = (TempMetadataID)keyID; if (id.getMetadataType() == Type.INDEX) { return id.getElements(); } } return this.actualMetadata.getElementIDsInKey(keyID); }
/** * Get temporary element ID based on full element name * @param tempElement Element name * @return Metadata ID or null if not found */ public TempMetadataID getTempElementID(String tempElement) { int index = tempElement.lastIndexOf(Symbol.SEPARATOR); if(index < 0) { return null; } String groupName = tempElement.substring(0, index); TempMetadataID groupID = tempGroups.get(groupName); if(groupID != null) { for (TempMetadataID elementID : groupID.getElements()) { if(elementID.getID().equalsIgnoreCase(tempElement)) { return elementID; } } } return null; }
List<Class<?>> colTypes = null; for (int i = 0; i < tree.getKeyLength(); i++) { TempMetadataID col = tid.getElements().get(i); if (col.isAutoIncrement() && indexes[i] == -1) { if (colNames == null) { colNames = new ArrayList<String>(); colTypes = new ArrayList<Class<?>>(); colNames.add(col.getName()); colTypes.add(col.getType()); break; tid.setCardinality(tree.getRowCount()); tid.getTableData().dataModified(updateCount); return CollectionTupleSource.createUpdateCountArrayTupleSource(updateCount);
id.setQueryNode(qnode); id.setCardinality((int)metadata.getCardinality(viewId)); id.setOriginalMetadataID(viewId); id.setPrimaryKey(primaryKey); id.addUniqueKey(resolveIndex(metadata, id, key)); id.addIndex(index, resolveIndex(metadata, id, index)); List<KeyRecord> fbis = table.getFunctionBasedIndexes(); for (KeyRecord keyRecord : fbis) { id.addIndex(keyRecord, resolveIndex(metadata, id, keyRecord)); mappedExprs.put(ex, entry.getValue()); id.getTableData().setFunctionBasedExpressions(mappedExprs);
if (tid.getTableData().getModel() != TempMetadataAdapter.TEMP_MODEL) { tid.getTableData().setModel(null); List<TempMetadataID> elements = tid.getElements(); List<Integer> toRemove = new ArrayList<Integer>(); for (int i = elements.size()-1; i >= 0; i--) { TempMetadataID elem = elements.get(i); if (!elem.isAccessed()) { toRemove.add(i); Query query = QueryRewriter.createInlineViewQuery(gs, subCommand, metadata, ResolverUtil.resolveElementsInGroup(with.getGroupSymbol(), metadata)); for (int i : toRemove) { query.getSelect().getSymbols().set(i, new ExpressionSymbol(elements.get(i).getName(), new Constant(null, elements.get(i).getType()))); if (withCommand != null) { ((TempMetadataID)with.getGroupSymbol().getMetadataID()).getTableData().setModel(modelID); ((TempMetadataID)with.getGroupSymbol().getMetadataID()).getTableData().setModel(null); subPlan1 = optimize(qc1); qc1.setProcessorPlan(subPlan1); Number planCardinality = root.getEstimateNodeCardinality(); if (planCardinality != null) { ((TempMetadataID)with.getGroupSymbol().getMetadataID()).setCardinality(planCardinality.intValue()); ((TempMetadataID)with.getGroupSymbol().getMetadataID()).getTableData().setModel(modelID); this.withPlanningState.pushdownWith.put(with.getGroupSymbol().getName(), wqc);
@Override public TempMetadataID getCodeTableMetadataId( String codeTableName, String returnElementName, String keyElementName, String matTableName) throws TeiidComponentException, QueryMetadataException { ElementSymbol keyElement = new ElementSymbol(matTableName + ElementSymbol.SEPARATOR + keyElementName); ElementSymbol returnElement = new ElementSymbol(matTableName + ElementSymbol.SEPARATOR + returnElementName); keyElement.setType(DataTypeManager.getDataTypeClass(metadata.getElementRuntimeTypeName(metadata.getElementID(codeTableName + ElementSymbol.SEPARATOR + keyElementName)))); returnElement.setType(DataTypeManager.getDataTypeClass(metadata.getElementRuntimeTypeName(metadata.getElementID(codeTableName + ElementSymbol.SEPARATOR + returnElementName)))); TempMetadataID id = this.tableStore.getMetadataStore().getTempGroupID(matTableName); if (id == null) { synchronized (this) { id = this.tableStore.getMetadataStore().addTempGroup(matTableName, Arrays.asList(keyElement, returnElement), false, true); String queryString = Reserved.SELECT + ' ' + new ElementSymbol(keyElementName) + " ," + new ElementSymbol(returnElementName) + ' ' + Reserved.FROM + ' ' + new GroupSymbol(codeTableName); //$NON-NLS-1$ id.setQueryNode(new QueryNode(queryString)); id.setPrimaryKey(id.getElements().subList(0, 1)); CacheHint hint = new CacheHint(true, null); id.setCacheHint(hint); } } return id; }
public static void addAdditionalMetadata(Create create, TempMetadataID tempTable) { if (!create.getPrimaryKey().isEmpty()) { ArrayList<TempMetadataID> primaryKey = new ArrayList<TempMetadataID>(create.getPrimaryKey().size()); for (ElementSymbol symbol : create.getPrimaryKey()) { Object mid = symbol.getMetadataID(); if (mid instanceof TempMetadataID) { primaryKey.add((TempMetadataID)mid); } else if (mid instanceof Column) { //TODO: this breaks our normal metadata usage primaryKey.add(tempTable.getElements().get(((Column)mid).getPosition() - 1)); } } tempTable.setPrimaryKey(primaryKey); } for (int i = 0; i < create.getColumns().size(); i++) { Column column = create.getColumns().get(i); TempMetadataID tid = tempTable.getElements().get(i); if (column.isAutoIncremented()) { tid.setAutoIncrement(true); } if (column.getNullType() == NullType.No_Nulls) { tid.setNotNull(true); } } }
metadataID = ((TempMetadataID)metadataID).getOriginalMetadataID(); TempMetadataID elementID = new TempMetadataID(elementName, symbol.getType(), metadataID); elementID.setTempTable(isTempTable); return elementID;
id.setOriginalMetadataID(storedProcedureCommand.getProcedureID()); if (!accessPatternElementNames.isEmpty()) { List<TempMetadataID> accessPatternIds = new LinkedList<TempMetadataID>(); id.setAccessPatterns(Arrays.asList(new TempMetadataID("procedure access pattern", accessPatternIds))); //$NON-NLS-1$
/** * Add a temp group and all it's elements * @param tempGroup Name of temp group * @param tempGroupDefinition optional definition if the tempGroup * param is the aliased name of a group * @param tempSymbols List of ElementSymbol in position order * @param isVirtual whether or not the group is a virtual group * @param isTempTable whether or not the group is a temporary table */ public TempMetadataID addTempGroup(String tempGroup, List<? extends Expression> tempSymbols, boolean isVirtual, boolean isTempTable) { // Add the temporary group List<TempMetadataID> elementIDs = new ArrayList<TempMetadataID>(tempSymbols.size()); for (Expression symbol : tempSymbols) { TempMetadataID elementID = createElementSymbol(tempGroup, symbol, isTempTable); elementIDs.add(elementID); } // Create group ID TempMetadataID groupID = new TempMetadataID(tempGroup, elementIDs, isVirtual?Type.VIRTUAL:Type.TEMP); this.tempGroups.put(tempGroup, groupID); return groupID; }
/** * @see org.teiid.query.metadata.QueryMetadataInterface#getElementIDsInAccessPattern(Object) */ public List getElementIDsInAccessPattern(Object accessPattern) throws TeiidComponentException, QueryMetadataException { if (accessPattern instanceof TempMetadataID) { TempMetadataID id = (TempMetadataID)accessPattern; if (id.getElements() != null) { return id.getElements(); } return Collections.EMPTY_LIST; } return this.actualMetadata.getElementIDsInAccessPattern(accessPattern); }
QueryMetadataException, QueryResolverException, QueryValidatorException { if (id.getCacheHint() != null && !id.getTableData().updateCacheHint(((Table)viewId).getLastModified())) { return; hint.setScope(scope); id.setCacheHint(hint);
variable.setType(exception?DataTypeManager.DefaultDataClasses.OBJECT:DataTypeManager.getDataTypeClass(typeName)); variable.setGroupSymbol(variables); TempMetadataID id = new TempMetadataID(variable.getName(), exception?Exception.class:variable.getType()); id.setUpdatable(true); variable.setMetadataID(id);
public String getElementRuntimeTypeName(Object elementID) throws TeiidComponentException, QueryMetadataException { if(elementID instanceof TempMetadataID) { TempMetadataID tempID = (TempMetadataID)elementID; if (tempID.getType() != null) { return DataTypeManager.getDataTypeName( tempID.getType() ); } throw new AssertionError("No type set for element " + elementID); //$NON-NLS-1$ } return this.actualMetadata.getElementRuntimeTypeName(elementID); }
/** * Remove unused projects by replacing with null * @param with * @param subCommand * @param elements * @param toRemove * @return * @throws QueryMetadataException * @throws QueryResolverException * @throws TeiidComponentException */ private Query removeUnusedProjection(WithQueryCommand with, QueryCommand subCommand, List<TempMetadataID> elements, List<Integer> toRemove) throws QueryMetadataException, QueryResolverException, TeiidComponentException { Query query = null; if (!(subCommand instanceof Query) || subCommand.getOrderBy() != null) { GroupSymbol gs = new GroupSymbol("x"); //$NON-NLS-1$ gs = RulePlaceAccess.recontextSymbol(gs, context.getGroups()); query = QueryRewriter.createInlineViewQuery(gs, subCommand, metadata, ResolverUtil.resolveElementsInGroup(with.getGroupSymbol(), metadata)); } else { query = (Query)subCommand; } for (int i : toRemove) { query.getSelect().getSymbols().set(i, new ExpressionSymbol(elements.get(i).getName(), new Constant(null, elements.get(i).getType()))); } return query; }
if (isImplicitGlobal) { TempMetadataID tid = context.getGlobalTableStore().getGlobalTempTableMetadataId(metadataID); matTableName = tid.getID(); hint = tid.getCacheHint(); matMetadataId = tid; } else {
matTableName = RelationalPlanner.MAT_PREFIX+table.getFullName().toUpperCase(); TempMetadataID id = globalStore.getGlobalTempTableMetadataId(matTableName); if (id != null && id.getCacheHint() != null && id.getCacheHint().getScope() != null && Scope.VDB.compareTo(id.getCacheHint().getScope()) > 0) { updated = info.getUpdateTime()==-1?null:new Timestamp(info.getUpdateTime()); if (id != null) { cardinaltity = (int)Math.min(Integer.MAX_VALUE, id.getCardinality());