Skip to content

Commit

Permalink
Pull out internal SortOrderHelper. Don't add sort order metadata for …
Browse files Browse the repository at this point in the history
…default values
  • Loading branch information
khellang committed Feb 19, 2019
1 parent 1f14cff commit 6f33b6d
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 36 deletions.
10 changes: 8 additions & 2 deletions src/EFCore.PG/Extensions/NpgsqlIndexBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,10 @@ public static IndexBuilder ForNpgsqlHasSortOrder(
[CanBeNull] params SortOrder[] values)
{
Check.NotNull(indexBuilder, nameof(indexBuilder));
Check.NullButNotEmpty(values, nameof(values));

indexBuilder.Metadata.Npgsql().SortOrder = values;
if (values == null || !SortOrderHelper.IsDefaultSortOrder(values))
indexBuilder.Metadata.Npgsql().SortOrder = values;

return indexBuilder;
}
Expand All @@ -112,8 +114,12 @@ public static IndexBuilder ForNpgsqlHasNullSortOrder(
[CanBeNull] params NullSortOrder[] values)
{
Check.NotNull(indexBuilder, nameof(indexBuilder));
Check.NullButNotEmpty(values, nameof(values));

var sortOrders = indexBuilder.Metadata.Npgsql().SortOrder;

indexBuilder.Metadata.Npgsql().NullSortOrder = values;
if (values == null || !SortOrderHelper.IsDefaultNullSortOrder(values, sortOrders))
indexBuilder.Metadata.Npgsql().NullSortOrder = values;

return indexBuilder;
}
Expand Down
36 changes: 2 additions & 34 deletions src/EFCore.PG/Scaffolding/Internal/NpgsqlDatabaseModelFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -557,7 +557,7 @@ NOT indisprimary AND
.Select(val => (val & indoptionDescFlag) != 0 ? SortOrder.Descending : SortOrder.Ascending)
.ToArray();

if (!IsDefaultSortOrder(sortOrders))
if (!SortOrderHelper.IsDefaultSortOrder(sortOrders))
index[NpgsqlAnnotationNames.IndexSortOrder] = sortOrders;

// The second bit specifies whether NULLs are sorted first instead of last.
Expand All @@ -567,7 +567,7 @@ NOT indisprimary AND
.Select(val => (val & indoptionNullsFirstFlag) != 0 ? NullSortOrder.NullsFirst : NullSortOrder.NullsLast)
.ToArray();

if (!IsDefaultNullSortOrder(nullSortOrders, sortOrders))
if (!SortOrderHelper.IsDefaultNullSortOrder(nullSortOrders, sortOrders))
index[NpgsqlAnnotationNames.IndexNullSortOrder] = nullSortOrders;

table.Indexes.Add(index);
Expand All @@ -578,38 +578,6 @@ NOT indisprimary AND
}
}

static bool IsDefaultSortOrder(SortOrder[] sortOrders) => sortOrders.All(sortOrder => sortOrder != SortOrder.Descending);

static bool IsDefaultNullSortOrder(NullSortOrder[] nullSortOrders, SortOrder[] sortOrders)
{
for (var i = 0; i < nullSortOrders.Length; i++)
{
var nullSortOrder = nullSortOrders[i];

// We need to consider the ASC/DESC sort order to determine the default NULLS FIRST/LAST sort order.
var sortOrder = i < sortOrders.Length ? sortOrders[i] : SortOrder.Unspecified;

if (sortOrder == SortOrder.Descending)
{
// NULLS FIRST is the default when DESC is specified.
if (nullSortOrder != NullSortOrder.NullsFirst)
{
return false;
}
}
else
{
// NULLS LAST is the default when DESC is NOT specified.
if (nullSortOrder != NullSortOrder.NullsLast)
{
return false;
}
}
}

return true;
}

/// <summary>
/// Queries the database for defined constraints and registers them with the model.
/// </summary>
Expand Down
48 changes: 48 additions & 0 deletions src/EFCore.PG/Utilities/SortOrderHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using System.Linq;
using JetBrains.Annotations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;

namespace Npgsql.EntityFrameworkCore.PostgreSQL.Utilities
{
static class SortOrderHelper
{
public static bool IsDefaultSortOrder([NotNull] SortOrder[] sortOrders)
{
Check.NotNull(sortOrders, nameof(sortOrders));

return sortOrders.All(sortOrder => sortOrder != SortOrder.Descending);
}

public static bool IsDefaultNullSortOrder([NotNull] NullSortOrder[] nullSortOrders, [CanBeNull] SortOrder[] sortOrders)
{
Check.NotNull(nullSortOrders, nameof(nullSortOrders));

for (var i = 0; i < nullSortOrders.Length; i++)
{
var nullSortOrder = nullSortOrders[i];

// We need to consider the ASC/DESC sort order to determine the default NULLS FIRST/LAST sort order.
var sortOrder = i < sortOrders?.Length ? sortOrders[i] : SortOrder.Unspecified;

if (sortOrder == SortOrder.Descending)
{
// NULLS FIRST is the default when DESC is specified.
if (nullSortOrder != NullSortOrder.NullsFirst)
{
return false;
}
}
else
{
// NULLS LAST is the default when DESC is NOT specified.
if (nullSortOrder != NullSortOrder.NullsLast)
{
return false;
}
}
}

return true;
}
}
}

0 comments on commit 6f33b6d

Please sign in to comment.