Skip to content

Commit

Permalink
A lot of condition smartness is removed, getting more "raw". Fixed #676
Browse files Browse the repository at this point in the history
  • Loading branch information
rappen committed Apr 15, 2022
1 parent 20fad5e commit a424f67
Showing 1 changed file with 0 additions and 166 deletions.
166 changes: 0 additions & 166 deletions FetchXmlBuilder/Controls/conditionControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,47 +78,6 @@ protected override void SaveInternal(bool silent)
base.SaveInternal(silent);
}

protected override Dictionary<string, string> GetAttributesCollection()
{
var attr = base.GetAttributesCollection();

if (attr.TryGetValue("operator", out var op) && attr.TryGetValue("value", out var value))
{
if (op == "begins-with")
{
attr["operator"] = "like";
attr["value"] = EscapeLikeWildcards(value) + "%";
}
else if (op == "not-begin-with")
{
attr["operator"] = "not-like";
attr["value"] = EscapeLikeWildcards(value) + "%";
}
else if (op == "ends-with")
{
attr["operator"] = "like";
attr["value"] = "%" + EscapeLikeWildcards(value);
}
else if (op == "not-end-with")
{
attr["operator"] = "not-like";
attr["value"] = "%" + EscapeLikeWildcards(value);
}
else if (op == "contains")
{
attr["operator"] = "like";
attr["value"] = "%" + EscapeLikeWildcards(value) + "%";
}
else if (op == "does-not-contain")
{
attr["operator"] = "not-like";
attr["value"] = "%" + EscapeLikeWildcards(value) + "%";
}
}

return attr;
}

protected override ControlValidationResult ValidateControl(Control control)
{
if (control == cmbAttribute)
Expand Down Expand Up @@ -388,131 +347,6 @@ private void RefreshAttributes()
RefreshOperators();
UpdateValueField();
RefreshValueOf();
NormalizeLike();
}

private void NormalizeLike()
{
var op = cmbOperator.SelectedItem as OperatorItem;

if (op == null)
{
return;
}

var value = cmbValue.Text;

if (String.IsNullOrWhiteSpace(value))
{
return;
}

if (op.GetValue() == "like" || op.GetValue() == "not-like")
{
string newOp = null;

if (value.StartsWith("%") && value.EndsWith("%") && value.Length >= 2)
{
newOp = "contains";
value = value.Substring(1, value.Length - 2);
}
else if (value.StartsWith("%"))
{
newOp = "ends-with";
value = value.Substring(1);
}
else if (value.EndsWith("%"))
{
newOp = "begins-with";
value = value.Substring(0, value.Length - 1);
}

if (newOp != null && AreAllLikeWildcardsEscaped(value))
{
value = UnescapeLikeWildcards(value);

if (op.GetValue() == "not-like")
{
newOp = "not-" + newOp.Replace("s-", "-");

if (newOp == "not-contains")
{
newOp = "does-not-contain";
}
}

var newOpItem = cmbOperator.Items.OfType<OperatorItem>().FirstOrDefault(o => o.GetValue() == newOp);

if (newOpItem != null)
{
cmbOperator.SelectedItem = newOpItem;
cmbValue.Text = value;
}
}
}
}

private string EscapeLikeWildcards(string value)
{
return value
.Replace("[", "[[]")
.Replace("%", "[%]")
.Replace("_", "[_]");
}

private bool AreAllLikeWildcardsEscaped(string value)
{
var bracketStart = -1;

for (var i = 0; i < value.Length; i++)
{
var ch = value[i];

if (ch != '%' && ch != '_' && ch != '[' && ch != ']')
{
if (bracketStart != -1)
{
// We've got a non-wildcard character in brackets - it's not an escaped wildcard
return false;
}

continue;
}

if (bracketStart == -1)
{
if (ch == '[')
{
bracketStart = i;
}
else
{
// We've got a wildcard character outside of brackets - it's not escaped
return false;
}
}

if (ch == ']')
{
if (i > bracketStart + 2)
{
// We've got more than a single character in the brackets - it's not a single escaped wildcard
return false;
}

bracketStart = -1;
}
}

return true;
}

private string UnescapeLikeWildcards(string value)
{
return value
.Replace("[_]", "_")
.Replace("[%]", "%")
.Replace("[[]", "[");
}

private void RefreshOperators()
Expand Down

0 comments on commit a424f67

Please sign in to comment.