Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ namespace Rules.Framework.WebUI.Sample.Engine
using System;
using System.Threading;
using System.Threading.Tasks;
using global::Rules.Framework.Providers.InMemory;
using global::Rules.Framework.WebUI.Sample.Enums;

internal class RulesEngineProvider
Expand All @@ -19,7 +18,7 @@ public RulesEngineProvider(RulesBuilder rulesBuilder)
.WithContentType<ContentTypes>()
.WithConditionType<ConditionTypes>()
.SetInMemoryDataSource()
.Configure(c => c.PriotityCriteria = PriorityCriterias.TopmostRuleWins)
.Configure(c => c.PriorityCriteria = PriorityCriterias.TopmostRuleWins)
.Build();

await rulesBuilder.BuildAsync(rulesEngine).ConfigureAwait(false);
Expand Down
79 changes: 21 additions & 58 deletions src/Rules.Framework.Providers.MongoDb/RuleFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ namespace Rules.Framework.Providers.MongoDb
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Rules.Framework.Builder;
using Rules.Framework.Core;
using Rules.Framework.Core.ConditionNodes;
using Rules.Framework.Providers.MongoDb.DataModel;
Expand Down Expand Up @@ -32,7 +31,7 @@ public Rule<TContentType, TConditionType> CreateRule(RuleDataModel ruleDataModel
.WithName(ruleDataModel.Name)
.WithDatesInterval(ruleDataModel.DateBegin, ruleDataModel.DateEnd)
.WithActive(ruleDataModel.Active ?? true)
.WithCondition(cnb => ruleDataModel.RootCondition is { } ? ConvertConditionNode(cnb, ruleDataModel.RootCondition) : null)
.WithCondition(_ => ruleDataModel.RootCondition is { } ? ConvertConditionNode(ruleDataModel.RootCondition) : null)
.WithSerializedContent(contentType, (object)ruleDataModel.Content, this.contentSerializationProvider)
.Build();

Expand Down Expand Up @@ -78,27 +77,25 @@ public RuleDataModel CreateRule(Rule<TContentType, TConditionType> rule)
return ruleDataModel;
}

private static IConditionNode<TConditionType> ConvertConditionNode(
IConditionNodeBuilder<TConditionType> conditionNodeBuilder, ConditionNodeDataModel conditionNodeDataModel)
private static IConditionNode<TConditionType> ConvertConditionNode(ConditionNodeDataModel conditionNodeDataModel)
{
if (conditionNodeDataModel.LogicalOperator == LogicalOperators.Eval)
{
return CreateValueConditionNode(conditionNodeBuilder, conditionNodeDataModel as ValueConditionNodeDataModel);
return CreateValueConditionNode(conditionNodeDataModel as ValueConditionNodeDataModel);
}

var composedConditionNodeDataModel = conditionNodeDataModel as ComposedConditionNodeDataModel;

var composedConditionNodeBuilder = conditionNodeBuilder.AsComposed()
.WithLogicalOperator(composedConditionNodeDataModel.LogicalOperator);
var childConditionNodes = composedConditionNodeDataModel.ChildConditionNodes;
var count = childConditionNodes.Length;
var i = -1;
while (++i < count)
var childConditionNodeDataModels = composedConditionNodeDataModel.ChildConditionNodes;
var count = childConditionNodeDataModels.Length;
var childConditionNodes = new IConditionNode<TConditionType>[count];
for (int i = 0; i < count; i++)
{
composedConditionNodeBuilder.AddCondition(cnb => ConvertConditionNode(cnb, childConditionNodes[i]));
childConditionNodes[i] = ConvertConditionNode(childConditionNodeDataModels[i]);
}

var composedConditionNode = composedConditionNodeBuilder.Build();
var composedConditionNode = new ComposedConditionNode<TConditionType>(
composedConditionNodeDataModel.LogicalOperator,
childConditionNodes);
foreach (var property in composedConditionNodeDataModel.Properties)
{
composedConditionNode.Properties[property.Key] = property.Value;
Expand All @@ -122,55 +119,21 @@ private static ValueConditionNodeDataModel ConvertValueConditionNode(ValueCondit
};
}

private static IConditionNode<TConditionType> CreateValueConditionNode(IConditionNodeBuilder<TConditionType> conditionNodeBuilder, ValueConditionNodeDataModel conditionNodeDataModel)
private static ValueConditionNode<TConditionType> CreateValueConditionNode(ValueConditionNodeDataModel conditionNodeDataModel)
{
TConditionType conditionType = Parse<TConditionType>(conditionNodeDataModel.ConditionType);
var valueConditionNode = conditionNodeDataModel.DataType switch
var operand = conditionNodeDataModel.DataType switch
{
DataTypes.Integer => conditionNodeBuilder.AsValued(conditionType)
.OfDataType<int>()
.WithComparisonOperator(conditionNodeDataModel.Operator)
.SetOperand(Convert.ToInt32(conditionNodeDataModel.Operand, CultureInfo.InvariantCulture))
.Build(),
DataTypes.Decimal => conditionNodeBuilder.AsValued(conditionType)
.OfDataType<decimal>()
.WithComparisonOperator(conditionNodeDataModel.Operator)
.SetOperand(Convert.ToDecimal(conditionNodeDataModel.Operand, CultureInfo.InvariantCulture))
.Build(),
DataTypes.String => conditionNodeBuilder.AsValued(conditionType)
.OfDataType<string>()
.WithComparisonOperator(conditionNodeDataModel.Operator)
.SetOperand(Convert.ToString(conditionNodeDataModel.Operand, CultureInfo.InvariantCulture))
.Build(),
DataTypes.Boolean => conditionNodeBuilder.AsValued(conditionType)
.OfDataType<bool>()
.WithComparisonOperator(conditionNodeDataModel.Operator)
.SetOperand(Convert.ToBoolean(conditionNodeDataModel.Operand, CultureInfo.InvariantCulture))
.Build(),

DataTypes.ArrayInteger => conditionNodeBuilder.AsValued(conditionType)
.OfDataType<IEnumerable<int>>()
.WithComparisonOperator(conditionNodeDataModel.Operator)
.SetOperand(conditionNodeDataModel.Operand as IEnumerable<int>)
.Build(),
DataTypes.ArrayDecimal => conditionNodeBuilder.AsValued(conditionType)
.OfDataType<IEnumerable<decimal>>()
.WithComparisonOperator(conditionNodeDataModel.Operator)
.SetOperand(conditionNodeDataModel.Operand as IEnumerable<decimal>)
.Build(),
DataTypes.ArrayString => conditionNodeBuilder.AsValued(conditionType)
.OfDataType<IEnumerable<string>>()
.WithComparisonOperator(conditionNodeDataModel.Operator)
.SetOperand(conditionNodeDataModel.Operand as IEnumerable<string>)
.Build(),
DataTypes.ArrayBoolean => conditionNodeBuilder.AsValued(conditionType)
.OfDataType<IEnumerable<bool>>()
.WithComparisonOperator(conditionNodeDataModel.Operator)
.SetOperand(conditionNodeDataModel.Operand as IEnumerable<bool>)
.Build(),
DataTypes.Integer => Convert.ToInt32(conditionNodeDataModel.Operand, CultureInfo.InvariantCulture),
DataTypes.Decimal => Convert.ToDecimal(conditionNodeDataModel.Operand, CultureInfo.InvariantCulture),
DataTypes.String => Convert.ToString(conditionNodeDataModel.Operand, CultureInfo.InvariantCulture),
DataTypes.Boolean => Convert.ToBoolean(conditionNodeDataModel.Operand, CultureInfo.InvariantCulture),
DataTypes.ArrayInteger or DataTypes.ArrayDecimal or DataTypes.ArrayString or DataTypes.ArrayBoolean => conditionNodeDataModel.Operand,
_ => throw new NotSupportedException($"Unsupported data type: {conditionNodeDataModel.DataType}."),
};

var valueConditionNode = new ValueConditionNode<TConditionType>(conditionNodeDataModel.DataType, conditionType, conditionNodeDataModel.Operator, operand);

foreach (var property in conditionNodeDataModel.Properties)
{
valueConditionNode.Properties[property.Key] = property.Value;
Expand Down Expand Up @@ -230,4 +193,4 @@ private ConditionNodeDataModel ConvertConditionNode(IConditionNode<TConditionTyp
return ConvertComposedConditionNode(conditionNode as ComposedConditionNode<TConditionType>);
}
}
}
}
2 changes: 1 addition & 1 deletion src/Rules.Framework/AssemblyMetadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

