@@ -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 ( "\n DROP 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 ( "\n DROP 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