Result handling for Kusto results (#1079)

* Revert "Fix for displaying multiple table (#1075)"

This reverts commit df0be31019.

* KustoResultsReader trims results
This commit is contained in:
Shafiq Ur Rahman
2020-09-21 10:02:23 -07:00
committed by GitHub
parent fea050448d
commit 2e6b134953
4 changed files with 82 additions and 52 deletions

View File

@@ -8,8 +8,18 @@ namespace Microsoft.Kusto.ServiceLayer.DataSource
{
public class DataReaderWrapper : IDataReader
{
private readonly IDataReader _inner ;
public DataReaderWrapper(IDataReader inner)
private IDataReader _inner ;
protected DataReaderWrapper()
{
}
protected DataReaderWrapper(IDataReader inner)
{
SetDataReader(inner);
}
protected void SetDataReader(IDataReader inner)
{
_inner = inner;
}

View File

@@ -1,27 +1,39 @@
using Microsoft.Kusto.ServiceLayer.QueryExecution;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Data;
namespace Microsoft.Kusto.ServiceLayer.DataSource
{
internal class KustoResultsReader : DataReaderWrapper
{
public KustoResultsReader(IDataReader reader)
: base(reader)
{
}
private DataSet _resultDataSet;
/// <summary>
/// Kusto returns atleast 4 results tables - QueryResults(sometimes more than one), QueryProperties, QueryStatus and Query Results Metadata Table.
/// When returning query results we need to trim off the last 3 tables as we want the caller to only read results table.
/// ADS just needs query results. When returning query results we need to trim off the last 3 tables.
/// </summary>
public void SanitizeResults(List<ResultSet> resultSets)
public KustoResultsReader(IDataReader reader)
: base()
{
if (resultSets.Count > 3)
// Read out all tables
List<DataTable> results = new List<DataTable>();
while (!(reader?.IsClosed ?? true))
{
resultSets.RemoveRange(resultSets.Count - 3, 3);
DataTable dt = new DataTable();
dt.Load(reader); // This calls NextResult on the reader
results.Add(dt);
}
// Trim results
if(results.Count > 3) results.RemoveRange(results.Count - 3, 3);
// Create a DataReader for the trimmed set
_resultDataSet = new DataSet();
foreach(var result in results)
{
_resultDataSet.Tables.Add(result);
}
SetDataReader(_resultDataSet.CreateDataReader());
}
}
}