diff --git a/back/src/Kyoo.Abstractions/Utility/ExpressionParameterReplacer.cs b/back/src/Kyoo.Abstractions/Utility/ExpressionParameterReplacer.cs new file mode 100644 index 00000000..6d7df788 --- /dev/null +++ b/back/src/Kyoo.Abstractions/Utility/ExpressionParameterReplacer.cs @@ -0,0 +1,50 @@ +// Kyoo - A portable and vast media library solution. +// Copyright (c) Kyoo. +// +// See AUTHORS.md and LICENSE file in the project root for full license information. +// +// Kyoo is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// Kyoo is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Kyoo. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; + +namespace Kyoo.Utils; + +public sealed class ExpressionArgumentReplacer : ExpressionVisitor +{ + private readonly Dictionary _mapping; + + public ExpressionArgumentReplacer(Dictionary dict) + { + _mapping = dict; + } + + protected override Expression VisitParameter(ParameterExpression node) + { + if (_mapping.TryGetValue(node, out Expression? mappedArgument)) + return Visit(mappedArgument); + return VisitParameter(node); + } + + public static Expression ReplaceParams(Expression expression, IEnumerable epxParams, params ParameterExpression[] param) + { + ExpressionArgumentReplacer replacer = new( + epxParams + .Zip(param) + .ToDictionary(x => x.First, x => x.Second as Expression) + ); + return replacer.Visit(expression); + } +} diff --git a/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs index 6ee5adac..840f9de4 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs @@ -115,7 +115,30 @@ namespace Kyoo.Core.Controllers protected static Expression> ParseFilter(Filter? filter) { - throw new NotImplementedException(); + if (filter == null) + return x => true; + + ParameterExpression x = Expression.Parameter(typeof(T), "x"); + + Expression Parse(Filter f) + { + return f switch + { + Filter.And(var first, var second) => Expression.AndAlso(Parse(first), Parse(second)), + Filter.Or(var first, var second) => Expression.OrElse(Parse(first), Parse(second)), + Filter.Not(var inner) => Expression.Not(Parse(inner)), + Filter.Eq(var property, var value) => Expression.Equal(Expression.Property(x, property), Expression.Constant(value)), + Filter.Ne(var property, var value) => Expression.NotEqual(Expression.Property(x, property), Expression.Constant(value)), + Filter.Gt(var property, var value) => Expression.GreaterThan(Expression.Property(x, property), Expression.Constant(value)), + Filter.Ge(var property, var value) => Expression.GreaterThanOrEqual(Expression.Property(x, property), Expression.Constant(value)), + Filter.Lt(var property, var value) => Expression.LessThan(Expression.Property(x, property), Expression.Constant(value)), + Filter.Le(var property, var value) => Expression.LessThanOrEqual(Expression.Property(x, property), Expression.Constant(value)), + Filter.Lambda(var lambda) => ExpressionArgumentReplacer.ReplaceParams(lambda.Body, lambda.Parameters, x), + }; + } + + Expression body = Parse(filter); + return Expression.Lambda>(body, x); } private static Func _GetComparisonExpression(