Removed CatchAll and Fallback from DecisionTree

This commit is contained in:
Ajay Bhargav Baaskaran 2015-12-15 15:02:29 -08:00
parent 2ab24aa0f4
commit ef0ea537e2
6 changed files with 23 additions and 109 deletions

View File

@ -10,7 +10,5 @@ namespace Microsoft.AspNet.Routing.DecisionTree
public string Key { get; set; }
public Dictionary<object, DecisionTreeNode<TItem>> Branches { get; set; }
public DecisionTreeNode<TItem> Fallback { get; set; }
}
}

View File

@ -5,18 +5,11 @@ namespace Microsoft.AspNet.Routing.DecisionTree
{
internal struct DecisionCriterionValue
{
private readonly bool _isCatchAll;
private readonly object _value;
public DecisionCriterionValue(object value, bool isCatchAll)
public DecisionCriterionValue(object value)
{
_value = value;
_isCatchAll = isCatchAll;
}
public bool IsCatchAll
{
get { return _isCatchAll; }
}
public object Value

View File

@ -16,19 +16,12 @@ namespace Microsoft.AspNet.Routing.DecisionTree
public bool Equals(DecisionCriterionValue x, DecisionCriterionValue y)
{
return x.IsCatchAll == y.IsCatchAll || InnerComparer.Equals(x.Value, y.Value);
return InnerComparer.Equals(x.Value, y.Value);
}
public int GetHashCode(DecisionCriterionValue obj)
{
if (obj.IsCatchAll)
{
return 0;
}
else
{
return InnerComparer.GetHashCode(obj.Value);
}
return InnerComparer.GetHashCode(obj.Value);
}
}
}

View File

