Apache.Druid.Querying
0.7.0
See the version list below for details.
dotnet add package Apache.Druid.Querying --version 0.7.0
NuGet\Install-Package Apache.Druid.Querying -Version 0.7.0
<PackageReference Include="Apache.Druid.Querying" Version="0.7.0" />
paket add Apache.Druid.Querying --version 0.7.0
#r "nuget: Apache.Druid.Querying, 0.7.0"
// Install Apache.Druid.Querying as a Cake Addin #addin nuget:?package=Apache.Druid.Querying&version=0.7.0 // Install Apache.Druid.Querying as a Cake Tool #tool nuget:?package=Apache.Druid.Querying&version=0.7.0
Apache Druid client library/micro-orm for dotnet 6+ inspired by EF Core.
Setup
To make your Druid data sources available for querying create a class inheriting from Apache.Druid.Querying.DataSourceProvider
. The class represents collection of data sources available for querying similarity to how EfCore
's DbContext
represents collection of database tables. The class contains methods Table
, Lookup
and Inline
which you can use to create instances of Apache.Druid.Querying.DataSource
(similar to EfCore
's DbSet
) which in turn turn can be used of querying. The instances are thread safe and so can be used for executing multiple queries at the same time. Some of the DataSource
creating methods require parameter id
which corresponds to id of related Druid
data source.
The method Table
additionally requires generic parameter TSource
depicting a row of your table data, similarily to how EfCore
's Entities
depict database rows. The type's public properties correspond to the data source columns.
By default TSource
property names map 1-to-1 into Druid
data source column names. This can be overriden in two ways:
- By decorating
TSource
withApache.Druid.Querying.DataSourceNamingConvention
attribute. The convention will applied to allTSource
's property names. - By decorating
TSource
's properties withApache.Druid.Querying.DataSourceColumn
attribute. The string parameter passed to the attrubute will become the data source column name. As mostDruid
data source contain column__time
for convenience there exists attributeApache.Druid.Querying.DataSourceTimeColumn
equivalent toApache.Druid.Querying.DataSourceColumn("__time")
.
[DataSourceColumnNamingConvention.CamelCase]
public record Edit(
[property: DataSourceTimeColumn] DateTimeOffset Timestamp,
bool IsRobot,
string Channel,
string Flags,
bool IsUnpatrolled,
string Page,
[property: DataSourceColumn("diffUrl")] string DiffUri,
int Added,
string Comment,
int CommentLength,
bool IsNew,
bool IsMinor,
int Delta,
bool IsAnonymous,
string User,
int DeltaBucket,
int Deleted,
string Namespace,
string CityName,
string CountryName,
string? RegionIsoCode,
int? MetroCode,
string? CountryIsoCode,
string? RegionName);
public class WikipediaDataSourceProvider : DataSourceProvider
{
public WikipediaDataSourceProvider()
{
// Corresponde to Druid's example wikipedia edits data.
Edits = Table<Edit>("wikipedia");
}
public DataSource<Edit> Edits { get; }
}
Then connect up your data source provider to a depency injection framework of your choice:
Querying
Choose query type and models representing query's data using nested types of Apache.Druid.Querying.Query<TSource>
. Create a query by instantiating chosen nested type. Set query data by calling the instance methods. The methods often accept Expression<Delegate>
, using which given an object representing input data available at that point in a query and an object representing all possible operations on that input data, you create an object representing results of your chosen operation. To get an idea on what's possible it's best look into project's tests. The queries have been designed so as much information as possible is available complie time. Wherever possible, the query results have been "flattened" so they are streams to their consumer as soon as possible.
Currently available query types:
- TimeSeries
- TopN
- GroupBy
- Scan (currently missing option to specifiy a subset columns)
// Getting DataSourceProvider from dependency injection container.
private static WikipediaDataSourceProvider Wikipedia
=> Services.GetRequiredService<WikipediaDataSourceProvider>();
private record Aggregations(int Count, int TotalAdded);
private record PostAggregations(double AverageAdded);
public void ExampleTimeSeries()
{
var query = new Query<Edit>
.TimeSeries
.WithNoVirtualColumns
.WithAggregations<Aggregations>
.WithPostAggregations<PostAggregations>()
.Order(OrderDirection.Descending)
.Aggregations(type => new Aggregations( // Explicitly stating data types in the methods for the sake of clarity in the example. Query is able to infer them.
type.Count(),
type.Sum((Edit edit) => edit.Added)))
.PostAggregations(type => new PostAggregations(type.Arithmetic(
ArithmeticFunction.Divide,
type.FieldAccess(aggregations => aggregations.TotalAdded),
type.FieldAccess(aggregations => aggregations.Count))))
.Filter(type => type.Selector(edit => edit.CountryIsoCode, "US"))
.Interval(new(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddDays(1)))
.Granularity(Granularity.Hour)
.Context(new QueryContext.TimeSeries() { SkipEmptyBuckets = true });
var json = Wikipedia.Edits.MapQueryToJson(query); // Use MapQueryToJson to look up query's json representation.
IAsyncEnumerable<WithTimestamp<Aggregations_PostAggregations<Aggregations, PostAggregations>>> results
= Wikipedia.Edits.ExecuteQuery(query);
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. 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. |
-
net6.0
- No dependencies.
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Apache.Druid.Querying:
Package | Downloads |
---|---|
Apache.Druid.Querying.Microsoft.Extensions.DependencyInjection
Integrates Apache.Druid.Querying with Microsoft.Extensions.DependencyInjection. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.4.0 | 38 | 2/15/2025 |
1.3.1 | 951 | 10/24/2024 |
1.3.0 | 193 | 9/24/2024 |
1.2.0 | 195 | 5/5/2024 |
1.0.3-alpha.0.1 | 65 | 4/30/2024 |
1.0.2 | 135 | 4/29/2024 |
1.0.1 | 131 | 4/24/2024 |
1.0.0 | 151 | 4/7/2024 |
0.7.9 | 148 | 3/30/2024 |
0.7.7 | 151 | 3/23/2024 |
0.7.6 | 146 | 3/23/2024 |
0.7.6-alpha.0.1 | 67 | 3/23/2024 |
0.7.5 | 157 | 3/23/2024 |
0.7.4 | 154 | 3/22/2024 |
0.7.3 | 146 | 3/15/2024 |
0.7.2 | 154 | 3/11/2024 |
0.7.0 | 167 | 2/21/2024 |