Rochas.BWOQ 1.5.0

dotnet add package Rochas.BWOQ --version 1.5.0
                    
NuGet\Install-Package Rochas.BWOQ -Version 1.5.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Rochas.BWOQ" Version="1.5.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Rochas.BWOQ" Version="1.5.0" />
                    
Directory.Packages.props
<PackageReference Include="Rochas.BWOQ" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Rochas.BWOQ --version 1.5.0
                    
#r "nuget: Rochas.BWOQ, 1.5.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Rochas.BWOQ@1.5.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Rochas.BWOQ&version=1.5.0
                    
Install as a Cake Addin
#tool nuget:?package=Rochas.BWOQ&version=1.5.0
                    
Install as a Cake Tool

README - BWOQ (Rochas.BWOQ)

BWOQ (BitWise Object Query) é um componente para composição compacta de consultas sobre coleções de objetos em memória, usando notação bitwise e operadores pósfixados (notação polonesa reversa).

Cada atributo do objeto é indexado em uma tabela binária em tempo de execução e, com a disjunção lógica dos índices (predicados) e a combinação de critérios, você compõe Select, Where, OrderBy / OrderByDescending e GroupBy com pouquíssima escrita — além da saída JSON ou CSV dos resultados.


📌 Instalação

dotnet add package Rochas.BWOQ

📌 Nome das Classes

BitWiseQuery<T>   --> Motor de consulta (métodos longos + aliases Q, W, O, OD, G)
BWQFilter<T>      --> Builder encadeável, implementa IQueryable<T> / IEnumerable<T>

📌 Exemplo de Entidade e Tabela Binária

Cada atributo recebe uma potência de 2 na ordem de declaração:

public class Person
{
    public decimal Id { get; set; }          // 1
    public string Name { get; set; }         // 2
    public string City { get; set; }         // 4
    public string State { get; set; }        // 8
    public decimal Age { get; set; }         // 16
    public bool Active { get; set; }         // 32
    public decimal CreditLimit { get; set; } // 64
}

A combinação (soma binária) identifica um conjunto de atributos:

Name + City        = 2 + 4  = 6
Age + Active       = 16 + 32 = 48
todas as colunas   = 1+2+4+8+16+32+64 = 127

💡 Valores booleano por binário podem ser informados como 1 (true) / 0 (false) ou literalmente true / false.


⚡ Q — Seleção de Colunas (Projeção)

var bwq = new BitWiseQuery<Person>(personList.AsQueryable());

// Projeção apenas de Name (2) + City (4)
var projected = bwq.Query("6", standAlone: true);

// Todas as colunas (127), modo filtro (chainable)
var all = bwq.Q("127");

🔍 W — Filtros (Critérios)

Sintaxe: #::valor# é o binário do(s) atributo(s) e valor é o critério.

Igualdade — = (e conjunção &)

// Active (32) = true  (valor 1 + Igualdade, usando conjunção &)
var ativos = bwq.W("32::1&=");

// Igualdade pura a 1
var ativos2 = bwq.W("32::1=");

O token & aplica a conjunção And ao critério. Ao selecionar mais de um atributo no binário (ex.: 6 = Name + City), o mesmo valor e comparação são aplicados a todos eles — sem & o comportamento é disjunção Or.

Semelhança 'like' — padrão para strings (case-insensitive)

// Name contém "Silva"
var byName = bwq.W("2::silva");

// City contém "paulo" (3 pessoas de São Paulo)
var byCity = bwq.W("4::paulo");

Comparadores numéricos

var maisVelhos = bwq.W("16::40+");   // Age >  40
var maisNovos  = bwq.W("16::30-");   // Age <  30
var maiores    = bwq.W("16::35=+");  // Age >= 35
var ate35      = bwq.W("16::35=-");  // Age <= 35

✏️ O / OD — Ordenação

// Ascendente por Name (2) dos ativos
var sorted = bwq.Q("127").W("32::1&=").O("2");

// Descendente por CreditLimit (64)
var sortedDesc = bwq.Q("127").W("32::1&=").OD("64");

🧮 G — Agrupamento

// Agrupa por City (4), retornando os grupos com a Key
var groups = bwq.G("4", "4");

// Agrupa por City (4) somente dos ativos
var groupsActive = bwq.Q("127").W("32::1&=").G("4", "4");

∑ Agregações (sufixos pósfixados)

Agregações operam sobre a coluna informada no binário, agrupada pelo by:

Sufixo Operação Campo gerado no resultado
* Count CountResult
^ Sum SumOf<Atributo>s
~ Average AverageOf<Atributo>s
+ Max MaximumOf<Atributo>s
- Min MinimumOf<Atributo>s
// Contagem de ativos por City
var countByCity = bwq.Q("127").W("32::1&=").G("4*", "4");   // { City: CountResult }

