tomasfabian / ksqlDB.RestApi.Client-DotNet

ksqlDb.RestApi.Client is a C# LINQ-enabled client API for issuing and consuming ksqlDB push and pull queries and executing statements.
MIT License
94 stars 25 forks source link

Use 'OrderBy' in Pull query #8

Closed vijaymandave closed 3 years ago

vijaymandave commented 3 years ago

Hi,

I am using below code to fetch records from Kafka-

public static async Task<List<OrderData>> GetOrderStreamsAsync()
{
  var ksqlDbUrl = @"http:\\localhost:8088";
  var options = new KSqlDBContextOptions(ksqlDbUrl) { ShouldPluralizeFromItemName = false };
  options.QueryParameters.Properties["ksql.query.pull.table.scan.enabled"] = "true";

  await using var context = new KSqlDBContext(options);
  var tableName = "queryable_order";
  var orderTypes = new List<int> { 1,3 };

  var list = await context.CreatePullQuery<OrderData>(tableName)    
    .Where(o => o.EventTime >= 1630886400 && o.EventTime <= 1630887401 && orderTypes.Contains(o.OrderType))
    //.OrderBy(o=> o.EventTime)
    .GetManyAsync().ToListAsync();

  return list;  
}

I want to fetch records order wise. Please suggest.

tomasfabian commented 3 years ago

Hi @vijaymandave, ksqldb does not support the ORDER BY clause. You have to reorder the items client side in the following manner:

using System.Linq;
 var list = await context.CreatePullQuery<OrderData>(tableName)    
    .Where(o => o.EventTime >= 1630886400 && o.EventTime <= 1630887401 && orderTypes.Contains(o.OrderType))
    //.OrderBy(o=> o.EventTime)
    .GetManyAsync()
    .OrderBy(c => c.EventTime)
    .ToListAsync();

or

 var list = await context.CreatePullQuery<OrderData>(tableName)    
    .Where(o => o.EventTime >= 1630886400 && o.EventTime <= 1630887401 && orderTypes.Contains(o.OrderType))
    //.OrderBy(o=> o.EventTime)
    .GetManyAsync()
    .ToListAsync();

list = list.OrderBy(c => c.EventTime).ToList();

Regards, Tomas.

vijaymandave commented 3 years ago

Thank you.