Skip to content

Commit

Permalink
Feeling good about duplicated value array fields. Closes GH-2768
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremydmiller committed Nov 30, 2023
1 parent 728fefb commit 10ab24f
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 4 deletions.
3 changes: 2 additions & 1 deletion src/LinqTests/Acceptance/Support/DefaultQueryFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ public DefaultQueryFixture()
.Duplicate(x => x.Date)
.Duplicate(x => x.Double)
.Duplicate(x => x.Flag)
.Duplicate(x => x.Color);
.Duplicate(x => x.Color)
.Duplicate(x => x.NumberArray);
});
}

Expand Down
8 changes: 7 additions & 1 deletion src/LinqTests/Acceptance/child_collection_queries.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,13 @@ public Task run_query(string description)
return assertTestCase(description, Fixture.Store);
}

// TODO -- make NumberArray and StringArray be duplicated fields

[Theory]
[MemberData(nameof(GetDescriptions))]
public Task with_duplicated_fields(string description)
{
return assertTestCase(description, Fixture.DuplicatedFieldStore);
}



Expand Down
58 changes: 56 additions & 2 deletions src/Marten/Linq/Members/DuplicatedArrayField.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ public DuplicatedArrayField(EnumStorage enumStorage, QueryableMember innerMember

_count = new CollectionLengthMember(this);

IsEmpty = new WhereFragment($"({RawLocator} is null or jsonb_array_length({JSONBLocator}) = 0)");
NotEmpty = new WhereFragment($"({RawLocator} is not null and jsonb_array_length({JSONBLocator}) > 0)");
IsEmpty = new ArrayIsEmptyFilter(this);
NotEmpty = new ArrayIsNotEmptyFilter(this);
}

private readonly WholeDataMember _wholeDataMember;
Expand Down Expand Up @@ -128,3 +128,57 @@ public IEnumerator<IQueryableMember> GetEnumerator()
throw new NotSupportedException();
}
}

internal class ArrayIsEmptyFilter: IReversibleWhereFragment
{
private readonly DuplicatedArrayField _member;
private readonly string _text;

public ArrayIsEmptyFilter(DuplicatedArrayField member)
{
_member = member;
_text = $"({member.RawLocator} is null or coalesce(array_length({member.RawLocator}, 1), 0) = 0)";
}

public void Apply(CommandBuilder builder)
{
builder.Append(_text);
}

public bool Contains(string sqlText)
{
return false;
}

public ISqlFragment Reverse()
{
return _member.NotEmpty;
}
}

internal class ArrayIsNotEmptyFilter: IReversibleWhereFragment
{
private readonly string _text;
private readonly DuplicatedArrayField _member;

public ArrayIsNotEmptyFilter(DuplicatedArrayField member)
{
_text = $"coalesce(array_length({member.RawLocator}, 1), 0) > 0";
_member = member;
}

public void Apply(CommandBuilder builder)
{
builder.Append(_text);
}

public bool Contains(string sqlText)
{
return false;
}

public ISqlFragment Reverse()
{
return _member.IsEmpty;
}
}

0 comments on commit 10ab24f

Please sign in to comment.