Skip to content

Commit 7c172f9

Browse files
committed
fixed various bugs related to changes in Saber
1 parent 3e37fe1 commit 7c172f9

File tree

2 files changed

+187
-47
lines changed

2 files changed

+187
-47
lines changed

DataSources.cs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public List<KeyValuePair<string, string>> List()
2727
public DataSource Get(string key)
2828
{
2929
//get information about a data set as a data source
30-
return Cache.DataSources.Where(a => a.Key == key).FirstOrDefault();
30+
return Cache.DataSources.Where(a => a.Key == key).FirstOrDefault() ?? new DataSource();
3131
}
3232

3333
public void Create(IRequest request, string key, Dictionary<string, string> columns)
@@ -50,11 +50,16 @@ public List<Dictionary<string, string>> Filter(IRequest request, string key, int
5050
{
5151
//get filtered records from a data set
5252
var datasetId = int.Parse(key);
53-
return Query.DataSets.GetRecords(datasetId, start, length, lang, request.User.UserId, filters, orderBy)?
54-
.Select(a => a.ToDictionary(k => k.Key, v => v.Value == null ? "" : v.Value.ToString())).ToList();
53+
var results = Query.DataSets.GetRecords(datasetId, start, length, lang, request.User.UserId, filters, orderBy)?
54+
.Select(a => a.ToDictionary(k => k.Key, v => v.Value.ToString() ?? ""));
55+
if(results == null)
56+
{
57+
return new List<Dictionary<string, string>>();
58+
}
59+
return results.ToList();
5560
}
5661

57-
public Dictionary<string, List<Dictionary<string, string>>> Filter(IRequest request, string key, string lang = "en", Dictionary<string, DataSource.PositionSettings> positions = null, Dictionary<string, List<DataSource.FilterGroup>> filters = null, Dictionary<string, List<DataSource.OrderBy>> orderBy = null, string[] childKeys = null)
62+
public Dictionary<string, List<Dictionary<string, string>>> Filter(IRequest request, string key, string lang = "en", Dictionary<string, DataSource.PositionSettings> positions = null, Dictionary<string, List<DataSource.FilterGroup>> filters = null, Dictionary<string, List<DataSource.OrderBy>> orderBy = null, string[] childKeys = null)
5863
{
5964
var datasetId = int.Parse(key);
6065
return Query.DataSets.GetRecordsInRelationships(datasetId, lang, request.User.UserId, positions, filters, orderBy, childKeys)?
@@ -65,20 +70,22 @@ public Dictionary<string, List<Dictionary<string, string>>> Filter(IRequest requ
6570
var c = new Dictionary<string, string>();
6671
foreach(var k in b)
6772
{
68-
c.Add(k.Key, k.Value.ToString());
73+
c.Add(k.Key, k.Value.ToString() ?? "");
6974
}
7075
return c;
7176
}).ToList());
72-
});
77+
}) ?? new Dictionary<string, List<Dictionary<string, string>>>();
7378
}
74-
int IVendorDataSources.FilterTotal(IRequest request, string key, string lang, List<DataSource.FilterGroup> filter, List<DataSource.OrderBy> orderBy)
79+
int IVendorDataSources.FilterTotal(IRequest request, string key, string lang, List<DataSource.FilterGroup> filter)
7580
{
76-
throw new NotImplementedException();
81+
var datasetId = int.Parse(key);
82+
return Query.DataSets.GetRecordCount(datasetId, lang, request.User.UserId, filter);
7783
}
7884

79-
Dictionary<string, int> IVendorDataSources.FilterTotal(IRequest request, string key, string lang, Dictionary<string, List<DataSource.FilterGroup>> filter, Dictionary<string, List<DataSource.OrderBy>> orderBy, string[] childKeys)
85+
Dictionary<string, int> IVendorDataSources.FilterTotal(IRequest request, string key, string lang, Dictionary<string, List<DataSource.FilterGroup>> filters, string[] childKeys)
8086
{
81-
throw new NotImplementedException();
87+
var datasetId = int.Parse(key);
88+
return Query.DataSets.GetRecordCountInRelationships(datasetId, lang, request.User.UserId, filters, childKeys);
8289
}
8390
}
8491
}

