Kinetica   C#   API  Version 7.2.3.1
RecordRetrieverTests.cs
Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using Xunit;
4 using Kinetica.Tests.Common;
5 using kinetica;
6 
8 {
17  [Trait("Category", "Integration")]
18  public class RecordRetrieverTests
19  {
23  private string SetupShardedTable(TestContext ctx, int numRecords)
24  {
25  // Create type with shard keys
26  var typeDef = @"{""type"":""record"",""name"":""simple_record"",""fields"":[{""name"":""id"",""type"":""int""},{""name"":""name_sk"",""type"":""string""},{""name"":""value_sk"",""type"":""int""},{""name"":""score"",""type"":""double""}]}";
27 
28  var properties = new Dictionary<string, IList<string>>
29  {
30  { "id", new List<string>() },
31  { "name_sk", new List<string> { "shard_key" } },
32  { "value_sk", new List<string> { "shard_key" } },
33  { "score", new List<string>() }
34  };
35 
36  var typeResp = ctx.Kinetica.createType(typeDef, "test_retriever_type", properties, new Dictionary<string, string>());
37 
38  var tableName = ctx.QualifiedTable("test_retriever");
39  ctx.Kinetica.createTable(tableName, typeResp.type_id, new Dictionary<string, string>());
40 
41  // Create indices on shard key columns for multi-head lookup
42  foreach (var col in new[] { "name_sk", "value_sk" })
43  {
44  try
45  {
46  ctx.Kinetica.alterTable(tableName, "create_index", col, new Dictionary<string, string>());
47  }
48  catch { /* Ignore if index already exists */ }
49  }
50 
51  // Insert test data using SQL
52  for (int i = 0; i < numRecords; i++)
53  {
54  var nameSk = $"name_{i:D5}";
55  var valueSk = i;
56  var score = (i % 10) * 10.0;
57  ctx.Kinetica.executeSql($"INSERT INTO {tableName} (id, name_sk, value_sk, score) VALUES ({i}, '{nameSk}', {valueSk}, {score})");
58  }
59 
60  return tableName;
61  }
62 
63  [Fact]
64  public void TestGetRecordsBasic()
65  {
66  using var ctx = new TestContext("get_records_basic");
67  var numRecords = 50;
68  var tableName = SetupShardedTable(ctx, numRecords);
69 
70  // Verify table has expected records using SQL
71  var response = ctx.Kinetica.executeSql($"SELECT * FROM {tableName}", 0, -9999);
72  Console.WriteLine($"Table has {response.total_number_of_records} records (expected {numRecords})");
73 
74  Assert.Equal(numRecords, response.total_number_of_records);
75  Assert.Equal(numRecords, response.data.Count);
76  }
77 
78  [Fact]
80  {
81  using var ctx = new TestContext("get_records_key");
82  var numRecords = 20;
83  var tableName = SetupShardedTable(ctx, numRecords);
84 
85  // Test: Retrieve record by shard key values
86  var response = ctx.Kinetica.executeSql($"SELECT * FROM {tableName} WHERE name_sk = 'name_00005' AND value_sk = 5", 0, -9999);
87 
88  Console.WriteLine($"Query by shard key returned {response.total_number_of_records} records");
89  Assert.Equal(1, response.total_number_of_records);
90  }
91 
92  [Fact]
94  {
95  using var ctx = new TestContext("get_records_expr");
96  var tableName = SetupShardedTable(ctx, 50);
97 
98  // Test: Retrieve with expression filter
99  var response = ctx.Kinetica.executeSql($"SELECT * FROM {tableName} WHERE id < 25", 0, -9999);
100  Console.WriteLine($"Query with expression returned {response.total_number_of_records} records (expected 25)");
101 
102  Assert.Equal(25, response.total_number_of_records);
103 
104  // Test: Retrieve with combined expression
105  var response2 = ctx.Kinetica.executeSql($"SELECT * FROM {tableName} WHERE id >= 40 AND score < 50", 0, -9999);
106  Console.WriteLine($"Query with combined expression returned {response2.total_number_of_records} records");
107 
108  Assert.True(response2.total_number_of_records >= 0);
109  }
110 
111  [Fact]
113  {
114  using var ctx = new TestContext("get_records_multi");
115  var numRecords = 30;
116  var tableName = SetupShardedTable(ctx, numRecords);
117 
118  var totalFound = 0;
119 
120  // Search for multiple records by key
121  for (int i = 0; i < 10; i++)
122  {
123  var response = ctx.Kinetica.executeSql($"SELECT * FROM {tableName} WHERE name_sk = 'name_{i:D5}' AND value_sk = {i}", 0, -9999);
124  totalFound += (int)response.total_number_of_records;
125  }
126 
127  Console.WriteLine($"Multi-key retrieval: found {totalFound} records");
128  Assert.Equal(10, totalFound); // Each key should find exactly 1 record
129  }
130 
131  [Fact]
133  {
134  using var ctx = new TestContext("get_records_sort");
135  var tableName = SetupShardedTable(ctx, 25);
136 
137  // Test: Retrieve with sorting
138  var response = ctx.Kinetica.executeSql($"SELECT * FROM {tableName} ORDER BY score DESC, id ASC", 0, -9999);
139 
140  Console.WriteLine($"Sorted query returned {response.total_number_of_records} records");
141  Assert.Equal(25, response.total_number_of_records);
142  }
143 
144  [Fact]
146  {
147  using var ctx = new TestContext("get_records_page");
148  var numRecords = 50;
149  var tableName = SetupShardedTable(ctx, numRecords);
150 
151  // Get first page
152  var page1 = ctx.Kinetica.executeSql($"SELECT * FROM {tableName}", 0, 10);
153  Assert.Equal(50, page1.total_number_of_records);
154  Assert.Equal(10, page1.data.Count);
155  Assert.True(page1.has_more_records);
156 
157  // Get second page
158  var page2 = ctx.Kinetica.executeSql($"SELECT * FROM {tableName}", 10, 10);
159  Assert.Equal(10, page2.data.Count);
160  Assert.True(page2.has_more_records);
161 
162  // Get last page
163  var lastPage = ctx.Kinetica.executeSql($"SELECT * FROM {tableName}", 40, 10);
164  Assert.Equal(10, lastPage.data.Count);
165  Assert.False(lastPage.has_more_records);
166  }
167 
168  [Fact]
170  {
171  using var ctx = new TestContext("get_records_empty");
172  var tableName = SetupShardedTable(ctx, 0);
173 
174  var response = ctx.Kinetica.executeSql($"SELECT * FROM {tableName}", 0, -9999);
175 
176  Assert.Equal(0, response.total_number_of_records);
177  Assert.Empty(response.data);
178  Assert.False(response.has_more_records);
179  }
180 
181  [Fact]
183  {
184  using var ctx = new TestContext("get_records_offset");
185  var tableName = SetupShardedTable(ctx, 10);
186 
187  // Offset beyond table size
188  var response = ctx.Kinetica.executeSql($"SELECT * FROM {tableName}", 100, 10);
189 
190  Assert.Equal(10, response.total_number_of_records);
191  Assert.Empty(response.data);
192  }
193 
194  [Fact]
196  {
197  using var ctx = new TestContext("get_records_cols");
198  var tableName = SetupShardedTable(ctx, 20);
199 
200  // Select specific columns
201  var response = ctx.Kinetica.executeSql($"SELECT id, score FROM {tableName} WHERE id < 10", 0, -9999);
202 
203  Assert.Equal(10, response.total_number_of_records);
204  Assert.Equal(10, response.data.Count);
205  }
206 
207  [Fact]
209  {
210  using var ctx = new TestContext("get_records_agg");
211  var tableName = SetupShardedTable(ctx, 100);
212 
213  // Test aggregation
214  var response = ctx.Kinetica.executeSql($"SELECT COUNT(*), AVG(score) FROM {tableName}", 0, -9999);
215 
216  Assert.Equal(1, response.total_number_of_records);
217  Assert.Single(response.data);
218  }
219 
220  [Fact]
221  public void TestGetRecordsGroupBy()
222  {
223  using var ctx = new TestContext("get_records_group");
224  var tableName = SetupShardedTable(ctx, 30);
225 
226  // Group by score (there should be 10 distinct scores: 0, 10, 20, ..., 90)
227  var response = ctx.Kinetica.executeSql($"SELECT score, COUNT(*) as cnt FROM {tableName} GROUP BY score ORDER BY score", 0, -9999);
228 
229  Assert.Equal(10, response.total_number_of_records);
230  }
231  }
232 }
CreateTableResponse createTable(CreateTableRequest request_)
Creates a new table with the given type (definition of columns).
ExecuteSqlResponse executeSql(ExecuteSqlRequest request_)
Execute a SQL statement (query, DML, or DDL).
Test context that manages schema and cleanup for integration tests.
Definition: TestContext.cs:11
CreateTypeResponse createType(CreateTypeRequest request_)
Creates a new type describing the columns of a table.
AlterTableResponse alterTable(AlterTableRequest request_)
Apply various modifications to a table or view.
string QualifiedTable(string tableName)
Get a qualified table name (schema.table).
Definition: TestContext.cs:74