Example #1
0
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();
}