@ -153,7 +153,6 @@ namespace Microsoft.AspNet.Routing.DecisionTree
foreach (var criterion in criteria.OrderByDescending(c => c.Value.Count))
{
var reducedBranches = new Dictionary<object, DecisionTreeNode<TItem>>(comparer.InnerComparer);
DecisionTreeNode<TItem> fallback = null;
foreach (var branch in criterion.Value)
{
@ -172,24 +171,16 @@ namespace Microsoft.AspNet.Routing.DecisionTree
childContext.CurrentCriteria.Add(criterion.Key);
var newBranch = GenerateNode(childContext, comparer, branch.Value);
if (branch.Key.IsCatchAll)
{
fallback = newBranch;
}
else
{
reducedBranches.Add(branch.Key.Value, newBranch);
}
reducedBranches.Add(branch.Key.Value, newBranch);
}
}
if (reducedBranches.Count > 0 || fallback != null)
if (reducedBranches.Count > 0)
{
var newCriterion = new DecisionCriterion<TItem>()
{
Key = criterion.Key,
Branches = reducedBranches,
Fallback = fallback,
};
reducedCriteria.Add(newCriterion);

View File

@ -117,7 +117,7 @@ namespace Microsoft.AspNet.Routing.Internal
var results = new Dictionary<string, DecisionCriterionValue>(StringComparer.OrdinalIgnoreCase);
foreach (var kvp in item.RequiredLinkValues)
{
results.Add(kvp.Key, new DecisionCriterionValue(kvp.Value ?? string.Empty, isCatchAll: false));
results.Add(kvp.Key, new DecisionCriterionValue(kvp.Value ?? string.Empty));
}
return results;

View File

@ -47,9 +47,9 @@ namespace Microsoft.AspNet.Routing.DecisionTree
var items = new List<Item>();
var item = new Item();
item.Criteria.Add("area", new DecisionCriterionValue(value: "Admin", isCatchAll: false));
item.Criteria.Add("controller", new DecisionCriterionValue(value: "Users", isCatchAll: false));
item.Criteria.Add("action", new DecisionCriterionValue(value: "AddUser", isCatchAll: false));
item.Criteria.Add("area", new DecisionCriterionValue(value: "Admin"));
item.Criteria.Add("controller", new DecisionCriterionValue(value: "Users"));
item.Criteria.Add("action", new DecisionCriterionValue(value: "AddUser"));
items.Add(item);
// Act
@ -60,7 +60,6 @@ namespace Microsoft.AspNet.Routing.DecisionTree
var area = Assert.Single(tree.Criteria);
Assert.Equal("area", area.Key);
Assert.Null(area.Fallback);
var admin = Assert.Single(area.Branches);
Assert.Equal("Admin", admin.Key);
@ -68,7 +67,6 @@ namespace Microsoft.AspNet.Routing.DecisionTree
var controller = Assert.Single(admin.Value.Criteria);
Assert.Equal("controller", controller.Key);
Assert.Null(controller.Fallback);
var users = Assert.Single(controller.Branches);
Assert.Equal("Users", users.Key);
@ -76,7 +74,6 @@ namespace Microsoft.AspNet.Routing.DecisionTree
var action = Assert.Single(users.Value.Criteria);
Assert.Equal("action", action.Key);
Assert.Null(action.Fallback);
var addUser = Assert.Single(action.Branches);
Assert.Equal("AddUser", addUser.Key);
@ -91,13 +88,13 @@ namespace Microsoft.AspNet.Routing.DecisionTree
var items = new List<Item>();
var item1 = new Item();
item1.Criteria.Add("controller", new DecisionCriterionValue(value: "Store", isCatchAll: false));
item1.Criteria.Add("action", new DecisionCriterionValue(value: "Buy", isCatchAll: false));
item1.Criteria.Add("controller", new DecisionCriterionValue(value: "Store"));
item1.Criteria.Add("action", new DecisionCriterionValue(value: "Buy"));
items.Add(item1);
var item2 = new Item();
item2.Criteria.Add("controller", new DecisionCriterionValue(value: "Store", isCatchAll: false));
item2.Criteria.Add("action", new DecisionCriterionValue(value: "Checkout", isCatchAll: false));
item2.Criteria.Add("controller", new DecisionCriterionValue(value: "Store"));
item2.Criteria.Add("action", new DecisionCriterionValue(value: "Checkout"));
items.Add(item2);
// Act
@ -108,14 +105,12 @@ namespace Microsoft.AspNet.Routing.DecisionTree
var action = Assert.Single(tree.Criteria);
Assert.Equal("action", action.Key);
Assert.Null(action.Fallback);
var buy = action.Branches["Buy"];
Assert.Empty(buy.Matches);
var controller = Assert.Single(buy.Criteria);
Assert.Equal("controller", controller.Key);
Assert.Null(controller.Fallback);
var store = Assert.Single(controller.Branches);
Assert.Equal("Store", store.Key);
@ -127,7 +122,6 @@ namespace Microsoft.AspNet.Routing.DecisionTree
controller = Assert.Single(checkout.Criteria);
Assert.Equal("controller", controller.Key);
Assert.Null(controller.Fallback);
store = Assert.Single(controller.Branches);
Assert.Equal("Store", store.Key);
@ -142,17 +136,17 @@ namespace Microsoft.AspNet.Routing.DecisionTree
var items = new List<Item>();
var item1 = new Item();
item1.Criteria.Add("controller", new DecisionCriterionValue(value: "Store", isCatchAll: false));
item1.Criteria.Add("action", new DecisionCriterionValue(value: "Buy", isCatchAll: false));
item1.Criteria.Add("controller", new DecisionCriterionValue(value: "Store"));
item1.Criteria.Add("action", new DecisionCriterionValue(value: "Buy"));
items.Add(item1);
var item2 = new Item();
item2.Criteria.Add("controller", new DecisionCriterionValue(value: "Store", isCatchAll: false));
item2.Criteria.Add("action", new DecisionCriterionValue(value: "Checkout", isCatchAll: false));
item2.Criteria.Add("controller", new DecisionCriterionValue(value: "Store"));
item2.Criteria.Add("action", new DecisionCriterionValue(value: "Checkout"));
items.Add(item2);
var item3 = new Item();
item3.Criteria.Add("action", new DecisionCriterionValue(value: "Buy", isCatchAll: false));
item3.Criteria.Add("action", new DecisionCriterionValue(value: "Buy"));
items.Add(item3);
// Act
@ -163,66 +157,11 @@ namespace Microsoft.AspNet.Routing.DecisionTree
var action = Assert.Single(tree.Criteria);
Assert.Equal("action", action.Key);
Assert.Null(action.Fallback);
var buy = action.Branches["Buy"];
Assert.Same(item3, Assert.Single(buy.Matches));
}
[Fact]
public void BuildTree_WithCatchAll()
{
// Arrange
var items = new List<Item>();
var item1 = new Item();
item1.Criteria.Add("country", new DecisionCriterionValue(value: "CA", isCatchAll: false));
item1.Criteria.Add("controller", new DecisionCriterionValue(value: "Store", isCatchAll: false));
item1.Criteria.Add("action", new DecisionCriterionValue(value: "Checkout", isCatchAll: false));
items.Add(item1);
var item2 = new Item();
item2.Criteria.Add("country", new DecisionCriterionValue(value: "US", isCatchAll: false));
item2.Criteria.Add("controller", new DecisionCriterionValue(value: "Store", isCatchAll: false));
item2.Criteria.Add("action", new DecisionCriterionValue(value: "Checkout", isCatchAll: false));
items.Add(item2);
var item3 = new Item();
item3.Criteria.Add("country", new DecisionCriterionValue(value: null, isCatchAll: true));
item3.Criteria.Add("controller", new DecisionCriterionValue(value: "Store", isCatchAll: false));
item3.Criteria.Add("action", new DecisionCriterionValue(value: "Checkout", isCatchAll: false));
items.Add(item3);
// Act
var tree = DecisionTreeBuilder<Item>.GenerateTree(items, new ItemClassifier());
// Assert
Assert.Empty(tree.Matches);
var country = Assert.Single(tree.Criteria);
Assert.Equal("country", country.Key);
var fallback = country.Fallback;
Assert.NotNull(fallback);
var controller = Assert.Single(fallback.Criteria);
Assert.Equal("controller", controller.Key);
Assert.Null(controller.Fallback);
var store = Assert.Single(controller.Branches);
Assert.Equal("Store", store.Key);
Assert.Empty(store.Value.Matches);
var action = Assert.Single(store.Value.Criteria);
Assert.Equal("action", action.Key);
Assert.Null(action.Fallback);
var checkout = Assert.Single(action.Branches);
Assert.Equal("Checkout", checkout.Key);
Assert.Empty(checkout.Value.Criteria);
Assert.Same(item3, Assert.Single(checkout.Value.Matches));
}
[Fact]
public void BuildTree_WithDivergentCriteria()
{
@ -230,17 +169,17 @@ namespace Microsoft.AspNet.Routing.DecisionTree
var items = new List<Item>();
var item1 = new Item();
item1.Criteria.Add("controller", new DecisionCriterionValue(value: "Store", isCatchAll: false));
item1.Criteria.Add("action", new DecisionCriterionValue(value: "Buy", isCatchAll: false));
item1.Criteria.Add("controller", new DecisionCriterionValue(value: "Store"));
item1.Criteria.Add("action", new DecisionCriterionValue(value: "Buy"));
items.Add(item1);
var item2 = new Item();
item2.Criteria.Add("controller", new DecisionCriterionValue(value: "Store", isCatchAll: false));
item2.Criteria.Add("action", new DecisionCriterionValue(value: "Checkout", isCatchAll: false));
item2.Criteria.Add("controller", new DecisionCriterionValue(value: "Store"));
item2.Criteria.Add("action", new DecisionCriterionValue(value: "Checkout"));
items.Add(item2);
var item3 = new Item();
item3.Criteria.Add("stub", new DecisionCriterionValue(value: "Bleh", isCatchAll: false));
item3.Criteria.Add("stub", new DecisionCriterionValue(value: "Bleh"));
items.Add(item3);
// Act