Skip to content

Commit

Permalink
Fix compilation
Browse files Browse the repository at this point in the history
  • Loading branch information
virzak committed Nov 20, 2024
1 parent 09c8df6 commit 2e89f7c
Show file tree
Hide file tree
Showing 25 changed files with 371 additions and 43 deletions.
1 change: 1 addition & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ jobs:
with:
dotnet-version: |
8.0.x
9.0.x
- uses: dotnet/nbgv@master
id: nbgv
Expand Down
2 changes: 0 additions & 2 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@
<TreatWarningsAsErrors>True</TreatWarningsAsErrors>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>

<DefineConstants>$(DefineConstants);EF_CORE_8</DefineConstants>

<!-- Don't enforce file header -->
<NoWarn>$(NoWarn);SA1633</NoWarn>

Expand Down
1 change: 1 addition & 0 deletions src/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
<Using Include="Microsoft.EntityFrameworkCore.Metadata" />
<Using Include="Microsoft.EntityFrameworkCore.Storage" />
<Using Include="Microsoft.Extensions.DependencyInjection" />
<Using Include="System.Diagnostics.CodeAnalysis" />
<Using Include="System.Linq.Expressions" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,15 @@ protected override SqlExpression GetBytes(SqlExpression sqlExpression)
}

// Every byte is two characters in hex, thus multiply by 2
#if !EF_CORE_8
var byteSize = new SqlConstantExpression(sizeOfType * 2, null);
var zero = new SqlConstantExpression("0", null);
var hex = new SqlConstantExpression("hex", null);
#else
var byteSize = new SqlConstantExpression(Expression.Constant(sizeOfType * 2), null);
var zero = new SqlConstantExpression(Expression.Constant("0"), null);
var hex = new SqlConstantExpression(Expression.Constant("hex"), null);
#endif
var lPad = sqlExpressionFactory.Function("LPAD", [toHex, byteSize, zero], true, LPadArgumentsPropagateNullability, typeof(string));
var decode = sqlExpressionFactory.Function("decode", [lPad, hex], true, DecodeArgumentsPropagateNullabilityArray, typeof(string), byteArrayTypeMapping);
return new SqlUnaryExpression(ExpressionType.Convert, decode, typeof(byte[]), byteArrayTypeMapping);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,16 @@ public class SqlServerBinaryTranslator(ISqlExpressionFactory sqlExpressionFactor

// Constants
private static readonly double TwoToThePowerOfMinus52 = Math.Pow(2d, -52);

#if !EF_CORE_8
private static readonly SqlExpression TwoToThePowerOfMinus52Sql = new SqlConstantExpression(TwoToThePowerOfMinus52, null);
private static readonly SqlExpression OneFloat = new SqlConstantExpression(1d, null);
private static readonly SqlExpression TwoFloat = new SqlConstantExpression(2d, null);
#else
private static readonly SqlExpression TwoToThePowerOfMinus52Sql = new SqlConstantExpression(Expression.Constant(TwoToThePowerOfMinus52), null);
private static readonly SqlExpression OneFloat = new SqlConstantExpression(Expression.Constant(1d), null);
private static readonly SqlExpression TwoFloat = new SqlConstantExpression(Expression.Constant(2d), null);
#endif

// Must be varbinary.
private static readonly SqlExpression X000FFFFFFFFFFFFF = new SqlFragmentExpression("0x000FFFFFFFFFFFFF");
Expand Down Expand Up @@ -51,7 +58,11 @@ private SqlBinaryExpression ToDouble(SqlExpression sqlExpression)
{
var colNameBigInt = new SqlUnaryExpression(ExpressionType.Convert, sqlExpression, typeof(long), null);

#if !EF_CORE_8
var sql1023 = new SqlConstantExpression(1023, null);
#else
var sql1023 = new SqlConstantExpression(Expression.Constant(1023), null);
#endif

// Line 1
var l1 = sqlExpressionFactory.Function("SIGN", [colNameBigInt], true, SignArgumentsPropagateNullability, colNameBigInt.Type);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,13 @@ protected override SqlExpression BinaryCast(SqlExpression sqlExpression, Type to
var maxValue = 1L << (sizeInBytes * 8);
var maxValueSigned = 1L << ((sizeInBytes * 8) - 1);

#if !EF_CORE_8
var maxValueSql = new SqlConstantExpression(maxValue, null);
var maxValueSignedSql = new SqlConstantExpression(maxValueSigned, null);
#else
var maxValueSql = new SqlConstantExpression(Expression.Constant(maxValue), null);
var maxValueSignedSql = new SqlConstantExpression(Expression.Constant(maxValueSigned), null);
#endif

// Equivalent of substring on binary data
var modResult = new SqlBinaryExpression(ExpressionType.Modulo, sqlExpression, maxValueSql, fromType, null);
Expand Down
17 changes: 15 additions & 2 deletions src/Zomp.EFCore.BinaryFunctions/Query/Internal/BinaryTranslator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,23 @@ private static SqlBinaryExpression Concat(IReadOnlyList<SqlExpression> arguments

private SqlExpression ToValue(SqlExpression sqlExpression, SqlExpression offset, Type type)
=> ToValue(
Substring(sqlExpression, offset, new SqlConstantExpression(Expression.Constant(Marshal.SizeOf(type)), null)),
Substring(
sqlExpression,
offset,
#if !EF_CORE_8
new SqlConstantExpression(Marshal.SizeOf(type), null)),
#else
new SqlConstantExpression(Expression.Constant(Marshal.SizeOf(type)), null)),
#endif
type);

private SqlFunctionExpression Substring(SqlExpression bytearray, SqlExpression start, SqlExpression length) => sqlExpressionFactory.Function(
private
#if !EF_CORE_8
SqlExpression
#else
SqlFunctionExpression
#endif
Substring(SqlExpression bytearray, SqlExpression start, SqlExpression length) => sqlExpressionFactory.Function(
"SUBSTRING",
[
bytearray,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,41 @@
/// <remarks>
/// Initializes a new instance of the <see cref="WindowFunctionsNpgsqlParameterBasedSqlProcessor"/> class.
/// </remarks>
/// <param name="dependencies">Service dependencies.</param>
/// <param name="useRelationalNulls">A bool value indicating if relational nulls should be used.</param>
public class WindowFunctionsNpgsqlParameterBasedSqlProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, bool useRelationalNulls)
: NpgsqlParameterBasedSqlProcessor(dependencies, useRelationalNulls)
public class WindowFunctionsNpgsqlParameterBasedSqlProcessor : NpgsqlParameterBasedSqlProcessor
{
#if !EF_CORE_8
/// <summary>
/// Initializes a new instance of the <see cref="WindowFunctionsNpgsqlParameterBasedSqlProcessor"/> class.
/// </summary>
/// <param name="dependencies">Service dependencies.</param>
/// <param name="parameters">Processor parameters.</param>
[SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")]
public WindowFunctionsNpgsqlParameterBasedSqlProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, RelationalParameterBasedSqlProcessorParameters parameters)
: base(dependencies, parameters)
{
}
#else
/// <summary>
/// Initializes a new instance of the <see cref="WindowFunctionsNpgsqlParameterBasedSqlProcessor"/> class.
/// </summary>
/// <param name="dependencies">Service dependencies.</param>
/// <param name="useRelationalNulls">A bool value indicating if relational nulls should be used.</param>
[SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")]
public WindowFunctionsNpgsqlParameterBasedSqlProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, bool useRelationalNulls)
: base(dependencies, useRelationalNulls)
{
}
#endif

#if !EF_CORE_8
/// <inheritdoc/>
protected override Expression ProcessSqlNullability(Expression selectExpression, IReadOnlyDictionary<string, object?> parametersValues, out bool canCache)
=> new WindowFunctionsNpgsqlSqlNullabilityProcessor(Dependencies, Parameters)
.Process(selectExpression, parametersValues, out canCache);
#else
/// <inheritdoc/>
protected override Expression ProcessSqlNullability(Expression selectExpression, IReadOnlyDictionary<string, object?> parametersValues, out bool canCache)
=> new WindowFunctionsNpgsqlSqlNullabilityProcessor(Dependencies, UseRelationalNulls).Process(selectExpression, parametersValues, out canCache);
////protected override Expression ProcessSqlNullability(Expression queryExpression, IReadOnlyDictionary<string, object?> parametersValues, out bool canCache)
//// => new WindowFunctionsNpgsqlSqlNullabilityProcessor(Dependencies, UseRelationalNulls).Process(queryExpression, parametersValues, out canCache);
}
#endif

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,45 @@
/// <remarks>
/// Initializes a new instance of the <see cref="WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory"/> class.
/// </remarks>
/// <param name="dependencies">Relational Parameter Based Sql ProcessorDependencies.</param>
public class WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory(RelationalParameterBasedSqlProcessorDependencies dependencies)
: NpgsqlParameterBasedSqlProcessorFactory(dependencies)
public class WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory : NpgsqlParameterBasedSqlProcessorFactory
{
private readonly RelationalParameterBasedSqlProcessorDependencies dependencies = dependencies;
private readonly RelationalParameterBasedSqlProcessorDependencies dependencies;

#if !EF_CORE_8
/// <summary>
/// Initializes a new instance of the <see cref="WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory"/> class.
/// </summary>
/// <param name="dependencies">Relational Parameter Based Sql ProcessorDependencies.</param>
[SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")]
public WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory(RelationalParameterBasedSqlProcessorDependencies dependencies)
: base(dependencies)
{
this.dependencies = dependencies;
}
#else
/// <summary>
/// Initializes a new instance of the <see cref="WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory"/> class.
/// </summary>
/// <param name="dependencies">Relational Parameter Based Sql ProcessorDependencies.</param>
[SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")]
public WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory(RelationalParameterBasedSqlProcessorDependencies dependencies)
: base(dependencies)
{
this.dependencies = dependencies;
}
#endif

#if !EF_CORE_8
/// <summary>
/// This will be removed.
/// </summary>
/// <param name="parameters">Processor parameters.</param>
/// <returns>This will be removed soon.</returns>
public new RelationalParameterBasedSqlProcessor Create(RelationalParameterBasedSqlProcessorParameters parameters)
=> new WindowFunctionsNpgsqlParameterBasedSqlProcessor(dependencies, parameters);
#else
/// <inheritdoc/>
public override RelationalParameterBasedSqlProcessor Create(bool useRelationalNulls)
=> new WindowFunctionsNpgsqlParameterBasedSqlProcessor(dependencies, useRelationalNulls);
#endif
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,39 @@
/// <summary>
/// The WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor.
/// </summary>
/// <param name="dependencies">Type mapping source dependencies.</param>
/// <param name="relationalDependencies">Relational type mapping source dependencies.</param>
/// <param name="queryCompilationContext">The query compilation context object to use.</param>
public class WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor(QueryableMethodTranslatingExpressionVisitorDependencies dependencies, RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies, QueryCompilationContext queryCompilationContext) : NpgsqlQueryableMethodTranslatingExpressionVisitor(dependencies, relationalDependencies, queryCompilationContext)
public class WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor : NpgsqlQueryableMethodTranslatingExpressionVisitor
{
#if !EF_CORE_8
/// <summary>
/// Initializes a new instance of the <see cref="WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor"/> class.
/// </summary>
/// <param name="dependencies">Type mapping source dependencies.</param>
/// <param name="relationalDependencies">Relational type mapping source dependencies.</param>
/// <param name="queryCompilationContext">The query compilation context object to use.</param>
/// <param name="npgsqlSingletonOptions">NpgSql Singleton Options.</param>
[SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")]
public WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor(
QueryableMethodTranslatingExpressionVisitorDependencies dependencies,
RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies,
RelationalQueryCompilationContext queryCompilationContext,
INpgsqlSingletonOptions npgsqlSingletonOptions)
: base(dependencies, relationalDependencies, queryCompilationContext, npgsqlSingletonOptions)
{
}
#else
/// <summary>
/// Initializes a new instance of the <see cref="WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor"/> class.
/// </summary>
/// <param name="dependencies">Type mapping source dependencies.</param>
/// <param name="relationalDependencies">Relational type mapping source dependencies.</param>
/// <param name="queryCompilationContext">The query compilation context object to use.</param>
[SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")]
public WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor(QueryableMethodTranslatingExpressionVisitorDependencies dependencies, RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies, QueryCompilationContext queryCompilationContext)
: base(dependencies, relationalDependencies, queryCompilationContext)
{
}
#endif

/// <inheritdoc/>
protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression) => SubQueryProcessor.ProcessSubQuery(this, methodCallExpression)
?? base.VisitMethodCall(methodCallExpression);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,54 @@
/// <summary>
/// The WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory.
/// </summary>
/// <param name="dependencies">Type mapping source dependencies.</param>
/// <param name="relationalDependencies">Relational type mapping source dependencies.</param>
public class WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory(QueryableMethodTranslatingExpressionVisitorDependencies dependencies, RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies)
: NpgsqlQueryableMethodTranslatingExpressionVisitorFactory(dependencies, relationalDependencies)
public class WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory : NpgsqlQueryableMethodTranslatingExpressionVisitorFactory
{
private readonly QueryableMethodTranslatingExpressionVisitorDependencies dependencies = dependencies;
private readonly RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies = relationalDependencies;
private readonly QueryableMethodTranslatingExpressionVisitorDependencies dependencies;
private readonly RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies;
#if !EF_CORE_8
private readonly INpgsqlSingletonOptions npgsqlSingletonOptions;
#endif

#if !EF_CORE_8
/// <summary>
/// Initializes a new instance of the <see cref="WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory"/> class.
/// </summary>
/// <param name="dependencies">Type mapping source dependencies.</param>
/// <param name="relationalDependencies">Relational type mapping source dependencies.</param>
/// <param name="npgsqlSingletonOptions">NpgSql Singleton Options.</param>
[SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")]
public WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory(
QueryableMethodTranslatingExpressionVisitorDependencies dependencies,
RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies,
INpgsqlSingletonOptions npgsqlSingletonOptions)
: base(dependencies, relationalDependencies, npgsqlSingletonOptions)
{
this.dependencies = dependencies;
this.relationalDependencies = relationalDependencies;
this.npgsqlSingletonOptions = npgsqlSingletonOptions;
}
#else
/// <summary>
/// Initializes a new instance of the <see cref="WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory"/> class.
/// </summary>
/// <param name="dependencies">Type mapping source dependencies.</param>
/// <param name="relationalDependencies">Relational type mapping source dependencies.</param>
[SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")]
public WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory(QueryableMethodTranslatingExpressionVisitorDependencies dependencies, RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies)
: base(dependencies, relationalDependencies)
{
this.dependencies = dependencies;
this.relationalDependencies = relationalDependencies;
}
#endif

#if !EF_CORE_8
/// <inheritdoc/>
public override QueryableMethodTranslatingExpressionVisitor Create(QueryCompilationContext queryCompilationContext)
=> new WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor(dependencies, relationalDependencies, (RelationalQueryCompilationContext)queryCompilationContext, npgsqlSingletonOptions);
#else
/// <inheritdoc/>
public override QueryableMethodTranslatingExpressionVisitor Create(QueryCompilationContext queryCompilationContext)
=> new WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor(dependencies, relationalDependencies, queryCompilationContext);
#endif
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,32 @@
/// <remarks>
/// Initializes a new instance of the <see cref="WindowFunctionsNpgsqlSqlNullabilityProcessor"/> class.
/// </remarks>
/// <param name="dependencies">Relational Parameter Based Sql Processor Dependencies.</param>
/// <param name="useRelationalNulls">A bool value indicating if relational nulls should be used.</param>
public class WindowFunctionsNpgsqlSqlNullabilityProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, bool useRelationalNulls)
: NpgsqlSqlNullabilityProcessor(dependencies, useRelationalNulls)
public class WindowFunctionsNpgsqlSqlNullabilityProcessor : NpgsqlSqlNullabilityProcessor
{
#if !EF_CORE_8
/// <summary>
/// Initializes a new instance of the <see cref="WindowFunctionsNpgsqlSqlNullabilityProcessor"/> class.
/// </summary>
/// <param name="dependencies">Relational Parameter Based Sql Processor Dependencies.</param>
/// <param name="parameters">Processor parameters.</param>
[SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")]
public WindowFunctionsNpgsqlSqlNullabilityProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, RelationalParameterBasedSqlProcessorParameters parameters)
: base(dependencies, parameters)
{
}
#else
/// <summary>
/// Initializes a new instance of the <see cref="WindowFunctionsNpgsqlSqlNullabilityProcessor"/> class.
/// </summary>
/// <param name="dependencies">Relational Parameter Based Sql Processor Dependencies.</param>
/// <param name="useRelationalNulls">A bool value indicating if relational nulls should be used.</param>
[SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")]
public WindowFunctionsNpgsqlSqlNullabilityProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, bool useRelationalNulls)
: base(dependencies, useRelationalNulls)
{
}
#endif

/// <inheritdoc/>
protected override SqlExpression VisitCustomSqlExpression(SqlExpression sqlExpression, bool allowOptimizedExpansion, out bool nullable)
{
Expand Down
Loading

0 comments on commit 2e89f7c

Please sign in to comment.