[assembly: InternalsVisibleTo("Rules.Framework.Tests")]
[assembly: InternalsVisibleTo("Rules.Framework.IntegrationTests")]
[assembly: InternalsVisibleTo("Rules.Framework.Providers.InMemory.Tests")]
[assembly: InternalsVisibleTo("Rules.Framework.Providers.InMemory.IntegrationTests")]
[assembly: InternalsVisibleTo("Rules.Framework.Providers.MongoDb")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
33 changes: 31 additions & 2 deletions src/Rules.Framework/Builder/ConditionNodeFactory.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
namespace Rules.Framework.Builder
{
using System;
using System.Collections.Generic;
using Rules.Framework.Core;
using Rules.Framework.Core.ConditionNodes;

/// <summary>
/// Factory for creating condition nodes.
Expand Down Expand Up @@ -39,8 +41,35 @@ public static IConditionNode<TConditionType> CreateComposedNode<TConditionType>(
public static IConditionNode<TConditionType> CreateValueNode<TConditionType, TDataType>(
TConditionType conditionType, Operators condOperator, TDataType operand)
{
return new ValueConditionNodeBuilder<TConditionType, TDataType>(conditionType, condOperator, operand)
.Build();
switch (operand)
{
case decimal _:
return new ValueConditionNode<TConditionType>(DataTypes.Decimal, conditionType, condOperator, operand);

case IEnumerable<decimal> _:
return new ValueConditionNode<TConditionType>(DataTypes.ArrayDecimal, conditionType, condOperator, operand);

case int _:
return new ValueConditionNode<TConditionType>(DataTypes.Integer, conditionType, condOperator, operand);

case IEnumerable<int> _:
return new ValueConditionNode<TConditionType>(DataTypes.ArrayInteger, conditionType, condOperator, operand);

case bool _:
return new ValueConditionNode<TConditionType>(DataTypes.Boolean, conditionType, condOperator, operand);

case IEnumerable<bool> _:
return new ValueConditionNode<TConditionType>(DataTypes.ArrayBoolean, conditionType, condOperator, operand);

case string _:
return new ValueConditionNode<TConditionType>(DataTypes.String, conditionType, condOperator, operand);

case IEnumerable<string> _:
return new ValueConditionNode<TConditionType>(DataTypes.ArrayString, conditionType, condOperator, operand);

default:
throw new NotSupportedException($"The data type is not supported: {typeof(TDataType).FullName}.");
}
}
}
}

This file was deleted.

14 changes: 0 additions & 14 deletions src/Rules.Framework/Builder/Deprecated/ConditionNodeBuilder.cs

This file was deleted.

This file was deleted.

26 changes: 0 additions & 26 deletions src/Rules.Framework/Builder/Deprecated/IConditionNodeBuilder.cs

This file was deleted.

This file was deleted.

Loading