// Soma de CreditLimit (64 / ativos) por City
var sumByCity = bwq.Q("127").W("32::1&=").G("64^", "4");    // { City: SumOfCreditLimits }

// Média de Age (16 / ativos) por City
var avgByCity = bwq.Q("127").W("32::1&=").G("16~", "4");    // { City: AverageOfAges }

// Máx e Mín de CreditLimit por City
var maxByCity = bwq.Q("127").W("32::1&=").G("64+", "4");    // { City: MaximumOfCreditLimits }
var minByCity = bwq.Q("127").W("32::1&=").G("64-", "4");    // { City: MinimumOfCreditLimits }

🔗 Navegação em Objetos Agregados

Atributos que são classes do mesmo módulo são excluídos da tabela binária plana e acessados por navegação >posição:máscara.

public class Employee
{
    public decimal Id { get; set; }             // 1
    public string Name { get; set; }            // 2
    public decimal Age { get; set; }            // 4
    public bool Active { get; set; }            // 8

    public Credential Credential { get; set; }  // agregado (posição ordinal 1)
}

public class Credential
{
    public decimal Id { get; set; }             // 1
    public string Logon { get; set; }           // 2
    public string TokenId { get; set; }         // 4
}
var empBwq = new BitWiseQuery<Employee>(employeeList.AsQueryable());

// Id + Name (3) do Employee + Logon (2) do Credential
var proj = empBwq.Q("3>1:2", true);

// Ativos (8) + TokenId (4) do Credential
var proj2 = empBwq.Q("8>1:4", true);

// Age (4) + todos os campos do Credential (7)
var projDeep = empBwq.Q("4>1:7", true);
// Name (2) do Employee + Logon (2) do Credential, ambos por like de "ana"
var byCredential = empBwq.Q("15").W("2>1:2::ana");

🔗 Builder Encadeado

O BWQFilter<T> implementa IQueryable<T>; basta encadear e enumerar:

var result = bwq.Q("127")
                .W("32::1&=")
                .O("2")
                .ToList();            // List<Person>

foreach (var person in result)
    Console.WriteLine($"{person.Name} - {person.City}");

📄 Saídas JSON / CSV

var json = bwq.Where("32::1&=", EnumSerialDataType.JSON);
var csv  = bwq.Where("32::1&=", EnumSerialDataType.CSV);

❓ Referência de Sintaxe

Predicado (seleção de atributos)

Token Significado
N Combinação binária dos atributos selecionados
> Início da navegação para objeto agregado
N Posição ordinal do agregado
: Token 'obter' os atributos do agregado
M Binário dos atributos selecionados do agregado
* Count (contagem)
^ Sum (soma)
~ Average (média)
+ Max
- Min

Critério (filtro Where)

Token Exemplo Significado
#:: 32::1&= 'onde o valor é'
& 32::1&= Conjunção And (padrão: Or)
= 32::1= Igualdade
(default) 2::carlos Semelhança ('like') para strings
+ 16::40+ Maior que (na agregação: Max)
- 16::30- Menor que (na agregação: Min)
=+ 16::35=+ Maior ou igual
=- 16::35=- Menor ou igual

🔧 Métodos Disponíveis

BitWiseQuery<T> (motor de consulta)

Método Alias Retorno
Query(string) Q(string) BWQFilter<T> (builder)
Query(string, bool) Q(string, standAlone) IQueryable (projeção)
Query(string, EnumSerialDataType) Q(...) string (JSON/CSV)
Where(string) W(string) IQueryable
Where(string, bool) W(string, hasSufix) BWQFilter<T>
Where(string, EnumSerialDataType) W(...) string (JSON/CSV)
OrderBy(string) O(string) IQueryable
OrderByDescending(string) OD(string) IQueryable
GroupBy(string, string) G(by, grp) IQueryable

BWQFilter<T> (builder)

Método Retorno
W(string) BWQFilter<T>
O(string) BWQFilter<T>
OD(string) BWQFilter<T>
G(string, string) IQueryable

🧪 Testes

O pacote Rochas.BWOQ.Test cobre (18 testes aprovados / 0 falhas):

  • Projeção de colunas (Q(..., true)) e navegação em agregados;
  • Filtros: =, & (AND), like, +, -, =+, =-, inclusive em atributos de agregado;
  • Ordenação O / OD;
  • Builder encadeado Q().W().O()/OD();
  • Agrupamento G e agregações Count, Sum, Max.
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.1 is compatible. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.5.0 33 8/8/2026
1.4.0 42 8/8/2026

Modernized to netstandard2.1, System.Linq.Dynamic.Core, System.Text.Json; added short method aliases (Q, W, G, O, OD); bug fixes on chain builder propagation, instance-based state, like/contains default comparison for strings, value extraction with conjunction token; hierarchy read BASE TO DERIVED (base fields keep lower masks/indices since most consulted) and BigInteger masks (no 31-field ceiling) via BitWiseTable helper