void ConditionEncoder::LookupExpressionTransformation() { MEASURE_FET("ConditionEncoder::LookupExpressionTransformation(...)"); ExpressionColumn* vcec = dynamic_cast<ExpressionColumn*>(desc->attr.vc); VirtualColumnBase::VarMap col_desc = vcec->GetLookupCoordinates(); MILookupIterator mit; mit.Set(NULL_VALUE_64); desc->encoded = false; bool null_positive = desc->CheckCondition(mit); ValueSet valset; in_type = ColumnType(RC_NUM); int code = 0; do { mit.Set(code); if(desc->CheckCondition(mit)) { if(mit.IsValid()) valset.Add64(code); } code++; } while(mit.IsValid()); if(!null_positive) { PhysicalColumn* col = col_desc.GetTabPtr()->GetColumn(col_desc.col_ndx); desc->attr.vc = new SingleColumn(col, vcec->GetMultiIndex(), col_desc.var.tab, col_desc.col_ndx, col_desc.GetTabPtr().get(), vcec->GetDim()); desc->attr.vc_id = desc->table->AddVirtColumn(desc->attr.vc); desc->op = O_IN; desc->val1.vc = new InSetColumn(in_type, NULL, valset); desc->val1.vc_id = desc->table->AddVirtColumn(desc->val1.vc); desc->encoded = true; } else if(valset.IsEmpty()) { PhysicalColumn* col = col_desc.GetTabPtr()->GetColumn(col_desc.col_ndx); desc->attr.vc = new SingleColumn(col, vcec->GetMultiIndex(), col_desc.var.tab, col_desc.col_ndx, col_desc.GetTabPtr().get(), vcec->GetDim()); desc->attr.vc_id = desc->table->AddVirtColumn(desc->attr.vc); desc->op = O_IS_NULL; desc->encoded = true; } else { // both nulls and not-nulls are positive - no single operator possible // do not encode desc->encoded = false; } }