Skip to content

FancyQuery #21

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
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
3 changes: 3 additions & 0 deletions AccountingServer.BLL/Accountant.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ public ValueTask<Voucher> SelectVoucherAsync(string id)
public IAsyncEnumerable<Voucher> SelectVouchersAsync(IQueryCompounded<IVoucherQueryAtom> query)
=> m_Db.SelectVouchers(query);

public IAsyncEnumerable<Voucher> SelectVouchersEmitAsync(IVoucherDetailQuery query)
=> m_Db.SelectVouchersEmit(query);

public IAsyncEnumerable<VoucherDetail> SelectVoucherDetailsAsync(IVoucherDetailQuery query)
=> m_Db.SelectVoucherDetails(query);

Expand Down
3 changes: 3 additions & 0 deletions AccountingServer.BLL/DbSession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,9 @@ public async ValueTask<Voucher> SelectVoucher(string id)
public IAsyncEnumerable<Voucher> SelectVouchers(IQueryCompounded<IVoucherQueryAtom> query)
=> Db.Get().SelectVouchers(query);

public IAsyncEnumerable<Voucher> SelectVouchersEmit(IVoucherDetailQuery query)
=> Db.Get().SelectVouchersEmit(query);

public IAsyncEnumerable<VoucherDetail> SelectVoucherDetails(IVoucherDetailQuery query)
=> Db.Get().SelectVoucherDetails(query);

Expand Down
7 changes: 7 additions & 0 deletions AccountingServer.DAL/IDbAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,13 @@ public interface IDbAdapter
/// <returns>匹配检索式的记账凭证</returns>
IAsyncEnumerable<Voucher> SelectVouchers(IQueryCompounded<IVoucherQueryAtom> query);

/// <summary>
/// 按检索式查找记账凭证,匹配细目检索式
/// </summary>
/// <param name="query">检索式</param>
/// <returns>匹配检索式的记账凭证,用细目检索式筛选</returns>
IAsyncEnumerable<Voucher> SelectVouchersEmit(IVoucherDetailQuery query);

/// <summary>
/// 按检索式查找细目
/// </summary>
Expand Down
8 changes: 8 additions & 0 deletions AccountingServer.DAL/MongoDbAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,14 @@ public IAsyncEnumerable<Voucher> SelectVouchers(IQueryCompounded<IVoucherQueryAt
m_Vouchers.Find(query.Accept(new MongoDbNativeVoucher())).Sort(Builders<Voucher>.Sort.Ascending("date"))
.ToAsyncEnumerable();

/// <inheritdoc />
public IAsyncEnumerable<Voucher> SelectVouchersEmit(IVoucherDetailQuery query) =>
m_Vouchers.Find(query.VoucherQuery.Accept(new MongoDbNativeVoucher()))
.Project<Voucher>(Builders<Voucher>.Projection.ElemMatch("detail",
query.ActualDetailFilter().Accept(new MongoDbNativeDetail())))
.Sort(Builders<Voucher>.Sort.Ascending("date"))
.ToAsyncEnumerable();

private static FilterDefinition<BsonDocument> GetChk(IVoucherDetailQuery query)
=> query.ActualDetailFilter().Accept(new MongoDbNativeDetailUnwinded());

Expand Down
8 changes: 8 additions & 0 deletions AccountingServer.DAL/Virtualizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@ public ValueTask<Voucher> SelectVoucher(string id)
public IAsyncEnumerable<Voucher> SelectVouchers(IQueryCompounded<IVoucherQueryAtom> query)
=> Db.SelectVouchers(query).Concat(ReadLocked(_ => _.Where(v => v.IsMatch(query))).ToAsyncEnumerable());

public IAsyncEnumerable<Voucher> SelectVouchersEmit(IVoucherDetailQuery query)
=> Db.SelectVouchersEmit(query).Concat(ReadLocked(_ => _.Where(v => v.IsMatch(query.VoucherQuery)).Select(v =>
{
var v2 = new Voucher(v);
v2.Details.RemoveAll(d => !d.IsMatch(query.ActualDetailFilter()));
return v2;
})).ToAsyncEnumerable());

public IAsyncEnumerable<VoucherDetail> SelectVoucherDetails(IVoucherDetailQuery query)
=> Db.SelectVoucherDetails(query).Concat(ReadLocked(_ => _.Where(v => v.IsMatch(query.VoucherQuery)))
.SelectMany(static v => v.Details).Where(d => d.IsMatch(query.ActualDetailFilter())).ToAsyncEnumerable());
Expand Down
6 changes: 1 addition & 5 deletions AccountingServer.Shell/AccountingShell.cs
Original file line number Diff line number Diff line change
Expand Up @@ -257,11 +257,7 @@ private Func<Session, IAsyncEnumerable<string>> TryFancyQuery(string expr, bool
/// <returns>执行结果</returns>
private IAsyncEnumerable<string> PresentFancyQuery(IVoucherDetailQuery query, Session session)
=> session.Serializer.PresentVouchers(
session.Accountant.SelectVouchersAsync(query.VoucherQuery).Select(v =>
{
v.Details.RemoveAll(d => !d.IsMatch(query.ActualDetailFilter()));
return v;
}));
session.Accountant.SelectVouchersEmitAsync(query));

/// <summary>
/// 执行记账凭证分类汇总检索式并呈现结果
Expand Down