Immediate Queries

This is the default query mode: the whole query result is evaluated upon query execution and object IDs list is produced as a result.

QueryModesExample.cs: TestImmediateQueries
01private static void TestImmediateQueries() 02 { 03 Console.WriteLine("Testing query performance on 10000 pilot objects in Immediate mode"); 04 FillUpDB(10000); 05 IConfiguration configuration = Db4oFactory.NewConfiguration(); 06 configuration.Queries().EvaluationMode(QueryEvaluationMode.IMMEDIATE); 07 IObjectContainer db = Db4oFactory.OpenFile(configuration, Db4oFileName); 08 try 09 { 10 IQuery query = db.Query(); 11 query.Constrain(typeof(Pilot)); 12 query.Descend("_points").Constrain(99).Greater(); 13 DateTime dt1 = DateTime.UtcNow; 14 query.Execute(); 15 DateTime dt2 = DateTime.UtcNow; 16 TimeSpan diff = dt2 - dt1; 17 Console.WriteLine("Query execution time=" + diff.TotalMilliseconds + " ms"); 18 } 19 finally 20 { 21 db.Close(); 22 } 23 }
QueryModesExample.vb: TestImmediateQueries
01Private Shared Sub TestImmediateQueries() 02 Console.WriteLine("Testing query performance on 10000 pilot objects in Immediate mode") 03 FillUpDB(10000) 04 Dim configuration As IConfiguration = Db4oFactory.NewConfiguration() 05 configuration.Queries.EvaluationMode(QueryEvaluationMode.IMMEDIATE) 06 Dim db As IObjectContainer = Db4oFactory.OpenFile(configuration, Db4oFileName) 07 Try 08 Dim query As IQuery = db.Query 09 query.Constrain(GetType(Pilot)) 10 query.Descend("_points").Constrain(99).Greater() 11 Dim dt1 As DateTime = DateTime.UtcNow 12 query.Execute() 13 Dim dt2 As DateTime = DateTime.UtcNow 14 Dim diff As TimeSpan = dt2 - dt1 15 Console.WriteLine("Query execution time=" + diff.TotalMilliseconds.ToString() + " ms") 16 Finally 17 db.Close() 18 End Try 19 End Sub

Obviously object evaluation takes some time and in a case of big resultsets you will have to wait for a long time before the first result will be returned. This is especially unpleasant in a client-server setup, when query processing can block the server for seconds or even minutes.

This mode makes the whole objects result set available at once - ID list is built based on the committed state in the database. As soon as a result is delivered it won't be changed neither by changes in current transaction neither by committed changes from another transactions.

Note, that resultset contains only references to objects, you were querying for, which means that if an object field has changed by the time of the actual object retrieval from the object set - you will get the new field value:

QueryModesExample.cs: TestImmediateChanged
01private static void TestImmediateChanged() 02 { 03 Console.WriteLine("Testing immediate mode with field changes"); 04 FillUpDB(10); 05 IConfiguration configuration = Db4oFactory.NewConfiguration(); 06 configuration.Queries().EvaluationMode(QueryEvaluationMode.IMMEDIATE); 07 IObjectContainer db = Db4oFactory.OpenFile(configuration, Db4oFileName); 08 try 09 { 10 IQuery query1 = db.Query(); 11 query1.Constrain(typeof(Pilot)); 12 query1.Descend("_points").Constrain(5).Smaller(); 13 IObjectSet result1 = query1.Execute(); 14 15 // change field 16 IQuery query2 = db.Query(); 17 query2.Constrain(typeof(Pilot)); 18 query2.Descend("_points").Constrain(2); 19 IObjectSet result2 = query2.Execute(); 20 Pilot pilot2 = (Pilot)result2[0]; 21 pilot2.AddPoints(22); 22 db.Set(pilot2); 23 ListResult(result1); 24 } 25 finally 26 { 27 db.Close(); 28 } 29 }
QueryModesExample.vb: TestImmediateChanged
01Private Shared Sub TestImmediateChanged() 02 Console.WriteLine("Testing immediate mode with field changes") 03 FillUpDB(10) 04 Dim configuration As IConfiguration = Db4oFactory.NewConfiguration() 05 configuration.Queries.EvaluationMode(QueryEvaluationMode.IMMEDIATE) 06 Dim db As IObjectContainer = Db4oFactory.OpenFile(configuration, Db4oFileName) 07 Try 08 Dim query1 As IQuery = db.Query 09 query1.Constrain(GetType(Pilot)) 10 query1.Descend("_points").Constrain(5).Smaller() 11 Dim result1 As IObjectSet = query1.Execute 12 Dim query2 As IQuery = db.Query 13 query2.Constrain(GetType(Pilot)) 14 query2.Descend("_points").Constrain(2) 15 Dim result2 As IObjectSet = query2.Execute 16 Dim pilot2 As Pilot = CType(result2(0), Pilot) 17 pilot2.AddPoints(22) 18 db.Set(pilot2) 19 ListResult(result1) 20 Finally 21 db.Close() 22 End Try 23 End Sub

Immediate Mode Pros And Cons

Pros:

Cons: