bool OperationNodeScript::handleTableCases(int index, const NodeValue& vright, const QString &operation, const QString& relation, SymbolTable &symbols, ExecutionContext *ctx) { if ( index >= vright.size()) return false; QString expr; if ( SymbolTable::isNumerical(vright[index]) && SymbolTable::isDataLink(_value[index])){ expr = QString("%1(%2,%3,%4,%5)").arg(operation).arg(_value.toString(index)). arg(additionalInfo(ctx,_value.toString(index))). arg(vright.toDouble(index)).arg(relation); } else if (SymbolTable::isNumerical(_value[index]) && SymbolTable::isDataLink(vright[index])){ expr = QString("%1(%2,%3,%4, %5)").arg(operation).arg(vright.toString(index)). arg(additionalInfo(ctx,vright.toString(index))). arg(_value.toDouble(index)).arg(relation); } else if (SymbolTable::isDataLink(_value[index]) && SymbolTable::isDataLink(vright[index])) { expr = QString("%1(%2,%3,%4,%5)").arg(operation).arg(vright.toString(index)).arg(_value.toString(index)).arg(relation); } else if (SymbolTable::isDataLink(vright[index]) && SymbolTable::isNumerical(_value[index])) { expr = QString("%1(%2,%3,%4,%5)").arg(operation).arg(vright.toString(index)).arg(_value.toDouble(index)).arg(relation); } bool ok = Ilwis::commandhandler()->execute(expr, ctx,symbols); if ( !ok || ctx->_results.size() != 1) return false; _value = {ctx->_results[0], NodeValue::ctID}; return true; }
IlwisTypes OperationNodeScript::typesUsed(int index, const NodeValue& vright, SymbolTable &symbols) const { if ( index >= vright.size()) return itUNKNOWN; IlwisTypes tp1 = symbols.ilwisType(vright[index], vright.id(index)); IlwisTypes tp2 = symbols.ilwisType(_value[index], _value.id(index)); if ( tp1 == itUNKNOWN || tp2 == itUNKNOWN) return itUNKNOWN; return tp1 | tp2; }
bool AssignmentNode::evaluate(SymbolTable& symbols, int scope, ExecutionContext *ctx) { if ( _expression.isNull()) return false; try{ bool ok = _expression->evaluate(symbols, scope, ctx); if ( ok) { // we save the additional info as we might need it but for the rest clear // the results as the result of the assignment node is a newly filled ctx auto additionalInfo = ctx->_additionalInfo; ctx->clear(true); NodeValue val = _expression->value(); for(int i = 0; i < val.size(); ++i) { Symbol sym = symbols.getSymbol(val.id(i),SymbolTable::gaREMOVEIFANON); IlwisTypes tp = sym.isValid() ? sym._type : itUNKNOWN; QString result = _outParms->id(i); if ( hasType(tp, itILWISOBJECT | itCOLUMN)) { if ( hasType(tp, itRASTER)) { ok &= copyObject<RasterCoverage>(sym, result,symbols); } else if (hasType(tp, itFEATURE)) ok &= copyObject<FeatureCoverage>(sym, result,symbols); else if (hasType(tp, itCOORDSYSTEM)) ok &= copyObject<CoordinateSystem>(sym, result,symbols); else if ( hasType(tp, itDOMAIN)){ ok &= copyObject<Domain>(sym, result,symbols); } else if ( hasType(tp, itGEOREF)){ ok &= copyObject<GeoReference>(sym, result,symbols); } else if (hasType(tp, itTABLE | itCOLUMN)){ ok &= copyObject<Table>(sym, result,symbols,true); QSharedPointer<Selector> selector = _outParms->selector(result); if (!selector.isNull()){ QString varName = selector->variable(); ITable source = sym._var.value<ITable>(); QString oldColName = additionalInfo[source->name()].toString(); QVariant newT= symbols.getValue(result); ITable newTable = newT.value<ITable>(); ColumnDefinition& coldef = newTable->columndefinitionRef(oldColName); if ( coldef.isValid()){ coldef.name(varName); } } } if(!ok) { throw ErrorObject(QString(TR(ERR_OPERATION_FAILID1).arg("assignment"))); } QSharedPointer<ASTNode> specifier = _outParms->specifier(_outParms->id(i)); if ( !specifier.isNull()) { if ( specifier->noOfChilderen()!= 1) return ERROR2(ERR_NO_OBJECT_TYPE_FOR_2, "Output object", "expression"); store2Format(specifier, sym, result); } ctx->_results.push_back(result); } else { sym = symbols.getSymbol(result,SymbolTable::gaREMOVEIFANON); tp = sym.isValid() ? sym._type : itUNKNOWN; if ( tp == itUNKNOWN) { tp = Domain::ilwType(val); } } //ctx->addOutput(symbols,_expression->value(),result, tp, Resource()); } } return ok; } catch(const ErrorObject&){ } return false; }