void ConditionEncoder::EncodeIfPossible(Descriptor& desc, bool for_rough_query, bool additional_nulls) { MEASURE_FET("ConditionEncoder::EncodeIfPossible(...)"); if(desc.done || desc.IsDelayed()) return; if(desc.IsType_OrTree()) { desc.tree->root->EncodeIfPossible(for_rough_query, additional_nulls); desc.Simplify(); return; } if(!desc.attr.vc || desc.attr.vc->GetDim() == -1) return; SingleColumn* vcsc = (desc.attr.vc->IsSingleColumn() ? static_cast<SingleColumn*>(desc.attr.vc) : NULL); bool encode_now = false; if(desc.IsType_AttrAttr() && IsSimpleEqualityOperator(desc.op) && vcsc) { // special case: simple operator on two compatible numerical columns SingleColumn* vcsc2 = NULL; if(desc.val1.vc->IsSingleColumn()) vcsc2 = static_cast<SingleColumn*>(desc.val1.vc); if(vcsc2 == NULL || vcsc->GetVarMap()[0].GetTabPtr()->TableType() != RC_TABLE || vcsc2->GetVarMap()[0].GetTabPtr()->TableType() != RC_TABLE) return; if( vcsc->Type().IsString() || vcsc->Type().IsLookup() || vcsc2->Type().IsString() || vcsc2->Type().IsLookup()) // excluding strings return; bool is_timestamp1 = (vcsc->Type().GetTypeName() == RC_TIMESTAMP); bool is_timestamp2 = (vcsc2->Type().GetTypeName() == RC_TIMESTAMP); if(is_timestamp1 || is_timestamp2 && !(is_timestamp1 && is_timestamp2)) // excluding timestamps compared with something else return; encode_now =(vcsc->Type().IsDateTime() && vcsc2->Type().IsDateTime()) || (vcsc->Type().IsFloat() && vcsc2->Type().IsFloat()) || (vcsc->Type().IsFixed() && vcsc2->Type().IsFixed() && vcsc->Type().GetScale() == vcsc2->Type().GetScale()); // excluding floats } if(!encode_now) { ExpressionColumn* vcec = dynamic_cast<ExpressionColumn*>(desc.attr.vc); if(vcec == NULL && (vcsc == NULL || vcsc->GetVarMap()[0].GetTabPtr()->TableType() != RC_TABLE)) return; if(vcec != NULL) { encode_now = (vcec->ExactlyOneLookup() && (desc.op == O_IS_NULL || desc.op == O_NOT_NULL || (desc.val1.vc && desc.val1.vc->IsConst() && (desc.val2.vc == NULL || desc.val2.vc->IsConst())))); } else { encode_now = (desc.IsType_AttrValOrAttrValVal() || desc.IsType_AttrMultiVal() || desc.op == O_IS_NULL || desc.op == O_NOT_NULL ) && desc.attr.vc->GetVarMap()[0].GetTabPtr()->TableType() == RC_TABLE && (!for_rough_query || !desc.IsType_Subquery()); } } if(!encode_now) return; ///////////////////////////////////////////////////////////////////////////////////// // Encoding itself ConditionEncoder ce(additional_nulls); ce(desc); desc.Simplify(); }