public override bool ShouldCacheCollection(ClassInfo classInfo, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount) { if (classInfo.Cardinality == ClassCardinality.Small || classInfo.Cardinality == ClassCardinality.Medium) return true; else return false; }
public SoodaObjectListSnapshot(IList list, SoodaWhereClause whereClause) { foreach (SoodaObject o in list) { if (whereClause.Matches(o, true)) AddObjectToSnapshot(o); } }
public SoodaObjectOneToManyCollection(SoodaTransaction tran, Type childType, SoodaObject parentObject, string childRefField, Sooda.Schema.ClassInfo classInfo, SoodaWhereClause additionalWhereClause, bool cached) : base(tran, classInfo) { this.childType = childType; this.parentObject = parentObject; this.childRefField = childRefField; this.additionalWhereClause = additionalWhereClause; this.cached = cached; }
public SoodaObjectListSnapshot(IList list, SoodaWhereClause whereClause) { foreach (SoodaObject o in list) { if (whereClause.Matches(o, true)) { AddObjectToSnapshot(o); } } }
public override bool ShouldCacheCollection(ClassInfo classInfo, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount) { if (classInfo.Cardinality == ClassCardinality.Small) { return(true); } else { return(false); } }
public SoodaObjectListSnapshot(SoodaTransaction t, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount, SoodaSnapshotOptions options, ClassInfo ci) { this.classInfo = ci; string[] involvedClasses = null; bool useCache; if ((options & SoodaSnapshotOptions.NoCache) != 0) { useCache = false; } else if ((options & SoodaSnapshotOptions.Cache) != 0) { useCache = true; } else { useCache = t.CachingPolicy.ShouldCacheCollection(ci, whereClause, orderBy, startIdx, pageCount); } if (whereClause != null && whereClause.WhereExpression != null) { if ((options & SoodaSnapshotOptions.NoWriteObjects) == 0 || useCache) { try { GetInvolvedClassesVisitor gic = new GetInvolvedClassesVisitor(classInfo); gic.GetInvolvedClasses(whereClause.WhereExpression); involvedClasses = gic.ClassNames; } catch { // logger.Warn("{0}", ex); // cannot detect involved classes (probably because of RAWQUERY) // - precommit all objects // if we get here, involvedClasses remains set to null } } } else { // no where clause involvedClasses = new string[] { ci.Name }; } if ((options & SoodaSnapshotOptions.NoWriteObjects) == 0) { t.PrecommitClasses(involvedClasses); } LoadList(t, whereClause, orderBy, startIdx, pageCount, options, involvedClasses, useCache); }
public static string GetCollectionKey(string className, SoodaWhereClause wc) { if (wc == null || wc.WhereExpression == null) { return(className + " where True"); } StringWriter sw = new StringWriter(); SoqlPrettyPrinter pp = new SoqlPrettyPrinter(sw, wc.Parameters); pp.PrintExpression(wc.WhereExpression); string canonicalWhereClause = sw.ToString(); return(className + " where " + canonicalWhereClause); }
protected override void LoadData() { SoodaDataSource ds = transaction.OpenDataSource(classInfo.GetDataSource()); TableInfo[] loadedTables; items = new Dictionary<SoodaObject, int>(); itemsArray = new List<SoodaObject>(); ISoodaObjectFactory factory = transaction.GetFactory(classInfo); SoodaWhereClause whereClause = new SoodaWhereClause(Soql.FieldEqualsParam(childRefField, 0), parentObject.GetPrimaryKeyValue()); if (additionalWhereClause != null) whereClause = whereClause.Append(additionalWhereClause); string cacheKey = null; if (cached) { // cache makes sense only on clean database if (!transaction.HasBeenPrecommitted(classInfo.GetRootClass())) { cacheKey = SoodaCache.GetCollectionKey(classInfo, whereClause); } } IEnumerable keysCollection = transaction.LoadCollectionFromCache(cacheKey, logger); if (keysCollection != null) { foreach (object o in keysCollection) { SoodaObject obj = factory.GetRef(transaction, o); // this binds to cache obj.EnsureFieldsInited(); if (tempItems != null) { CollectionChange change; if (tempItems.TryGetValue(obj, out change) && change == CollectionChange.Removed) continue; } items.Add(obj, itemsArray.Count); itemsArray.Add(obj); } } else { using (IDataReader reader = ds.LoadObjectList(transaction.Schema, classInfo, whereClause, null, 0, -1, SoodaSnapshotOptions.Default, out loadedTables)) { List<SoodaObject> readObjects = null; if (cached) readObjects = new List<SoodaObject>(); while (reader.Read()) { SoodaObject obj = SoodaObject.GetRefFromRecordHelper(transaction, factory, reader, 0, loadedTables, 0); if (readObjects != null) readObjects.Add(obj); if (tempItems != null) { CollectionChange change; if (tempItems.TryGetValue(obj, out change) && change == CollectionChange.Removed) continue; } items.Add(obj, itemsArray.Count); itemsArray.Add(obj); } if (cached) { TimeSpan expirationTimeout; bool slidingExpiration; if (transaction.CachingPolicy.GetExpirationTimeout( classInfo, whereClause, null, 0, -1, readObjects.Count, out expirationTimeout, out slidingExpiration)) { transaction.StoreCollectionInCache(cacheKey, classInfo, readObjects, null, true, expirationTimeout, slidingExpiration); } } } } if (tempItems != null) { foreach (KeyValuePair<SoodaObject, CollectionChange> entry in tempItems) { if (entry.Value == CollectionChange.Added) { SoodaObject obj = (SoodaObject) entry.Key; if (!items.ContainsKey(obj)) { items.Add(obj, itemsArray.Count); itemsArray.Add(obj); } } } } }
public SoodaObjectListSnapshot(SoodaTransaction t, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount, SoodaSnapshotOptions options, ClassInfo ci) { this.classInfo = ci; string[] involvedClasses = null; bool useCache; if ((options & SoodaSnapshotOptions.NoCache) != 0) useCache = false; else if ((options & SoodaSnapshotOptions.Cache) != 0) useCache = true; else useCache = t.CachingPolicy.ShouldCacheCollection(ci, whereClause, orderBy, startIdx, pageCount); if (whereClause != null && whereClause.WhereExpression != null) { if ((options & SoodaSnapshotOptions.NoWriteObjects) == 0 || useCache) { try { GetInvolvedClassesVisitor gic = new GetInvolvedClassesVisitor(classInfo); gic.GetInvolvedClasses(whereClause.WhereExpression); involvedClasses = gic.ClassNames; } catch { // logger.Warn("{0}", ex); // cannot detect involved classes (probably because of RAWQUERY) // - precommit all objects // if we get here, involvedClasses remains set to null } } } else { // no where clause involvedClasses = new string[] { ci.Name }; } if ((options & SoodaSnapshotOptions.NoWriteObjects) == 0) t.PrecommitClasses(involvedClasses); LoadList(t, whereClause, orderBy, startIdx, pageCount, options, involvedClasses, useCache); }
public override bool ShouldCacheCollection(ClassInfo classInfo, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount) { return false; }
public ISoodaObjectList Filter(SoodaWhereClause whereClause) { return(new SoodaObjectListSnapshot(this, whereClause)); }
private void LoadList(SoodaTransaction transaction, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount, SoodaSnapshotOptions options, string[] involvedClassNames, bool useCache) { ISoodaObjectFactory factory = transaction.GetFactory(classInfo); string cacheKey = null; if (useCache) { // cache makes sense only on clean database if (!transaction.HasBeenPrecommitted(classInfo)) { cacheKey = SoodaCache.GetCollectionKey(classInfo, whereClause); } IEnumerable keysCollection = transaction.LoadCollectionFromCache(cacheKey, logger); if (keysCollection != null) { foreach (object o in keysCollection) { SoodaObject obj = factory.GetRef(transaction, o); // this binds to cache obj.EnsureFieldsInited(); items.Add(obj); } if (orderBy != null) { items.Sort(orderBy.GetComparer()); } count = items.Count; if (startIdx > 0) { if (startIdx < count) items.RemoveRange(0, startIdx); else items.Clear(); } if (pageCount != -1 && pageCount < items.Count) { items.RemoveRange(pageCount, items.Count - pageCount); } return; } } SoodaDataSource ds = transaction.OpenDataSource(classInfo.GetDataSource()); if ((options & SoodaSnapshotOptions.KeysOnly) != 0) { if (pageCount != -1) { using (IDataReader reader = ds.LoadMatchingPrimaryKeys(transaction.Schema, classInfo, whereClause, orderBy, 0, -1)) { count = 0; while (reader.Read()) count++; } } using (IDataReader reader = ds.LoadMatchingPrimaryKeys(transaction.Schema, classInfo, whereClause, orderBy, startIdx, pageCount)) { while (reader.Read()) { SoodaObject obj = SoodaObject.GetRefFromKeyRecordHelper(transaction, factory, reader); items.Add(obj); } if (pageCount == -1) count = items.Count; } } else { if (pageCount != -1) { using (IDataReader reader = ds.LoadMatchingPrimaryKeys(transaction.Schema, classInfo, whereClause, orderBy, 0, -1)) { count = 0; while (reader.Read()) count++; } } TableInfo[] loadedTables; using (IDataReader reader = ds.LoadObjectList(transaction.Schema, classInfo, whereClause, orderBy, startIdx, pageCount, options, out loadedTables)) { while (reader.Read()) { SoodaObject obj = SoodaObject.GetRefFromRecordHelper(transaction, factory, reader, 0, loadedTables, 0); if ((options & SoodaSnapshotOptions.VerifyAfterLoad) != 0 && whereClause != null && !whereClause.Matches(obj, false)) continue; // don't add the object items.Add(obj); } if (pageCount == -1) count = items.Count; } } if (cacheKey != null && useCache && startIdx == 0 && pageCount == -1 && involvedClassNames != null) { TimeSpan expirationTimeout; bool slidingExpiration; if (transaction.CachingPolicy.GetExpirationTimeout( classInfo, whereClause, orderBy, startIdx, pageCount, items.Count, out expirationTimeout, out slidingExpiration)) { transaction.StoreCollectionInCache(cacheKey, classInfo, items, involvedClassNames, (options & SoodaSnapshotOptions.KeysOnly) == 0, expirationTimeout, slidingExpiration); } } }
public ISoodaObjectList Filter(SoodaWhereClause whereClause) { return new SoodaObjectListSnapshot(this, whereClause); }
public override IDataReader LoadObjectList(SchemaInfo schemaInfo, ClassInfo classInfo, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount, SoodaSnapshotOptions options, out TableInfo[] tables) { try { Queue<_QueueItem> queue = new Queue<_QueueItem>(); List<TableInfo> tablesArrayList = new List<TableInfo>(classInfo.UnifiedTables.Count); SoqlQueryExpression queryExpression = new SoqlQueryExpression(); queryExpression.StartIdx = startIdx; queryExpression.PageCount = pageCount; queryExpression.From.Add(classInfo.Name); queryExpression.FromAliases.Add(""); foreach (TableInfo ti in classInfo.UnifiedTables) { tablesArrayList.Add(ti); foreach (FieldInfo fi in ti.Fields) { SoqlPathExpression pathExpr = new SoqlPathExpression(fi.Name); queryExpression.SelectExpressions.Add(pathExpr); queryExpression.SelectAliases.Add(""); if (fi.ReferencedClass != null && fi.PrefetchLevel > 0 && ((options & SoodaSnapshotOptions.PrefetchRelated) != 0)) { _QueueItem item = new _QueueItem(); item.classInfo = fi.ReferencedClass; item.level = fi.PrefetchLevel; item.prefix = pathExpr; queue.Enqueue(item); } } } while (queue.Count > 0) { _QueueItem it = queue.Dequeue(); foreach (TableInfo ti in it.classInfo.UnifiedTables) { tablesArrayList.Add(ti); foreach (FieldInfo fi in ti.Fields) { // TODO - this relies on the fact that path expressions // are never reconstructed or broken. We simply share previous prefix // perhaps it's cleaner to Clone() the expression here SoqlPathExpression extendedExpression = new SoqlPathExpression(it.prefix, fi.Name); queryExpression.SelectExpressions.Add(extendedExpression); queryExpression.SelectAliases.Add(""); if (it.level >= 1 && fi.PrefetchLevel > 0 && fi.ReferencedClass != null) { _QueueItem newItem = new _QueueItem(); newItem.classInfo = fi.ReferencedClass; newItem.prefix = extendedExpression; newItem.level = it.level - 1; queue.Enqueue(newItem); } } } } if (whereClause != null && whereClause.WhereExpression != null) { queryExpression.WhereClause = whereClause.WhereExpression; } if (orderBy != null) { queryExpression.SetOrderBy(orderBy); } string query = SoqlToSql(queryExpression, schemaInfo, false); IDbCommand cmd = Connection.CreateCommand(); try { cmd.CommandTimeout = CommandTimeout; } catch (NotSupportedException e) { logger.Debug("CommandTimeout not supported. {0}", e.Message); } if (Transaction != null) cmd.Transaction = this.Transaction; SqlBuilder.BuildCommandWithParameters(cmd, false, query, whereClause.Parameters, false); tables = tablesArrayList.ToArray(); return TimedExecuteReader(cmd); } catch (Exception ex) { logger.Error("Exception in LoadObjectList: {0}", ex); throw; } }
public bool GetExpirationTimeout(ClassInfo classInfo, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount, int itemCount, out TimeSpan expirationTimeout, out bool slidingExpiration) { expirationTimeout = _expirationTimeout; slidingExpiration = _slidingExpiration; return(true); }
public override IDataReader LoadMatchingPrimaryKeys(SchemaInfo schemaInfo, ClassInfo classInfo, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount) { try { SoqlQueryExpression queryExpression = new SoqlQueryExpression(); foreach (FieldInfo fi in classInfo.GetPrimaryKeyFields()) { queryExpression.SelectExpressions.Add(new SoqlPathExpression(fi.Name)); queryExpression.SelectAliases.Add(""); } if (schemaInfo.GetSubclasses(classInfo).Count > 0) { queryExpression.SelectExpressions.Add(new SoqlPathExpression(classInfo.SubclassSelectorField.Name)); queryExpression.SelectAliases.Add(""); } queryExpression.StartIdx = startIdx; queryExpression.PageCount = pageCount; queryExpression.From.Add(classInfo.Name); queryExpression.FromAliases.Add(""); if (whereClause != null && whereClause.WhereExpression != null) { queryExpression.WhereClause = whereClause.WhereExpression; } if (orderBy != null) { queryExpression.SetOrderBy(orderBy); } string query = SoqlToSql(queryExpression, schemaInfo, false); IDbCommand cmd = Connection.CreateCommand(); try { cmd.CommandTimeout = CommandTimeout; } catch (NotSupportedException e) { logger.Debug("CommandTimeout not supported. {0}", e.Message); } if (Transaction != null) { cmd.Transaction = this.Transaction; } SqlBuilder.BuildCommandWithParameters(cmd, false, query, whereClause.Parameters, false); return(TimedExecuteReader(cmd)); } catch (Exception ex) { logger.Error("Exception in LoadMatchingPrimaryKeys: {0}", ex); throw; } }
public static string GetCollectionKey(ClassInfo classInfo, SoodaWhereClause wc) { return GetCollectionKey(classInfo.Name, wc); }
ISoodaObjectList ISoodaObjectList.Filter(SoodaWhereClause whereClause) { return(_theList.Filter(whereClause)); }
protected override void LoadData() { SoodaDataSource ds = transaction.OpenDataSource(classInfo.GetDataSource()); TableInfo[] loadedTables; items = new Dictionary <SoodaObject, int>(); itemsArray = new List <SoodaObject>(); ISoodaObjectFactory factory = transaction.GetFactory(classInfo); SoodaWhereClause whereClause = new SoodaWhereClause(Soql.FieldEqualsParam(childRefField, 0), parentObject.GetPrimaryKeyValue()); if (additionalWhereClause != null) { whereClause = whereClause.Append(additionalWhereClause); } string cacheKey = null; if (cached) { // cache makes sense only on clean database if (!transaction.HasBeenPrecommitted(classInfo.GetRootClass())) { cacheKey = SoodaCache.GetCollectionKey(classInfo, whereClause); } } IEnumerable keysCollection = transaction.LoadCollectionFromCache(cacheKey, logger); if (keysCollection != null) { foreach (object o in keysCollection) { SoodaObject obj = factory.GetRef(transaction, o); // this binds to cache obj.EnsureFieldsInited(); if (tempItems != null) { CollectionChange change; if (tempItems.TryGetValue(obj, out change) && change == CollectionChange.Removed) { continue; } } items.Add(obj, itemsArray.Count); itemsArray.Add(obj); } } else { using (IDataReader reader = ds.LoadObjectList(transaction.Schema, classInfo, whereClause, null, 0, -1, SoodaSnapshotOptions.Default, out loadedTables)) { List <SoodaObject> readObjects = null; if (cached) { readObjects = new List <SoodaObject>(); } while (reader.Read()) { SoodaObject obj = SoodaObject.GetRefFromRecordHelper(transaction, factory, reader, 0, loadedTables, 0); if (readObjects != null) { readObjects.Add(obj); } if (tempItems != null) { CollectionChange change; if (tempItems.TryGetValue(obj, out change) && change == CollectionChange.Removed) { continue; } } items.Add(obj, itemsArray.Count); itemsArray.Add(obj); } if (cached) { TimeSpan expirationTimeout; bool slidingExpiration; if (transaction.CachingPolicy.GetExpirationTimeout( classInfo, whereClause, null, 0, -1, readObjects.Count, out expirationTimeout, out slidingExpiration)) { transaction.StoreCollectionInCache(cacheKey, classInfo, readObjects, null, true, expirationTimeout, slidingExpiration); } } } } if (tempItems != null) { foreach (KeyValuePair <SoodaObject, CollectionChange> entry in tempItems) { if (entry.Value == CollectionChange.Added) { SoodaObject obj = (SoodaObject)entry.Key; if (!items.ContainsKey(obj)) { items.Add(obj, itemsArray.Count); itemsArray.Add(obj); } } } } }
public static string GetCollectionKey(ClassInfo classInfo, SoodaWhereClause wc) { return(GetCollectionKey(classInfo.Name, wc)); }
protected ISoodaObjectList Filter2(SoodaWhereClause whereClause) { return(_theList.Filter(whereClause)); }
public static string GetCollectionKey(string className, SoodaWhereClause wc) { if (wc == null || wc.WhereExpression == null) return className + " where True"; StringWriter sw = new StringWriter(); SoqlPrettyPrinter pp = new SoqlPrettyPrinter(sw, wc.Parameters); pp.PrintExpression(wc.WhereExpression); string canonicalWhereClause = sw.ToString(); return className + " where " + canonicalWhereClause; }
public bool GetExpirationTimeout(ClassInfo classInfo, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount, int itemCount, out TimeSpan expirationTimeout, out bool slidingExpiration) { expirationTimeout = _expirationTimeout; slidingExpiration = _slidingExpiration; return true; }
public override bool ShouldCacheCollection(ClassInfo classInfo, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount) { return(true); }
public abstract bool ShouldCacheCollection(ClassInfo classInfo, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount);
public override IDataReader LoadObjectList(SchemaInfo schemaInfo, ClassInfo classInfo, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount, SoodaSnapshotOptions options, out TableInfo[] tables) { try { Queue <_QueueItem> queue = new Queue <_QueueItem>(); List <TableInfo> tablesArrayList = new List <TableInfo>(classInfo.UnifiedTables.Count); SoqlQueryExpression queryExpression = new SoqlQueryExpression(); queryExpression.StartIdx = startIdx; queryExpression.PageCount = pageCount; queryExpression.From.Add(classInfo.Name); queryExpression.FromAliases.Add(""); foreach (TableInfo ti in classInfo.UnifiedTables) { tablesArrayList.Add(ti); foreach (FieldInfo fi in ti.Fields) { SoqlPathExpression pathExpr = new SoqlPathExpression(fi.Name); queryExpression.SelectExpressions.Add(pathExpr); queryExpression.SelectAliases.Add(""); if (fi.ReferencedClass != null && fi.PrefetchLevel > 0 && ((options & SoodaSnapshotOptions.PrefetchRelated) != 0)) { _QueueItem item = new _QueueItem(); item.classInfo = fi.ReferencedClass; item.level = fi.PrefetchLevel; item.prefix = pathExpr; queue.Enqueue(item); } } } while (queue.Count > 0) { _QueueItem it = queue.Dequeue(); foreach (TableInfo ti in it.classInfo.UnifiedTables) { tablesArrayList.Add(ti); foreach (FieldInfo fi in ti.Fields) { // TODO - this relies on the fact that path expressions // are never reconstructed or broken. We simply share previous prefix // perhaps it's cleaner to Clone() the expression here SoqlPathExpression extendedExpression = new SoqlPathExpression(it.prefix, fi.Name); queryExpression.SelectExpressions.Add(extendedExpression); queryExpression.SelectAliases.Add(""); if (it.level >= 1 && fi.PrefetchLevel > 0 && fi.ReferencedClass != null) { _QueueItem newItem = new _QueueItem(); newItem.classInfo = fi.ReferencedClass; newItem.prefix = extendedExpression; newItem.level = it.level - 1; queue.Enqueue(newItem); } } } } if (whereClause != null && whereClause.WhereExpression != null) { queryExpression.WhereClause = whereClause.WhereExpression; } if (orderBy != null) { queryExpression.SetOrderBy(orderBy); } string query = SoqlToSql(queryExpression, schemaInfo, false); IDbCommand cmd = Connection.CreateCommand(); try { cmd.CommandTimeout = CommandTimeout; } catch (NotSupportedException e) { logger.Debug("CommandTimeout not supported. {0}", e.Message); } if (Transaction != null) { cmd.Transaction = this.Transaction; } SqlBuilder.BuildCommandWithParameters(cmd, false, query, whereClause.Parameters, false); tables = tablesArrayList.ToArray(); return(TimedExecuteReader(cmd)); } catch (Exception ex) { logger.Error("Exception in LoadObjectList: {0}", ex); throw; } }
private void LoadList(SoodaTransaction transaction, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount, SoodaSnapshotOptions options, string[] involvedClassNames, bool useCache) { ISoodaObjectFactory factory = transaction.GetFactory(classInfo); string cacheKey = null; if (useCache) { // cache makes sense only on clean database if (!transaction.HasBeenPrecommitted(classInfo)) { cacheKey = SoodaCache.GetCollectionKey(classInfo, whereClause); } IEnumerable keysCollection = transaction.LoadCollectionFromCache(cacheKey, logger); if (keysCollection != null) { foreach (object o in keysCollection) { SoodaObject obj = factory.GetRef(transaction, o); // this binds to cache obj.EnsureFieldsInited(); items.Add(obj); } if (orderBy != null) { items.Sort(orderBy.GetComparer()); } count = items.Count; if (startIdx > 0) { if (startIdx < count) { items.RemoveRange(0, startIdx); } else { items.Clear(); } } if (pageCount != -1 && pageCount < items.Count) { items.RemoveRange(pageCount, items.Count - pageCount); } return; } } SoodaDataSource ds = transaction.OpenDataSource(classInfo.GetDataSource()); if ((options & SoodaSnapshotOptions.KeysOnly) != 0) { if (pageCount != -1) { using (IDataReader reader = ds.LoadMatchingPrimaryKeys(transaction.Schema, classInfo, whereClause, orderBy, 0, -1)) { count = 0; while (reader.Read()) { count++; } } } using (IDataReader reader = ds.LoadMatchingPrimaryKeys(transaction.Schema, classInfo, whereClause, orderBy, startIdx, pageCount)) { while (reader.Read()) { SoodaObject obj = SoodaObject.GetRefFromKeyRecordHelper(transaction, factory, reader); items.Add(obj); } if (pageCount == -1) { count = items.Count; } } } else { if (pageCount != -1) { using (IDataReader reader = ds.LoadMatchingPrimaryKeys(transaction.Schema, classInfo, whereClause, orderBy, 0, -1)) { count = 0; while (reader.Read()) { count++; } } } TableInfo[] loadedTables; using (IDataReader reader = ds.LoadObjectList(transaction.Schema, classInfo, whereClause, orderBy, startIdx, pageCount, options, out loadedTables)) { while (reader.Read()) { SoodaObject obj = SoodaObject.GetRefFromRecordHelper(transaction, factory, reader, 0, loadedTables, 0); if ((options & SoodaSnapshotOptions.VerifyAfterLoad) != 0 && whereClause != null && !whereClause.Matches(obj, false)) { continue; // don't add the object } items.Add(obj); } if (pageCount == -1) { count = items.Count; } } } if (cacheKey != null && useCache && startIdx == 0 && pageCount == -1 && involvedClassNames != null) { TimeSpan expirationTimeout; bool slidingExpiration; if (transaction.CachingPolicy.GetExpirationTimeout( classInfo, whereClause, orderBy, startIdx, pageCount, items.Count, out expirationTimeout, out slidingExpiration)) { transaction.StoreCollectionInCache(cacheKey, classInfo, items, involvedClassNames, (options & SoodaSnapshotOptions.KeysOnly) == 0, expirationTimeout, slidingExpiration); } } }
public override IDataReader LoadMatchingPrimaryKeys(SchemaInfo schemaInfo, ClassInfo classInfo, SoodaWhereClause whereClause, SoodaOrderBy orderBy, int startIdx, int pageCount) { try { SoqlQueryExpression queryExpression = new SoqlQueryExpression(); foreach (FieldInfo fi in classInfo.GetPrimaryKeyFields()) { queryExpression.SelectExpressions.Add(new SoqlPathExpression(fi.Name)); queryExpression.SelectAliases.Add(""); } if (schemaInfo.GetSubclasses(classInfo).Count > 0) { queryExpression.SelectExpressions.Add(new SoqlPathExpression(classInfo.SubclassSelectorField.Name)); queryExpression.SelectAliases.Add(""); } queryExpression.StartIdx = startIdx; queryExpression.PageCount = pageCount; queryExpression.From.Add(classInfo.Name); queryExpression.FromAliases.Add(""); if (whereClause != null && whereClause.WhereExpression != null) { queryExpression.WhereClause = whereClause.WhereExpression; } if (orderBy != null) { queryExpression.SetOrderBy(orderBy); } string query = SoqlToSql(queryExpression, schemaInfo, false); IDbCommand cmd = Connection.CreateCommand(); try { cmd.CommandTimeout = CommandTimeout; } catch (NotSupportedException e) { logger.Debug("CommandTimeout not supported. {0}", e.Message); } if (Transaction != null) cmd.Transaction = this.Transaction; SqlBuilder.BuildCommandWithParameters(cmd, false, query, whereClause.Parameters, false); return TimedExecuteReader(cmd); } catch (Exception ex) { logger.Error("Exception in LoadMatchingPrimaryKeys: {0}", ex); throw; } }