Query/DataSets.cs

Lines changed: 170 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public enum SearchType
4141
exactMatch = -1
4242
}
4343

44+
#region "Filter"
4445
public static List<IDictionary<string, object>> GetRecords(int datasetId, int start = 1, int length = 50, string lang = "", int userId = 0, List<Saber.Vendor.DataSource.FilterGroup> filters = null, List<Saber.Vendor.DataSource.OrderBy> sort = null)
4546
{
4647
var datasource = Saber.Vendors.DataSets.Cache.DataSources.Where(a => a.Key == datasetId.ToString()).FirstOrDefault();
@@ -161,50 +162,52 @@ FROM DataSet_" + dataset.tableName + @" d
161162
if (childKeys != null && !childKeys.Contains("dataset-" + child.Child.Key)) { continue; }
162163
var childId = int.Parse(child.Child.Key);
163164
dataset = Saber.Vendors.DataSets.Cache.DataSets.Where(a => a.datasetId == childId).FirstOrDefault();
165+
if(dataset != null)
166+
{
167+
sql.Append(@"
168+
GO
164169
165-
sql.Append(@"
166-
GO
167-
168-
SELECT u.name AS username, u.email AS useremail, d.*
169-
FROM DataSet_" + dataset.tableName + @" d
170-
LEFT JOIN Users u ON u.userId=d.userId
171-
WHERE " + (userId > 0 ? "d.userId=" + userId + " AND" : "") + " d.lang='" + lang + @"'
172-
AND d." + child.ChildColumn + @" IN (SELECT id FROM " + tmpTable + ")");
170+
SELECT u.name AS username, u.email AS useremail, d.*
171+
FROM DataSet_" + dataset.tableName + @" d
172+
LEFT JOIN Users u ON u.userId=d.userId
173+
WHERE " + (userId > 0 ? "d.userId=" + userId + " AND" : "") + " d.lang='" + lang + @"'
174+
AND d." + child.ChildColumn + @" IN (SELECT id FROM " + tmpTable + ")");
173175

174-
key = "dataset-" + childId.ToString();
175-
if (filters != null && filters.ContainsKey(key) && filters[key].Count > 0)
176-
{
177-
for (var x = 0; x < filters[key].Count; x++)
176+
key = "dataset-" + childId.ToString();
177+
if (filters != null && filters.ContainsKey(key) && filters[key].Count > 0)
178178
{
179-
//generate root filter group sql
180-
var group = filters[key][x];
181-
sql.Append(" AND " + GetFilterGroupSql(group, datasource.Columns));
179+
for (var x = 0; x < filters[key].Count; x++)
180+
{
181+
//generate root filter group sql
182+
var group = filters[key][x];
183+
sql.Append(" AND " + GetFilterGroupSql(group, datasource.Columns));
184+
}
182185
}
183-
}
184-
if (sort != null && sort.ContainsKey(key) && sort[key].Count > 0)
185-
{
186-
sql.Append("\n ORDER BY ");
187-
for (var x = 0; x < sort[key].Count; x++)
186+
if (sort != null && sort.ContainsKey(key) && sort[key].Count > 0)
188187
{
189-
//generate order by sql
190-
var orderby = sort[key][x];
191-
sql.Append(orderby.Column +
192-
(orderby.Direction == Saber.Vendor.DataSource.OrderByDirection.Ascending ? " ASC" : " DESC") +
193-
(x < sort[key].Count - 1 ? ", \n" : "\n"));
188+
sql.Append("\n ORDER BY ");
189+
for (var x = 0; x < sort[key].Count; x++)
190+
{
191+
//generate order by sql
192+
var orderby = sort[key][x];
193+
sql.Append(orderby.Column +
194+
(orderby.Direction == Saber.Vendor.DataSource.OrderByDirection.Ascending ? " ASC" : " DESC") +
195+
(x < sort[key].Count - 1 ? ", \n" : "\n"));
196+
}
194197
}
198+
else
199+
{
200+
sql.Append("\n ORDER BY id");
201+
}
202+
var pos = positions != null && positions.ContainsKey(key) ? positions[key] :
203+
new Saber.Vendor.DataSource.PositionSettings() { Start = 1, Length = 1000 };
204+
if (pos.Start > 0)
205+
{
206+
sql.Append("\n OFFSET " + (pos.Start - 1) + " ROWS FETCH NEXT " + (parentPos.Length * pos.Length) + " ROWS ONLY");
207+
}
208+
sql.Append("\n\n\n");
209+
datasets.Add(dataset);
195210
}
196-
else
197-
{
198-
sql.Append("\n ORDER BY id");
199-
}
200-
var pos = positions != null && positions.ContainsKey(key) ? positions[key] :
201-
new Saber.Vendor.DataSource.PositionSettings() { Start = 1, Length = 1000 };
202-
if (pos.Start > 0)
203-
{
204-
sql.Append("\n OFFSET " + (pos.Start - 1) + " ROWS FETCH NEXT " + (parentPos.Length * pos.Length) + " ROWS ONLY");
205-
}
206-
sql.Append("\n\n\n");
207-
datasets.Add(dataset);
208211
}
209212
sql.Append("\nDROP TABLE " + tmpTable + "\n");
210213

@@ -250,6 +253,136 @@ FROM DataSet_" + dataset.tableName + @" d
250253
return results;
251254
}
252255

256+
public static int GetRecordCount(int datasetId, string lang = "", int userId = 0, List<Saber.Vendor.DataSource.FilterGroup> filters = null)
257+
{
258+
var datasource = Saber.Vendors.DataSets.Cache.DataSources.Where(a => a.Key == datasetId.ToString()).FirstOrDefault();
259+
if (datasource == null) { return 0; }
260+
var dataset = Saber.Vendors.DataSets.Cache.DataSets.Where(a => a.datasetId == datasetId).FirstOrDefault();
261+
if (dataset == null) { return 0; }
262+
263+
var sql = new StringBuilder(@"
264+
SELECT COUNT(*)
265+
FROM DataSet_" + dataset.tableName + @" d
266+
LEFT JOIN Users u ON u.userId=d.userId
267+
WHERE " + (userId > 0 ? "d.userId=" + userId + " AND" : "") + " d.lang='" + lang + "' \n");
268+
269+
if (filters != null && filters.Count > 0)
270+
{
271+
for (var x = 0; x < filters.Count; x++)
272+
{
273+
//generate root filter group sql
274+
var group = filters[x];
275+
sql.Append(" AND " + GetFilterGroupSql(group, datasource.Columns));
276+
}
277+
}
278+
279+
var conn = new SqlConnection(Sql.ConnectionString);
280+
var server = new Microsoft.SqlServer.Management.Smo.Server(new ServerConnection(conn));
281+
var reader = server.ConnectionContext.ExecuteReader(sql.ToString());
282+
reader.Read();
283+
return (int)reader[0];
284+
}
285+
286+
public static Dictionary<string, int> GetRecordCountInRelationships(int datasetId, string lang = "", int userId = 0, Dictionary<string, List<Saber.Vendor.DataSource.FilterGroup>> filters = null, string[] childKeys = null)
287+
{
288+
var datasource = Saber.Vendors.DataSets.Cache.DataSources.Where(a => a.Key == datasetId.ToString()).FirstOrDefault();
289+
if (datasource == null) { return null; }
290+
var dataset = Saber.Vendors.DataSets.Cache.DataSets.Where(a => a.datasetId == datasetId).FirstOrDefault();
291+
if (dataset == null) { return null; }
292+
var datasets = new List<Models.DataSet>();
293+
var rndId = (new Random()).Next(999, 999999);
294+
var tmpTable = "#datasets_records_in_relationships_" + rndId;
295+
296+
//generate query for parent data set ///////////////////////////////////////////////////////////////////
297+
var sql = new StringBuilder(@"
298+
SELECT COUNT(*)
299+
INTO " + tmpTable + @"
300+
FROM DataSet_" + dataset.tableName + @" d
301+
LEFT JOIN Users u ON u.userId=d.userId
302+
WHERE " + (userId > 0 ? "d.userId=" + userId + " AND" : "") + " d.lang='" + lang + "' \n");
303+
304+
var key = "dataset-" + datasetId.ToString();
305+
var keyId = datasetId.ToString();
306+
if (filters != null && filters.ContainsKey(key) && filters[key].Count > 0)
307+
{
308+
for (var x = 0; x < filters[key].Count; x++)
309+
{
310+
//generate root filter group sql
311+
var group = filters[key][x];
312+
sql.Append(" AND " + GetFilterGroupSql(group, datasource.Columns));
313+
}
314+
}
315+
316+
sql.Append("\n\n\n SELECT * FROM " + tmpTable);
317+
datasets.Add(dataset);
318+
319+
foreach (var child in datasource.Relationships.Where(a => a.Key == keyId))
320+
{
321+
//generate queries for child data sets ///////////////////////////////////////////////////////////////
322+
if (childKeys != null && !childKeys.Contains("dataset-" + child.Child.Key)) { continue; }
323+
var childId = int.Parse(child.Child.Key);
324+
dataset = Saber.Vendors.DataSets.Cache.DataSets.Where(a => a.datasetId == childId).FirstOrDefault();
325+
if (dataset != null)
326+
{
327+
sql.Append(@"
328+
GO
329+
330+
SELECT COUNT(*)
331+
FROM DataSet_" + dataset.tableName + @" d
332+
LEFT JOIN Users u ON u.userId=d.userId
333+
WHERE " + (userId > 0 ? "d.userId=" + userId + " AND" : "") + " d.lang='" + lang + @"'
334+
AND d." + child.ChildColumn + @" IN (SELECT id FROM " + tmpTable + ")");
335+
336+
key = "dataset-" + childId.ToString();
337+
if (filters != null && filters.ContainsKey(key) && filters[key].Count > 0)
338+
{
339+
for (var x = 0; x < filters[key].Count; x++)
340+
{
341+
//generate root filter group sql
342+
var group = filters[key][x];
343+
sql.Append(" AND " + GetFilterGroupSql(group, datasource.Columns));
344+
}
345+
}
346+
sql.Append("\n\n\n");
347+
datasets.Add(dataset);
348+
}
349+
}
350+
sql.Append("\nDROP TABLE " + tmpTable + "\n");
351+
352+
//execute query ///////////////////////////////////////////////////////////////////////////////////////////////////
353+
var results = new Dictionary<string, int>();
354+
try
355+
{
356+
var conn = new SqlConnection(Sql.ConnectionString);
357+
var server = new Microsoft.SqlServer.Management.Smo.Server(new ServerConnection(conn));
358+
var reader = server.ConnectionContext.ExecuteReader(sql.ToString());
359+
var i = 0;
360+
//read query results
361+
do
362+
{
363+
try
364+
{
365+
dataset = datasets[i];
366+
//get all rows for result
367+
reader.Read();
368+
results.Add(dataset.datasetId.ToString(), (int)reader[0]);
369+
}
370+
catch (Exception)
371+
{
372+
}
373+
374+
i++;
375+
} while (reader.NextResult());
376+
}
377+
catch (Exception)
378+
{
379+
380+
}
381+
return results;
382+
}
383+
384+
#endregion
385+
253386
private static string GetFilterGroupSql(Saber.Vendor.DataSource.FilterGroup group, Saber.Vendor.DataSource.Column[] columns)
254387
{
255388
var sql = new StringBuilder("( \n");

0 commit comments

Comments
 (0)