mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-21 09:35:39 -05:00
feature/edit/subset (#283)
* Changing query/subset API to only use Result on success, Error on error * Creating an interservice API for getting query result subsets * Updates to subset API * RowStartIndex is now long * Output of query/subset is a 2D array of DbCellValue * Adding LongSkip method to LongList to allow skipping ahead by longs * Moving LongList back to ServiceLayer utilities. Move refactoring * Stubbing out request for edit/subset * Initial implementation of getting edit rows * Unit tests for RowEdit and RowDelete .GetEditRow * Fixing major bugs in LongList implementation, adding much more thorough tests * Adding some more unit tests and fixes to make unit tests pass * Fixing comment
This commit is contained in:
@@ -13,6 +13,7 @@ using System.Threading.Tasks;
|
||||
using Microsoft.SqlTools.ServiceLayer.EditData.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.EditData.UpdateManagement;
|
||||
using Microsoft.SqlTools.ServiceLayer.QueryExecution;
|
||||
using Microsoft.SqlTools.ServiceLayer.QueryExecution.Contracts;
|
||||
using Microsoft.SqlTools.Utility;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.EditData
|
||||
@@ -186,6 +187,60 @@ namespace Microsoft.SqlTools.ServiceLayer.EditData
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieves a subset of rows with the pending updates applied. If more rows than exist
|
||||
/// are requested, only the rows that exist will be returned.
|
||||
/// </summary>
|
||||
/// <param name="startIndex">Index to start returning rows from</param>
|
||||
/// <param name="rowCount">The number of rows to return.</param>
|
||||
/// <returns>An array of rows with pending edits applied</returns>
|
||||
public async Task<EditRow[]> GetRows(long startIndex, int rowCount)
|
||||
{
|
||||
// Get the cached rows from the result set
|
||||
ResultSetSubset cachedRows = startIndex < associatedResultSet.RowCount
|
||||
? await associatedResultSet.GetSubset(startIndex, rowCount)
|
||||
: new ResultSetSubset
|
||||
{
|
||||
RowCount = 0,
|
||||
Rows = new DbCellValue[][] { }
|
||||
};
|
||||
|
||||
// Convert the rows into EditRows and apply the changes we have
|
||||
List<EditRow> editRows = new List<EditRow>();
|
||||
for (int i = 0; i < cachedRows.RowCount; i++)
|
||||
{
|
||||
long rowId = i + startIndex;
|
||||
RowEditBase edr;
|
||||
if (EditCache.TryGetValue(rowId, out edr))
|
||||
{
|
||||
// Ask the edit object to generate an edit row
|
||||
editRows.Add(edr.GetEditRow(cachedRows.Rows[i]));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Package up the existing row into a clean edit row
|
||||
EditRow er = new EditRow
|
||||
{
|
||||
Id = rowId,
|
||||
Cells = cachedRows.Rows[i],
|
||||
State = EditRow.EditRowState.Clean
|
||||
};
|
||||
editRows.Add(er);
|
||||
}
|
||||
}
|
||||
|
||||
// If the requested range of rows was at the end of the original cell set and we have
|
||||
// added new rows, we need to reflect those changes
|
||||
if (rowCount > cachedRows.RowCount)
|
||||
{
|
||||
long endIndex = startIndex + cachedRows.RowCount;
|
||||
var newRows = EditCache.Where(edit => edit.Key >= endIndex).Take(rowCount - cachedRows.RowCount);
|
||||
editRows.AddRange(newRows.Select(newRow => newRow.Value.GetEditRow(null)));
|
||||
}
|
||||
|
||||
return editRows.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reverts a cell in a pending edit
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user