public void License() { using (SessionNoServer session = new SessionNoServer(systemDir)) { Database database; session.BeginUpdate(); for (uint i = 60000000; i < 60000010; i++) { database = session.NewDatabase(i); Assert.NotNull(database); } session.Commit(); session.BeginUpdate(); for (uint i = 60000000; i < 60000010; i++) { database = session.OpenDatabase(i); Assert.NotNull(database); } session.Commit(); session.BeginUpdate(); for (uint i = 60000000; i < 60000010; i++) { database = session.OpenDatabase(i); session.DeleteDatabase(database); } session.Commit(); } }
public void CreateLocationSameHost() { using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); DatabaseLocation remoteLocation = new DatabaseLocation(Dns.GetHostName(), location2Dir, locationStartDbNum, locationEndDbNum, session, PageInfo.compressionKind.LZ4, 0); remoteLocation = session.NewLocation(remoteLocation); Database database = session.NewDatabase(remoteLocation.StartDatabaseNumber); Assert.NotNull(database); session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); Database database = session.OpenDatabase(locationStartDbNum, false); Assert.NotNull(database); session.DeleteDatabase(database); session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); foreach (DatabaseLocation loc in session.DatabaseLocations) Console.WriteLine(loc.ToStringDetails(session, false)); session.DeleteLocation(session.DatabaseLocations.LocationForDb(locationStartDbNum)); foreach (DatabaseLocation loc in session.DatabaseLocations) Console.WriteLine(loc.ToStringDetails(session, false)); session.Commit(); } }
public void FixedSizeManyTest(int howMany) { using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); FixedSize fixedSize; FixedSize fixedSizePrior = new FixedSize(); for (int i = 0; i < howMany; i++) { fixedSize = new FixedSize(); fixedSize.Persist(session, fixedSizePrior); fixedSizePrior = fixedSize; } session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginRead(); Database db = session.OpenDatabase(FixedSize.PlaceInDatabase); foreach (Page page in db) { if (page.PageNumber > 0) { foreach (FixedSize fixedSize in page) { --howMany; Assert.NotNull(fixedSize); } } } session.Commit(); } }
public void UnpersistCompareFields(int bTreeDatabaseNumber) { using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); BTreeSet <Person> bTree = (BTreeSet <Person>)session.Open(Oid.Encode((uint)bTreeDatabaseNumber, 1, 1)); BTreeSetIterator <Person> itr = bTree.Iterator(); itr.GoToLast(); itr.Remove(); session.Abort(); session.BeginUpdate(); bTree = (BTreeSet <Person>)session.Open(Oid.Encode((uint)bTreeDatabaseNumber, 1, 1)); bTree.Unpersist(session); session.Commit(); session.BeginRead(); Database db = session.OpenDatabase((uint)bTreeDatabaseNumber, false); foreach (Page page in db) { foreach (OptimizedPersistable obj in page) { if (obj.PageNumber > 0) { Assert.Fail("No objects should remain in this database"); } } } session.Commit(); } }
public void aCreateDatabases() { Database database; using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); for (uint i = 50000000; i < 50001000; i++) { database = session.NewDatabase(i); Assert.NotNull(database); } session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); for (uint i = 50000000; i < 50001000; i++) { database = session.OpenDatabase(i); Assert.NotNull(database); } session.Commit(); } }
public void CreateLocationSameHost() { using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); DatabaseLocation remoteLocation = new DatabaseLocation(Dns.GetHostName(), location2Dir, locationStartDbNum, locationEndDbNum, session, PageInfo.compressionKind.LZ4, 0); remoteLocation = session.NewLocation(remoteLocation); Database database = session.NewDatabase(remoteLocation.StartDatabaseNumber); Assert.NotNull(database); session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); Database database = session.OpenDatabase(locationStartDbNum, false); Assert.NotNull(database); session.DeleteDatabase(database); session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); foreach (DatabaseLocation loc in session.DatabaseLocations) { Console.WriteLine(loc.ToStringDetails(session, false)); } session.DeleteLocation(session.DatabaseLocations.LocationForDb(locationStartDbNum)); foreach (DatabaseLocation loc in session.DatabaseLocations) { Console.WriteLine(loc.ToStringDetails(session, false)); } session.Commit(); } }
public void aaaE_Chris() { var person = new PersonChris() { Name = "John", Address = "123 Blah St" }; using (var session1 = new SessionNoServer(s_systemDir)) { // Persist instance of Person within transaction session1.BeginUpdate(); session1.Persist(person); session1.Commit(); // Create new transaction and make changes to Person and add child object Job session1.BeginUpdate(); person.Name = "Bob"; person.Jobs.Add(new Job { Name = "clean house" }); // Do not commit previous transaction (keep open) and attempt to read person using another session and a read transaction using (var session2 = new SessionNoServer(s_systemDir)) { session2.BeginRead(); uint dbNum = session2.DatabaseNumberOf(typeof(PersonChris)); Database db = session2.OpenDatabase(dbNum); var person1 = db.AllObjects <PersonChris>().First(); // IOException is thrown here session2.Commit(); } } }
public void MultipleThreadsAdding() { bool doClearAll = SessionBase.ClearAllCachedObjectsWhenDetectingUpdatedDatabase; SessionBase.ClearAllCachedObjectsWhenDetectingUpdatedDatabase = false; try { using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); session.RegisterClass(typeof(AutoPlacement)); // build in type but not yet registered as a one session.RegisterClass(typeof(ObservableList <int>)); session.RegisterClass(typeof(Dokument)); UInt32 dbNum = session.DatabaseNumberOf(typeof(Dokument)); Database db = session.OpenDatabase(dbNum, false, false); if (db == null) { db = session.NewDatabase(dbNum, 0, typeof(Dokument).ToGenericTypeString()); } Dokument doc = new Dokument(); session.Persist(doc); session.Commit(); } using (ServerClientSessionShared sharedReadSession = new ServerClientSessionShared(systemDir)) { sharedReadSession.BeginRead(); Parallel.ForEach(Enumerable.Range(1, 3), (num) => LockConflict(sharedReadSession)); } } finally { SessionBase.ClearAllCachedObjectsWhenDetectingUpdatedDatabase = doClearAll; } }
public void bSyncDeletedDatabases() { using (SessionBase session = new SessionNoServer(s_sync1)) { using (var trans = session.BeginUpdate()) { for (uint i = 10; i < 14; i++) { var database = session.OpenDatabase(i); session.DeleteDatabase(database); } session.Commit(); } } using (SessionBase readFromSession = new SessionNoServer(s_sync1)) { using (SessionBase updateSession = new SessionNoServer(s_sync2)) { updateSession.SyncWith(readFromSession); } } using (SessionBase readFromSession = new SessionNoServer(s_sync1)) { readFromSession.BeginRead(); using (SessionBase updateSession = new SessionNoServer(s_sync2)) { using (var trans = updateSession.BeginRead()) { Assert.AreEqual(updateSession.OpenAllDatabases().Count, readFromSession.OpenAllDatabases().Count - 1); // - 1 due to additional change tracking databases in original } } } }
public void QuerySomeBicycles() { try { using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.BeginRead(); Database db = session.OpenDatabase(session.DatabaseNumberOf(typeof(Bicycle))); Bicycle b1 = db.AllObjects <Bicycle>().ElementAt(50005); Bicycle b2 = db.AllObjects <Bicycle>().ElementAt <Bicycle>(50005); if (b1 != b2) { throw new UnexpectedException("b1 != b2"); } var src = from Bicycle bike in db.AllObjects <Bicycle>() where bike.Color == "blue" select bike; foreach (Bicycle bike in src) { Console.WriteLine(bike.ToStringDetails(session)); } session.Commit(); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
public void AutoPlacementDbRollover(int howMany) { using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); FourPerPage f; for (UInt64 i = 0; i < 1000000; i++) { f = new FourPerPage(i); session.Persist(f); } session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginRead(); UInt32 dbNum = session.DatabaseNumberOf(typeof(FourPerPage)); Database db = session.OpenDatabase(dbNum); int ct = 0; foreach (FourPerPage f in db.AllObjects <FourPerPage>()) { ct++; } Assert.AreEqual(ct, howMany); session.Commit(); } }
// GET api/database/suppliertracking/15 public string Get(string path, UInt32 id) { using (SessionNoServer session = new SessionNoServer(path)) { session.BeginRead(); Database db = session.OpenDatabase(id); string dbName = db.ToString(); session.Commit(); return(dbName); } }
// GET api/database/suppliertracking/15 public string Get(string path, UInt32 id) { using (SessionNoServer session = new SessionNoServer(path)) { session.BeginRead(); Database db = session.OpenDatabase(id); string dbName = db.ToString(); session.Commit(); return dbName; } }
public void Rajan() { using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); session.Persist("A"); session.Persist("B"); session.Persist("C"); Placement place = new Placement(900, 1, 1); session.Persist("D", place); session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginRead(); Database db = session.OpenDatabase(session.DatabaseNumberOf(typeof(string))); var strings = from string str in db.AllObjects <string>() where str.Length > 0 select str; foreach (var item in strings) { Console.WriteLine(item); } db = session.OpenDatabase(900); strings = from string str in db.AllObjects <string>() where str.Length > 0 select str; foreach (var item in strings) { Console.WriteLine(item); } session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); BTreeMap <string, VelocityDbList <int> > map = new BTreeMap <string, VelocityDbList <int> >(null, session); session.Persist(map); session.Commit(); } }
public void cDeleteDatabases() { Database database; using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); for (uint i = 50000000; i < 50001000; i++) { database = session.OpenDatabase(i); session.DeleteDatabase(database); } session.Commit(); } }
/// <summary> /// Get the names of all persitent types used. /// </summary> /// <param name="path">Path to database directory on server relativer to server setting <see cref="SessionBase.BaseDatabasePath"/></param> /// <returns>All type names registered in the database schema</returns> public IEnumerable<string> Get(string path) { using (SessionNoServer session = new SessionNoServer(path)) { session.BeginRead(); Database db = session.OpenDatabase(1); var e = db.AllObjects<VelocityDbType>(false); var types = session.ExportToJson<VelocityDbType>(false, false); List<string> stringList = new List<String>(); foreach (VelocityDbType t in e) yield return t.Type.ToGenericTypeString(); session.Commit(); } }
/// <summary> /// Get the names of all persitent types used. /// </summary> /// <param name="path">Path to database directory on server relativer to server setting <see cref="SessionBase.BaseDatabasePath"/></param> /// <returns>All type names registered in the database schema</returns> public IEnumerable <string> Get(string path) { using (SessionNoServer session = new SessionNoServer(path)) { session.BeginRead(); Database db = session.OpenDatabase(1); var e = db.AllObjects <VelocityDbType>(false); var types = session.ExportToJson <VelocityDbType>(false, false); List <string> stringList = new List <String>(); foreach (VelocityDbType t in e) { yield return(t.Type.ToGenericTypeString()); } session.Commit(); } }
static readonly string s_systemDir = "UpdateClass"; // appended to SessionBase.BaseDatabasePath static int Main(string[] args) { try { Trace.Listeners.Add(new ConsoleTraceListener()); VelocityDbSchema.Samples.UpdateClass.UpdatedClass updatedClassObject; int ct1 = 0; using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.SetTraceDbActivity(Schema.SchemaDB); session.BeginUpdate(); session.UpdateClass(typeof(VelocityDbSchema.Samples.UpdateClass.UpdatedClass)); // call this when you have updated the class since first storing instances of this type or since last call to UpdateClass UInt32 dbNum = session.DatabaseNumberOf(typeof(VelocityDbSchema.Samples.UpdateClass.UpdatedClass)); foreach (var obj in session.AllObjects <VelocityDbSchema.Samples.UpdateClass.UpdatedClass>()) { Console.Write(obj.ToString() + " has members: "); foreach (DataMember member in obj.GetDataMembers()) { Console.Write(member.ToString() + " "); } Console.WriteLine(); obj.UpdateTypeVersion(); // comment out if you DO NOT want to migrate this object to the latest version of the class ct1++; } int ct2 = 0; Database db = session.OpenDatabase(dbNum, true, false); if (db != null) { foreach (var obj in db.AllObjects <VelocityDbSchema.Samples.UpdateClass.UpdatedClass>()) { ct2++; } } Debug.Assert(ct1 == ct2); updatedClassObject = new VelocityDbSchema.Samples.UpdateClass.UpdatedClass(); session.Persist(updatedClassObject); session.Commit(); MoveToDifferentFullClassName(); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); return(1); } return(0); }
static readonly string s_systemDir = "UpdateClass"; // appended to SessionBase.BaseDatabasePath static int Main(string[] args) { try { UpdatedClass updatedClassObject; int ct1 = 0; using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.BeginUpdate(); session.UpdateClass(typeof(UpdatedClass)); // call this when you have updated the class since first storing instances of this type or since last call to UpdateClass UInt32 dbNum = session.DatabaseNumberOf(typeof(UpdatedClass)); foreach (UpdatedClass obj in session.AllObjects<UpdatedClass>()) { Console.Write(obj.ToString() + " has members: "); foreach (DataMember member in obj.GetDataMembers()) { Console.Write(member.ToString() + " "); } Console.WriteLine(); obj.UpdateTypeVersion(); // comment out if you DO NOT want to migrate this object to the latest version of the class ct1++; } int ct2 = 0; Database db = session.OpenDatabase(dbNum, true, false); if (db != null) foreach (UpdatedClass obj in db.AllObjects<UpdatedClass>()) ct2++; Debug.Assert(ct1 == ct2); updatedClassObject = new UpdatedClass(); session.Persist(updatedClassObject); session.Commit(); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); return 1; } return 0; }
public void QuerySomeBicycles() { try { using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.BeginRead(); Database db = session.OpenDatabase(session.DatabaseNumberOf(typeof(Bicycle))); Bicycle b1 = db.AllObjects<Bicycle>().ElementAt(50005); Bicycle b2 = db.AllObjects<Bicycle>().ElementAt<Bicycle>(50005); if (b1 != b2) throw new UnexpectedException("b1 != b2"); var src = from Bicycle bike in db.AllObjects<Bicycle>() where bike.Color == "blue" select bike; foreach (Bicycle bike in src) Console.WriteLine(bike.ToStringDetails(session)); session.Commit(); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
public void StringInternTest(int howMany) { UInt64 myId = 0; using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); StringInternArrayOfStrings doIntern = new StringInternArrayOfStrings(howMany); myId = session.Persist(doIntern); session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginRead(); UInt32 dbNum = session.DatabaseNumberOf(typeof(StringInternArrayOfStrings)); Database db = session.OpenDatabase(dbNum); long beforeRead = GC.GetTotalMemory(true); StringInternArrayOfStrings myIntern = (StringInternArrayOfStrings)session.Open(myId); long afterRead = GC.GetTotalMemory(true); System.Console.WriteLine("Memory before reading large string array object: " + beforeRead + " After read: " + afterRead + " " + myIntern.ToString()); session.Commit(); } }
static void importEntireWikipedia() { const ushort btreeNodeSize = 10000; Console.WriteLine(DateTime.Now.ToString() + ", start importing Wikipedia text"); //System.Xml.Schema.XmlSchema docSchema; //using (System.Xml.XmlTextReader schemaReader = new System.Xml.XmlTextReader("c:\\export-0_5.xsd")) //{ // docSchema = System.Xml.Schema.XmlSchema.Read(schemaReader, ValidationCallBack); // } int docCount = 0; using (SessionNoServer session = new SessionNoServer(s_systemDir, 5000, false, false, CacheEnum.No)) // turn of page and object caching { Console.WriteLine("Running with databases in directory: " + session.SystemDirectory); //GCSettings.LatencyMode = GCLatencyMode.Batch;// try to keep the WeakIOptimizedPersistableReference objects around longer Placement documentPlacement = new Placement(Document.PlaceInDatabase, 1003, 1, 500, 1000, false, false, 1000, false); Placement contentPlacement = new Placement(Document.PlaceInDatabase, 1, 1, 500, UInt16.MaxValue, false, false, 1, false); XmlComment xmlComment; XmlElement xmlElement; XmlEntity xmlEntity; XmlText xmlText; XmlWhitespace xmlWhitespace; session.BeginUpdate(); File.Copy(s_licenseDbFile, System.IO.Path.Combine(session.SystemDirectory, "4.odb"), true); // register all database schema classes used by the application in advance to avoid lock conflict later in parallell indexing session.RegisterClass(typeof(Repository)); session.RegisterClass(typeof(IndexRoot)); session.RegisterClass(typeof(Document)); session.RegisterClass(typeof(Lexicon)); session.RegisterClass(typeof(DocumentText)); session.RegisterClass(typeof(Word)); session.RegisterClass(typeof(WordGlobal)); session.RegisterClass(typeof(WordHit)); session.RegisterClass(typeof(BTreeSet<Document>)); session.RegisterClass(typeof(OidShort)); session.RegisterClass(typeof(BTreeMap<Word, WordHit>)); session.RegisterClass(typeof(HashCodeComparer<Word>)); session.RegisterClass(typeof(BTreeSetOidShort<Word>)); session.RegisterClass(typeof(BTreeMapOidShort<Word, WordHit>)); Database db = session.OpenDatabase(IndexRoot.PlaceInDatabase, false, false); if (db != null) { outputSomeInfo(session); session.Abort(); return; } session.NewDatabase(IndexRoot.PlaceInDatabase, 0, "IndexRoot"); session.NewDatabase(Lexicon.PlaceInDatabase, 0, "Lexicon"); session.NewDatabase(Repository.PlaceInDatabase, 0, "Repository"); for (UInt32 i = 40; i <= 186; i++) { session.NewDatabase(i, 512, "Document"); // pre allocate 146 Document databases presized to 512MB each } //session.SetTraceDbActivity(Lexicon.PlaceInDatabase); //session.SetTraceAllDbActivity(); XmlDocument xmlDocument = new XmlDocument("enwiki-latest-pages-articles.xml"); IndexRoot indexRoot = new IndexRoot(btreeNodeSize, session); indexRoot.Persist(session, indexRoot, true); Document doc = null; bool titleElement = false; bool pageText = false; UInt32 currentDocumentDatabaseNum = documentPlacement.StartDatabaseNumber; using (FileStream fs = new FileStream(s_wikipediaXmlFile, FileMode.Open)) { //using (GZipStream zipStream = new GZipStream(fs, CompressionMode.Decompress)) // if input was a .gz file { using (System.Xml.XmlTextReader textReader = new System.Xml.XmlTextReader(fs)) { while (textReader.Read()) { System.Xml.XmlNodeType nodeType = textReader.NodeType; switch (nodeType) { case System.Xml.XmlNodeType.Attribute: break; case System.Xml.XmlNodeType.CDATA: break; case System.Xml.XmlNodeType.Comment: xmlComment = new XmlComment(textReader.Value, xmlDocument); break; case System.Xml.XmlNodeType.Document: break; case System.Xml.XmlNodeType.DocumentFragment: break; case System.Xml.XmlNodeType.DocumentType: break; case System.Xml.XmlNodeType.Element: xmlElement = new XmlElement(textReader.Prefix, textReader.LocalName, textReader.NamespaceURI, xmlDocument); if (textReader.LocalName == "title") titleElement = true; else if (textReader.LocalName == "text") pageText = true; break; case System.Xml.XmlNodeType.EndElement: if (textReader.LocalName == "title" && doc != null) titleElement = false; else if (textReader.LocalName == "text" && doc != null) pageText = false; break; case System.Xml.XmlNodeType.EndEntity: break; case System.Xml.XmlNodeType.Entity: xmlEntity = new XmlEntity(textReader.LocalName, xmlDocument); break; case System.Xml.XmlNodeType.EntityReference: break; case System.Xml.XmlNodeType.None: break; case System.Xml.XmlNodeType.Notation: break; case System.Xml.XmlNodeType.ProcessingInstruction: break; case System.Xml.XmlNodeType.SignificantWhitespace: break; case System.Xml.XmlNodeType.Text: xmlText = new XmlText(textReader.Value, xmlDocument); if (titleElement) { doc = new Document(textReader.Value, indexRoot, session); doc.Persist(documentPlacement, session, true); if (doc.DatabaseNumber != currentDocumentDatabaseNum) { session.FlushUpdates(session.OpenDatabase(currentDocumentDatabaseNum)); Console.WriteLine("Database: " + currentDocumentDatabaseNum +" is completed, done importing article " + docCount + " number of lines: " + textReader.LineNumber); currentDocumentDatabaseNum = doc.DatabaseNumber; } //doc.Page.Database.Name = doc.Name; } else if (doc != null && pageText) { #if DEBUGx Console.WriteLine(doc.Name + " line: " + textReader.LineNumber); #endif //if (textReader.LineNumber > 1000000) //{ // session.Commit(); // return; //} DocumentText content = new DocumentText(textReader.Value, doc); if (doc.DatabaseNumber != contentPlacement.TryDatabaseNumber) contentPlacement = new Placement(doc.DatabaseNumber, (ushort)contentPlacement.StartPageNumber, 1, contentPlacement.MaxObjectsPerPage, contentPlacement.MaxPagesPerDatabase, false, false, 1, false); content.Persist(contentPlacement, session, false); Debug.Assert(content.DatabaseNumber == doc.DatabaseNumber); doc.Content = content; indexRoot.repository.documentSet.AddFast(doc); if (++docCount % 1000000 == 0) { //session.Commit(false); // skip recovery check, we do it in BeginUpdate which is enough Console.WriteLine("Done importing article " + docCount + " number of lines: " + textReader.LineNumber); //session.BeginUpdate(); } } break; case System.Xml.XmlNodeType.Whitespace: xmlWhitespace = new XmlWhitespace(textReader.Value, xmlDocument); break; case System.Xml.XmlNodeType.XmlDeclaration: break; }; } Console.WriteLine("Finished importing article " + docCount + " number of lines: " + textReader.LineNumber); } } } session.Commit(); } Console.WriteLine(DateTime.Now.ToString() + ", done importing Wikipedia text"); }
public void UnpersistCompareFields(int bTreeDatabaseNumber) { using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); BTreeSet<Person> bTree = (BTreeSet<Person>)session.Open(Oid.Encode((uint)bTreeDatabaseNumber, 1, 1)); BTreeSetIterator<Person> itr = bTree.Iterator(); itr.GoToLast(); itr.Remove(); session.Abort(); session.BeginUpdate(); bTree = (BTreeSet<Person>)session.Open(Oid.Encode((uint)bTreeDatabaseNumber, 1, 1)); bTree.Unpersist(session); session.Commit(); session.BeginRead(); Database db = session.OpenDatabase((uint)bTreeDatabaseNumber, false); foreach (Page page in db) foreach (OptimizedPersistable obj in page) if (obj.PageNumber > 0) Assert.Fail("No objects should remain in this database"); session.Commit(); } }
public void ConcurrentUpdates(bool serverSession, int numberofThreads, bool optimisticLocking) { using (SessionBase session = new SessionNoServer(systemDir)) { session.BeginRead(); Database db = session.OpenDatabase(FixedSize.PlaceInDatabase, false, false); if (db != null) { Console.WriteLine("ConcurrentUpdates start, Number of FixedSize objects: " + db.AllObjects <FixedSize>().Count); } } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); FixedSize fixedSize = new FixedSize(); session.Persist(fixedSize); session.Commit(); } Thread[] threads = new Thread[numberofThreads]; for (int i = 0; i < numberofThreads; i++) { threads[i] = new Thread(() => { SessionBase session; if (serverSession) { session = new ServerClientSession(systemDir, null, 500, optimisticLocking); } else { session = new SessionNoServer(systemDir, 500, optimisticLocking); } try { for (int j = 0; j < 10; j++) { try { using (var transaction = session.BeginUpdate()) { session.SetTraceDbActivity(FixedSize.PlaceInDatabase); session.SetTraceDbActivity(2); Trace.Listeners.Add(new ConsoleTraceListener()); session.CrossTransactionCacheAllDatabases(); for (int k = 0; k < 4200; k++) { FixedSize fixedSize = new FixedSize(); session.Persist(fixedSize); if (k == 4000 && Thread.CurrentThread.ManagedThreadId % 3 != 0) { session.FlushUpdates(); } } transaction.Commit(); } if (!serverSession) { session.Compact(); } Console.WriteLine("Commit OK for thread " + Thread.CurrentThread.ManagedThreadId + " Transaction: " + j); } catch (PageUpdateLockException ex) { Console.WriteLine("Commit failed (OptimisticLockingFailed) for thread " + Thread.CurrentThread.ManagedThreadId + " Transaction: " + j); Console.WriteLine(ex.ToString()); } } catch (OptimisticLockingFailed ex) { Console.WriteLine("Commit failed (OptimisticLockingFailed) for thread " + Thread.CurrentThread.ManagedThreadId + " Transaction: " + j); Console.WriteLine(ex.ToString()); } catch (Exception ex) { Console.WriteLine("Commit failed for thread " + Thread.CurrentThread.ManagedThreadId + " Transaction: " + j); Console.WriteLine(ex.ToString()); } } finally { session.Dispose(); } });
[TestCase(false)] // test will fail if pessimistic locking is used public void SingleReaderSingleUpdater4(bool useReaderCommit) { using (SessionNoServer updater = new SessionNoServer(systemDir, 5000)) using (SessionNoServer reader = new SessionNoServer(systemDir, 5000)) { updater.SetTraceAllDbActivity(); reader.SetTraceAllDbActivity(); updater.BeginUpdate(); UInt32 dbNum = updater.DatabaseNumberOf(typeof(Man)); Database db = updater.OpenDatabase(dbNum, true, false); if (db != null) { updater.DeleteDatabase(db); } updater.Commit(); updater.BeginUpdate(); Man man = new Man(); for (int i = 0; i < 100; i++) { man = new Man(); updater.Persist(man); } updater.Commit(); reader.BeginRead(); updater.BeginUpdate(); db = reader.OpenDatabase(dbNum); foreach (Page page in db) { Assert.True(page.PageInfo.VersionNumber == 1); } if (useReaderCommit) { reader.Commit(); } if (useReaderCommit) { reader.BeginRead(); } else { reader.ForceDatabaseCacheValidation(); } for (int i = 1; i < 25; i++) { db = reader.OpenDatabase(dbNum); foreach (Page page in db) { if (page.PageNumber > 1) // skip AutoPlacemnt page { Assert.True(page.PageInfo.VersionNumber == (ulong)i); Man man2 = (Man)reader.Open(dbNum, page.PageNumber, 1, false); Man manUpdated = (Man)updater.Open(dbNum, page.PageNumber, 1, true); } } if (useReaderCommit) { reader.Commit(); reader.BeginRead(); } else { reader.ForceDatabaseCacheValidation(); } updater.Commit(); updater.BeginUpdate(); } Database db2 = reader.OpenDatabase(dbNum); db = updater.OpenDatabase(dbNum); for (int i = 25; i < 50; i++) { foreach (Page page in db) { if (page.PageNumber > 1) { Assert.True(page.PageInfo.VersionNumber == (ulong)i); Man manUpdated = (Man)updater.Open(dbNum, page.PageNumber, 1, true); } } updater.Commit(); updater.BeginUpdate(); db2 = reader.OpenDatabase(dbNum); foreach (Page page in db2) { if (page.PageNumber > 1) { //Assert.True(page.PageInfo.VersionNumber == (ulong)i + 1); Man man2 = (Man)reader.Open(dbNum, page.PageNumber, 1, false); } } reader.ClearPageCache(); System.GC.Collect(); } reader.Commit(); updater.Commit(); } }
public MainWindow() { const ushort btreeNodeSize = 5000; GCSettings.LatencyMode = GCLatencyMode.Batch;// try to keep the WeakIOptimizedPersistableReference objects around longer dataGridList = new List<DataGrid>(); dataTableList = new List<DataTable>(); InitializeComponent(); session = new SessionNoServer(s_systemDir); Placement placerIndexRoot = new Placement(IndexRoot.PlaceInDatabase); session.BeginUpdate(); Console.WriteLine("Running with databases in directory: " + session.SystemDirectory); File.Copy(s_licenseDbFile, Path.Combine(session.SystemDirectory, "4.odb"), true); IndexRoot indexRoot; Database db = session.OpenDatabase(IndexRoot.PlaceInDatabase, false, false); if (db == null) { session.NewDatabase(IndexRoot.PlaceInDatabase, 0, "IndexRoot"); session.NewDatabase(Lexicon.PlaceInDatabase, 0, "Lexicon"); session.NewDatabase(Document.PlaceInDatabase, 0, "Document"); session.NewDatabase(Repository.PlaceInDatabase, 0, "Repository"); session.NewDatabase(DocumentText.PlaceInDatabase, 0, "DocumentText"); session.NewDatabase(Word.PlaceInDatabase, 0, "Word"); indexRoot = new IndexRoot(btreeNodeSize, session); if (Directory.Exists(s_booksDir)) { string[] directoryTextFiles = Directory.GetFiles(s_booksDir, "*.txt"); foreach (string fileName in directoryTextFiles) { listBoxPagesToAdd.Items.Add(fileName); } } else { wordMinCt.Text = 1.ToString(); listBoxPagesToAdd.Items.Add("http://www.VelocityDB.com/"); // other database products listBoxPagesToAdd.Items.Add("https://foundationdb.com/"); listBoxPagesToAdd.Items.Add("http://www.oracle.com/us/products/database/index.html"); listBoxPagesToAdd.Items.Add("http://www-01.ibm.com/software/data/db2/"); listBoxPagesToAdd.Items.Add("http://www.versant.com/"); listBoxPagesToAdd.Items.Add("http://web.progress.com/en/objectstore/"); listBoxPagesToAdd.Items.Add("https://www.mongodb.org/"); listBoxPagesToAdd.Items.Add("http://cassandra.apache.org/"); listBoxPagesToAdd.Items.Add("http://www.sybase.com/"); listBoxPagesToAdd.Items.Add("http://www.mcobject.com/perst"); listBoxPagesToAdd.Items.Add("http://www.marklogic.com/what-is-marklogic/"); listBoxPagesToAdd.Items.Add("http://hamsterdb.com/"); listBoxPagesToAdd.Items.Add("http://www.firebirdsql.org/"); listBoxPagesToAdd.Items.Add("http://www.h2database.com/"); listBoxPagesToAdd.Items.Add("http://www.oracle.com/technology/products/berkeley-db"); listBoxPagesToAdd.Items.Add("http://www.scimore.com/"); listBoxPagesToAdd.Items.Add("http://www.stsdb.com/"); listBoxPagesToAdd.Items.Add("http://www.sqlite.org/about.html"); listBoxPagesToAdd.Items.Add("http://www.mysql.com/products/enterprise/techspec.html"); listBoxPagesToAdd.Items.Add("http://www.objectivity.com"); listBoxPagesToAdd.Items.Add("http://vistadb.net/"); listBoxPagesToAdd.Items.Add("http://www.google.com/search?q=object+database&sourceid=ie7&rls=com.microsoft:en-us:IE-SearchBox&ie=&oe="); } indexRoot.Persist(session, indexRoot); } else indexRoot = (IndexRoot)session.Open(Oid.Encode(IndexRoot.PlaceInDatabase, 1, 1)); if (indexRoot.repository.documentSet.Count > 0) { List<Document> docs = indexRoot.repository.documentSet.ToList<Document>().Take(50).ToList<Document>(); inDbListBox.ItemsSource = docs; } updateDataGrids(indexRoot); session.Commit(); //verify(); }
public void CreateDataAndIterateSession(int numObj) { using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); UInt32 dbNum = session.DatabaseNumberOf(typeof(NotSharingPage)); Database db = session.OpenDatabase(dbNum, true, false); if (db != null) { session.DeleteDatabase(db); } dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeA)); db = session.OpenDatabase(dbNum, true, false); if (db != null) { session.DeleteDatabase(db); } dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeB)); db = session.OpenDatabase(dbNum, true, false); if (db != null) { session.DeleteDatabase(db); } session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); UInt32 dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeB)); Placement place = new Placement(dbNum, 100); for (int i = 0; i < numObj; i++) { NotSharingPage ns = new NotSharingPage(); session.Persist(ns); SharingPageTypeA sA = new SharingPageTypeA(); session.Persist(sA); SharingPageTypeB sB = new SharingPageTypeB(); if (i % 5 == 0) { sB.Persist(session, place); } else if (i % 1001 == 0) { sB.Persist(session, sA); } else if (i % 3001 == 0) { sB.Persist(session, ns); } else { session.Persist(sB); } } session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginRead(); UInt32 dbNum = session.DatabaseNumberOf(typeof(NotSharingPage)); Database db = session.OpenDatabase(dbNum); AllObjects <NotSharingPage> all = session.AllObjects <NotSharingPage>(true, false); OfType all2 = session.OfType(typeof(NotSharingPage), true, false); dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeA)); Database dbA = session.OpenDatabase(dbNum); dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeB)); Database dbB = session.OpenDatabase(dbNum); AllObjects <SharingPageTypeA> allA = session.AllObjects <SharingPageTypeA>(true, false); AllObjects <SharingPageTypeB> allB = session.AllObjects <SharingPageTypeB>(true, false); int start = numObj / 2; NotSharingPage ns = all.ElementAt(numObj); NotSharingPage ns2 = (NotSharingPage)all2.ElementAt(numObj); Assert.AreEqual(ns, ns2); SharingPageTypeA sA = allA.ElementAt(15); SharingPageTypeB sB = allB.ElementAt(10); for (int i = start; i < numObj; i++) { ns = all.ElementAt(i); } //for (int i = start; i < numObj; i++) // ns = all.Skip(i).T //for (int i = start; i < numObj; i++) // sA = allA.ElementAt(i); all.Skip(100); all2.Skip(100); for (int i = start; i < numObj; i += 5) { ns = all.ElementAt(i); ns2 = (NotSharingPage)all2.ElementAt(i); Assert.AreEqual(ns, ns2); } for (int i = 5; i < 100; i += 5) { sB = allB.ElementAt(i); } for (int i = 0; i < numObj; i += 45000) { ns = all.ElementAt(i); } session.Commit(); session.BeginUpdate(); session.DeleteDatabase(db); session.DeleteDatabase(dbA); session.DeleteDatabase(dbB); session.Commit(); } }
public void CreateDataAndIterateSession(int numObj) { using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); UInt32 dbNum = session.DatabaseNumberOf(typeof(NotSharingPage)); Database db = session.OpenDatabase(dbNum, true, false); if (db != null) session.DeleteDatabase(db); dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeA)); db = session.OpenDatabase(dbNum, true, false); if (db != null) session.DeleteDatabase(db); dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeB)); db = session.OpenDatabase(dbNum, true, false); if (db != null) session.DeleteDatabase(db); session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); UInt32 dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeB)); Placement place = new Placement(dbNum, 100); for (int i = 0; i < numObj; i++) { NotSharingPage ns = new NotSharingPage(); session.Persist(ns); SharingPageTypeA sA = new SharingPageTypeA(); session.Persist(sA); SharingPageTypeB sB = new SharingPageTypeB(); if (i % 5 == 0) sB.Persist(session, place); else if (i % 1001 == 0) sB.Persist(session, sA); else if (i % 3001 == 0) sB.Persist(session, ns); else session.Persist(sB); } session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginRead(); UInt32 dbNum = session.DatabaseNumberOf(typeof(NotSharingPage)); Database db = session.OpenDatabase(dbNum); AllObjects<NotSharingPage> all = session.AllObjects<NotSharingPage>(true, false); OfType all2 = session.OfType(typeof(NotSharingPage), true, false); dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeA)); Database dbA = session.OpenDatabase(dbNum); dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeB)); Database dbB = session.OpenDatabase(dbNum); AllObjects<SharingPageTypeA> allA = session.AllObjects<SharingPageTypeA>(true, false); AllObjects<SharingPageTypeB> allB = session.AllObjects<SharingPageTypeB>(true, false); int start = numObj / 2; NotSharingPage ns = all.ElementAt(numObj - 1); // zero based index so deduct one NotSharingPage ns2 = (NotSharingPage)all2.ElementAt(numObj - 1); Assert.AreEqual(ns, ns2); SharingPageTypeA sA = allA.ElementAt(15); SharingPageTypeB sB = allB.ElementAt(10); for (int i = start; i < numObj; i++) ns = all.ElementAt(i); //for (int i = start; i < numObj; i++) // ns = all.Skip(i).T //for (int i = start; i < numObj; i++) // sA = allA.ElementAt(i); all.Skip(100); all2.Skip(100); for (int i = start; i < numObj; i += 5) { ns = all.ElementAt(i); ns2 = (NotSharingPage)all2.ElementAt(i); Assert.AreEqual(ns, ns2); } for (int i = 5; i < 100; i += 5) sB = allB.ElementAt(i); for (int i = 0; i < numObj; i += 45000) ns = all.ElementAt(i); session.Commit(); session.BeginUpdate(); session.DeleteDatabase(db); session.DeleteDatabase(dbA); session.DeleteDatabase(dbB); session.Commit(); } }
static readonly string s_systemDir = "Indexes"; // appended to SessionBase.BaseDatabasePath static void Main(string[] args) { try { Trace.Listeners.Add(new ConsoleTraceListener()); string brandName = "Toyota"; string color = "Blue"; int maxPassengers = 5; int fuelCapacity = 40; double litresPer100Kilometers = 5; DateTime modelYear = new DateTime(2003, 1, 1); string modelName = "Highlander"; int maxSpeed = 200; int odometer = 100000; string registrationState = "Texas"; string registrationPlate = "TX343434"; string insurancePolicy = "CAA7878787"; DriversLicense license = new DriversLicense("California", "B7788888", DateTime.Now + new TimeSpan(1825, 0, 0, 0)); Person person = new Person("Mats Persson", license); InsuranceCompany insuranceCompany = new InsuranceCompany("Allstate", "858727878"); Car car = new Car(color, maxPassengers, fuelCapacity, litresPer100Kilometers, modelYear, brandName, modelName, maxSpeed, odometer, registrationState, registrationPlate, insuranceCompany, insurancePolicy); using (SessionNoServer session = new SessionNoServer(s_systemDir)) { // cleanup data from a possible prior run session.BeginUpdate(); foreach (Database db in session.OpenAllDatabases(true)) { if (db.DatabaseNumber >= 10 || db.DatabaseNumber == SessionBase.IndexDescriptorDatabaseNumber) { session.DeleteDatabase(db); } } session.Commit(); File.Copy(s_licenseDbFile, Path.Combine(session.SystemDirectory, "4.odb")); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { Console.WriteLine("Running with databases in directory: " + session.SystemDirectory); //session.AddToIndexInSeperateThread = false; session.BeginUpdate(); session.Persist(car); registrationState = "Maine"; car = new Car(color, maxPassengers, fuelCapacity, litresPer100Kilometers, modelYear, brandName, modelName, maxSpeed, odometer, registrationState, registrationPlate, insuranceCompany, insurancePolicy); session.Persist(car); color = "Red"; maxPassengers = 5; fuelCapacity = 50; litresPer100Kilometers = 8; modelYear = new DateTime(2006, 1, 1); brandName = "Toyota"; modelName = "Tacoma"; maxSpeed = 210; odometer = 50000; registrationState = "Texas"; registrationPlate = "TX343433"; insurancePolicy = "CAA7878777"; car = new Car(color, maxPassengers, fuelCapacity, litresPer100Kilometers, modelYear, brandName, modelName, maxSpeed, odometer, registrationState, registrationPlate, insuranceCompany, insurancePolicy); session.Persist(car); color = "Black"; maxPassengers = 5; fuelCapacity = 60; litresPer100Kilometers = 3; modelYear = new DateTime(2001, 1, 1); brandName = "Lincoln"; modelName = "Town Car"; maxSpeed = 220; odometer = 250000; registrationState = "Texas"; registrationPlate = "TX543433"; insurancePolicy = "CAA7878775"; car = new Car(color, maxPassengers, fuelCapacity, litresPer100Kilometers, modelYear, brandName, modelName, maxSpeed, odometer, registrationState, registrationPlate, insuranceCompany, insurancePolicy); session.Persist(car); session.Commit(); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.BeginRead(); Console.WriteLine("Blue Cars"); BTreeSet <Car> bTree = session.Index <Car>("color"); foreach (Car c in (from aCar in bTree where aCar.Color == "Blue" select aCar)) { Console.WriteLine(c.ToStringDetails(session)); } Console.WriteLine("Cars in fuel efficiency order"); foreach (Car c in session.Index <Car>("litresPer100Kilometers")) { Console.WriteLine(c.ToStringDetails(session)); } Console.WriteLine("Vehicles ordered modelYear, brandName, modelName, color"); foreach (Vehicle v in session.Index <Vehicle>()) { Console.WriteLine(v.ToStringDetails(session)); } session.Commit(); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.TraceIndexUsage = true; session.BeginUpdate(); // these LINQ statements will trigger a binary search lookup (not a linear search) of the matching Car objects in the BTreeSet Car c = (from aCar in session.Index <Car>("color") where aCar.Color == "Blue" select aCar).First(); c.Color = "Green"; session.Commit(); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.TraceIndexUsage = true; session.BeginUpdate(); // these LINQ statements will trigger a binary search lookup (not a linear search) of the matching Car objects in the BTreeSet Car c = (from aCar in session.Index <Car>("color") where aCar.Color == "Green" select aCar).First(); UInt64 id = c.Id; session.DeleteObject(id); session.Abort(); session.BeginUpdate(); session.DeleteObject(id); session.Commit(); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.TraceIndexUsage = true; Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginRead(); // these LINQ statements will trigger a binary search lookup (not a linear search) of the matching Car objects in the BTreeSet Console.WriteLine("Blue Cars"); foreach (Car c in (from aCar in session.Index <Car>("color") where aCar.Color == "Blue" select aCar)) { Console.WriteLine(c.ToStringDetails(session)); } session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginUpdate(); for (int i = 0; i < 10000; i++) { // add some junk to make search harder car = new Car(color, maxPassengers, fuelCapacity, litresPer100Kilometers, modelYear, brandName, modelName, i, odometer, registrationState, registrationPlate + i, insuranceCompany, insurancePolicy); session.Persist(car); } session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.TraceIndexUsage = true; Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginRead(); // these LINQ statements will trigger a binary search lookup (not a linear search) of the matching Car objects in the BTreeSet Console.WriteLine("Blue Cars"); foreach (Car c in (from aCar in session.Index <Car>("color") where aCar.Color == "Blue" select aCar)) { Console.WriteLine(c.ToStringDetails(session)); } session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginUpdate(); Car c = (from aCar in session.Index <Car>("color") where aCar.Color == "Blue" select aCar).First(); c.Unpersist(session); session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginRead(); foreach (Car c in session.Index <Car>()) { Console.WriteLine(c.ToStringDetails(session)); } Console.WriteLine("Blue Cars"); foreach (Car c in (from aCar in session.Index <Car>() where aCar.Color == "Blue" select aCar)) { Console.WriteLine(c.ToStringDetails(session)); } session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginUpdate(); InsuranceCompany prior = insuranceCompany; try { for (int i = 0; i < 100000; i++) { insuranceCompany = new InsuranceCompany("AAA", "858787878"); session.Persist(insuranceCompany); } Debug.Assert(false); // should not get here } catch (UniqueConstraintException) { } session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.TraceIndexUsage = true; Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginRead(); Database db = session.OpenDatabase(session.DatabaseNumberOf(typeof(InsuranceCompany))); var q = from company in session.Index <InsuranceCompany>("name", db) where company.Name == "AAA" select company; foreach (InsuranceCompany company in q) { Console.WriteLine(company.ToStringDetails(session)); // only one will match } session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginUpdate(); Customer joe = new Customer("Joe"); session.Persist(joe); Customer karim = new Customer("Karim"); session.Persist(karim); Customer tony = new Customer("Tony"); session.Persist(tony); Customer wayne = new Customer("Wayne"); session.Persist(wayne); Order order = new Order(joe); Payment payment = new Payment(order); order = new Order(karim); payment = new Payment(order); payment = new Payment(order); payment = new Payment(order); order = new Order(tony); payment = new Payment(order); payment = new Payment(order); order = new Order(wayne); payment = new Payment(order); session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.TraceIndexUsage = true; Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginRead(); var karim = (from customer in session.Index <Customer>("m_name") where customer.Name == "Karim" select customer).FirstOrDefault(); var karimOrders = karim.Orders; var karimOrderFromOrders = (from order in session.Index <Order>("m_customer") where order.Customer == karim select order).ToArray(); session.Commit(); session.BeginUpdate(); karim = (from customer in session.Index <Customer>("m_name") where customer.Name == "Karim" select customer).FirstOrDefault(); karim.StreetAddress = "1623 Bonita Ave"; session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
static void importEntireWikipedia() { const ushort btreeNodeSize = 10000; Console.WriteLine(DateTime.Now.ToString() + ", start importing Wikipedia text"); //System.Xml.Schema.XmlSchema docSchema; //using (System.Xml.XmlTextReader schemaReader = new System.Xml.XmlTextReader("c:\\export-0_5.xsd")) //{ // docSchema = System.Xml.Schema.XmlSchema.Read(schemaReader, ValidationCallBack); // } int docCount = 0; using (SessionNoServer session = new SessionNoServer(s_systemDir, 5000, false, false, CacheEnum.No)) // turn of page and object caching { Console.WriteLine("Running with databases in directory: " + session.SystemDirectory); //GCSettings.LatencyMode = GCLatencyMode.Batch;// try to keep the WeakIOptimizedPersistableReference objects around longer Placement documentPlacement = new Placement(Document.PlaceInDatabase, 1003, 1, 500, 1000, false, false, 1000, false); Placement contentPlacement = new Placement(Document.PlaceInDatabase, 1, 1, 500, UInt16.MaxValue, false, false, 1, false); XmlComment xmlComment; XmlElement xmlElement; XmlEntity xmlEntity; XmlText xmlText; XmlWhitespace xmlWhitespace; session.BeginUpdate(); File.Copy(s_licenseDbFile, System.IO.Path.Combine(session.SystemDirectory, "4.odb"), true); // register all database schema classes used by the application in advance to avoid lock conflict later in parallell indexing session.RegisterClass(typeof(Repository)); session.RegisterClass(typeof(IndexRoot)); session.RegisterClass(typeof(Document)); session.RegisterClass(typeof(Lexicon)); session.RegisterClass(typeof(DocumentText)); session.RegisterClass(typeof(Word)); session.RegisterClass(typeof(WordGlobal)); session.RegisterClass(typeof(WordHit)); session.RegisterClass(typeof(BTreeSet <Document>)); session.RegisterClass(typeof(OidShort)); session.RegisterClass(typeof(BTreeMap <Word, WordHit>)); session.RegisterClass(typeof(HashCodeComparer <Word>)); session.RegisterClass(typeof(BTreeSetOidShort <Word>)); session.RegisterClass(typeof(BTreeMapOidShort <Word, WordHit>)); Database db = session.OpenDatabase(IndexRoot.PlaceInDatabase, false, false); if (db != null) { outputSomeInfo(session); session.Abort(); return; } session.NewDatabase(IndexRoot.PlaceInDatabase, 0, "IndexRoot"); session.NewDatabase(Lexicon.PlaceInDatabase, 0, "Lexicon"); session.NewDatabase(Repository.PlaceInDatabase, 0, "Repository"); for (UInt32 i = 40; i <= 186; i++) { session.NewDatabase(i, 512, "Document"); // pre allocate 146 Document databases presized to 512MB each } //session.SetTraceDbActivity(Lexicon.PlaceInDatabase); //session.SetTraceAllDbActivity(); XmlDocument xmlDocument = new XmlDocument("enwiki-latest-pages-articles.xml"); IndexRoot indexRoot = new IndexRoot(btreeNodeSize, session); indexRoot.Persist(session, indexRoot, true); Document doc = null; bool titleElement = false; bool pageText = false; UInt32 currentDocumentDatabaseNum = documentPlacement.StartDatabaseNumber; using (FileStream fs = new FileStream(s_wikipediaXmlFile, FileMode.Open)) { //using (GZipStream zipStream = new GZipStream(fs, CompressionMode.Decompress)) // if input was a .gz file { using (System.Xml.XmlTextReader textReader = new System.Xml.XmlTextReader(fs)) { while (textReader.Read()) { System.Xml.XmlNodeType nodeType = textReader.NodeType; switch (nodeType) { case System.Xml.XmlNodeType.Attribute: break; case System.Xml.XmlNodeType.CDATA: break; case System.Xml.XmlNodeType.Comment: xmlComment = new XmlComment(textReader.Value, xmlDocument); break; case System.Xml.XmlNodeType.Document: break; case System.Xml.XmlNodeType.DocumentFragment: break; case System.Xml.XmlNodeType.DocumentType: break; case System.Xml.XmlNodeType.Element: xmlElement = new XmlElement(textReader.Prefix, textReader.LocalName, textReader.NamespaceURI, xmlDocument); if (textReader.LocalName == "title") { titleElement = true; } else if (textReader.LocalName == "text") { pageText = true; } break; case System.Xml.XmlNodeType.EndElement: if (textReader.LocalName == "title" && doc != null) { titleElement = false; } else if (textReader.LocalName == "text" && doc != null) { pageText = false; } break; case System.Xml.XmlNodeType.EndEntity: break; case System.Xml.XmlNodeType.Entity: xmlEntity = new XmlEntity(textReader.LocalName, xmlDocument); break; case System.Xml.XmlNodeType.EntityReference: break; case System.Xml.XmlNodeType.None: break; case System.Xml.XmlNodeType.Notation: break; case System.Xml.XmlNodeType.ProcessingInstruction: break; case System.Xml.XmlNodeType.SignificantWhitespace: break; case System.Xml.XmlNodeType.Text: xmlText = new XmlText(textReader.Value, xmlDocument); if (titleElement) { doc = new Document(textReader.Value, indexRoot, session); doc.Persist(documentPlacement, session, true); if (doc.DatabaseNumber != currentDocumentDatabaseNum) { session.FlushUpdates(session.OpenDatabase(currentDocumentDatabaseNum)); Console.WriteLine("Database: " + currentDocumentDatabaseNum + " is completed, done importing article " + docCount + " number of lines: " + textReader.LineNumber); currentDocumentDatabaseNum = doc.DatabaseNumber; } //doc.Page.Database.Name = doc.Name; } else if (doc != null && pageText) { #if DEBUGx Console.WriteLine(doc.Name + " line: " + textReader.LineNumber); #endif //if (textReader.LineNumber > 1000000) //{ // session.Commit(); // return; //} DocumentText content = new DocumentText(textReader.Value, doc); if (doc.DatabaseNumber != contentPlacement.TryDatabaseNumber) { contentPlacement = new Placement(doc.DatabaseNumber, (ushort)contentPlacement.StartPageNumber, 1, contentPlacement.MaxObjectsPerPage, contentPlacement.MaxPagesPerDatabase, false, false, 1, false); } content.Persist(contentPlacement, session, false); Debug.Assert(content.DatabaseNumber == doc.DatabaseNumber); doc.Content = content; indexRoot.repository.documentSet.AddFast(doc); if (++docCount % 1000000 == 0) { //session.Commit(false); // skip recovery check, we do it in BeginUpdate which is enough Console.WriteLine("Done importing article " + docCount + " number of lines: " + textReader.LineNumber); //session.BeginUpdate(); } } break; case System.Xml.XmlNodeType.Whitespace: xmlWhitespace = new XmlWhitespace(textReader.Value, xmlDocument); break; case System.Xml.XmlNodeType.XmlDeclaration: break; } ; } Console.WriteLine("Finished importing article " + docCount + " number of lines: " + textReader.LineNumber); } } } session.Commit(); } Console.WriteLine(DateTime.Now.ToString() + ", done importing Wikipedia text"); }
static readonly string s_systemDir = "Indexes"; // appended to SessionBase.BaseDatabasePath static void Main(string[] args) { try { Trace.Listeners.Add(new ConsoleTraceListener()); string brandName = "Toyota"; string color = "Blue"; int maxPassengers = 5; int fuelCapacity = 40; double litresPer100Kilometers = 5; DateTime modelYear = new DateTime(2003, 1, 1); string modelName = "Highlander"; int maxSpeed = 200; int odometer = 100000; string registrationState = "Texas"; string registrationPlate = "TX343434"; string insurancePolicy = "CAA7878787"; DriversLicense license = new DriversLicense("California", "B7788888", DateTime.Now + new TimeSpan(1825, 0, 0, 0)); Person person = new Person("Mats Persson", license); InsuranceCompany insuranceCompany = new InsuranceCompany("Allstate", "858727878"); Car car = new Car(color, maxPassengers, fuelCapacity, litresPer100Kilometers, modelYear, brandName, modelName, maxSpeed, odometer, registrationState, registrationPlate, insuranceCompany, insurancePolicy); using (SessionNoServer session = new SessionNoServer(s_systemDir)) { // cleanup data from a possible prior run session.BeginUpdate(); foreach (Database db in session.OpenAllDatabases(true)) if (db.DatabaseNumber >= 10 || db.DatabaseNumber == SessionBase.IndexDescriptorDatabaseNumber) session.DeleteDatabase(db); session.Commit(); File.Copy(s_licenseDbFile, Path.Combine(session.SystemDirectory, "4.odb")); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { Console.WriteLine("Running with databases in directory: " + session.SystemDirectory); //session.AddToIndexInSeperateThread = false; session.BeginUpdate(); session.Persist(car); registrationState = "Maine"; car = new Car(color, maxPassengers, fuelCapacity, litresPer100Kilometers, modelYear, brandName, modelName, maxSpeed, odometer, registrationState, registrationPlate, insuranceCompany, insurancePolicy); session.Persist(car); color = "Red"; maxPassengers = 5; fuelCapacity = 50; litresPer100Kilometers = 8; modelYear = new DateTime(2006, 1, 1); brandName = "Toyota"; modelName = "Tacoma"; maxSpeed = 210; odometer = 50000; registrationState = "Texas"; registrationPlate = "TX343433"; insurancePolicy = "CAA7878777"; car = new Car(color, maxPassengers, fuelCapacity, litresPer100Kilometers, modelYear, brandName, modelName, maxSpeed, odometer, registrationState, registrationPlate, insuranceCompany, insurancePolicy); session.Persist(car); color = "Black"; maxPassengers = 5; fuelCapacity = 60; litresPer100Kilometers = 3; modelYear = new DateTime(2001, 1, 1); brandName = "Lincoln"; modelName = "Town Car"; maxSpeed = 220; odometer = 250000; registrationState = "Texas"; registrationPlate = "TX543433"; insurancePolicy = "CAA7878775"; car = new Car(color, maxPassengers, fuelCapacity, litresPer100Kilometers, modelYear, brandName, modelName, maxSpeed, odometer, registrationState, registrationPlate, insuranceCompany, insurancePolicy); session.Persist(car); session.Commit(); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.BeginRead(); Console.WriteLine("Blue Cars"); BTreeSet<Car> bTree = session.Index<Car>("color"); foreach (Car c in (from aCar in bTree where aCar.Color == "Blue" select aCar)) Console.WriteLine(c.ToStringDetails(session)); Console.WriteLine("Cars in fuel efficiency order"); foreach (Car c in session.Index<Car>("litresPer100Kilometers")) Console.WriteLine(c.ToStringDetails(session)); Console.WriteLine("Vehicles ordered modelYear, brandName, modelName, color"); foreach (Vehicle v in session.Index<Vehicle>()) Console.WriteLine(v.ToStringDetails(session)); session.Commit(); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.TraceIndexUsage = true; session.BeginUpdate(); // these LINQ statements will trigger a binary search lookup (not a linear search) of the matching Car objects in the BTreeSet Car c = (from aCar in session.Index<Car>("color") where aCar.Color == "Blue" select aCar).First(); c.Color = "Green"; session.Commit(); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.TraceIndexUsage = true; session.BeginUpdate(); // these LINQ statements will trigger a binary search lookup (not a linear search) of the matching Car objects in the BTreeSet Car c = (from aCar in session.Index<Car>("color") where aCar.Color == "Green" select aCar).First(); UInt64 id = c.Id; session.DeleteObject(id); session.Abort(); session.BeginUpdate(); session.DeleteObject(id); session.Commit(); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.TraceIndexUsage = true; Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginRead(); // these LINQ statements will trigger a binary search lookup (not a linear search) of the matching Car objects in the BTreeSet Console.WriteLine("Blue Cars"); foreach (Car c in (from aCar in session.Index<Car>("color") where aCar.Color == "Blue" select aCar)) Console.WriteLine(c.ToStringDetails(session)); session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginUpdate(); for (int i = 0; i < 10000; i++) { // add some junk to make search harder car = new Car(color, maxPassengers, fuelCapacity, litresPer100Kilometers, modelYear, brandName, modelName, i, odometer, registrationState, registrationPlate + i, insuranceCompany, insurancePolicy); session.Persist(car); } session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.TraceIndexUsage = true; Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginRead(); // these LINQ statements will trigger a binary search lookup (not a linear search) of the matching Car objects in the BTreeSet Console.WriteLine("Blue Cars"); foreach (Car c in (from aCar in session.Index<Car>("color") where aCar.Color == "Blue" select aCar)) Console.WriteLine(c.ToStringDetails(session)); session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginUpdate(); Car c = (from aCar in session.Index<Car>("color") where aCar.Color == "Blue" select aCar).First(); c.Unpersist(session); session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginRead(); foreach (Car c in session.Index<Car>()) Console.WriteLine(c.ToStringDetails(session)); Console.WriteLine("Blue Cars"); foreach (Car c in (from aCar in session.Index<Car>() where aCar.Color == "Blue" select aCar)) Console.WriteLine(c.ToStringDetails(session)); session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginUpdate(); InsuranceCompany prior = insuranceCompany; try { for (int i = 0; i < 100000; i++) { insuranceCompany = new InsuranceCompany("AAA", "858787878"); session.Persist(insuranceCompany); } Debug.Assert(false); // should not get here } catch (UniqueConstraintException) { } session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.TraceIndexUsage = true; Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginRead(); Database db = session.OpenDatabase(session.DatabaseNumberOf(typeof(InsuranceCompany))); var q = from company in session.Index<InsuranceCompany>("name", db) where company.Name == "AAA" select company; foreach (InsuranceCompany company in q) Console.WriteLine(company.ToStringDetails(session)); // only one will match session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginUpdate(); Customer joe = new Customer("Joe"); session.Persist(joe); Customer karim = new Customer("Karim"); session.Persist(karim); Customer tony = new Customer("Tony"); session.Persist(tony); Customer wayne = new Customer("Wayne"); session.Persist(wayne); Order order = new Order(joe); Payment payment = new Payment(order); order = new Order(karim); payment = new Payment(order); payment = new Payment(order); payment = new Payment(order); order = new Order(tony); payment = new Payment(order); payment = new Payment(order); order = new Order(wayne); payment = new Payment(order); session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.TraceIndexUsage = true; Stopwatch sw = new Stopwatch(); sw.Start(); session.BeginRead(); var karim = (from customer in session.Index<Customer>("m_name") where customer.Name == "Karim" select customer).FirstOrDefault(); var karimOrders = karim.Orders; var karimOrderFromOrders = (from order in session.Index<Order>("m_customer") where order.Customer == karim select order).ToArray(); session.Commit(); session.BeginUpdate(); karim = (from customer in session.Index<Customer>("m_name") where customer.Name == "Karim" select customer).FirstOrDefault(); karim.StreetAddress = "1623 Bonita Ave"; session.Commit(); sw.Stop(); Console.WriteLine(sw.Elapsed); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
public void MultipleThreadsAdding() { bool doClearAll = SessionBase.ClearAllCachedObjectsWhenDetectingUpdatedDatabase; SessionBase.ClearAllCachedObjectsWhenDetectingUpdatedDatabase = false; try { using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); session.RegisterClass(typeof(AutoPlacement)); // build in type but not yet registered as a one session.RegisterClass(typeof(ObservableList<int>)); session.RegisterClass(typeof(Dokument)); UInt32 dbNum = session.DatabaseNumberOf(typeof(Dokument)); Database db = session.OpenDatabase(dbNum, false, false); if (db == null) db = session.NewDatabase(dbNum, 0, typeof(Dokument).ToGenericTypeString()); Dokument doc = new Dokument(); session.Persist(doc); session.Commit(); } using (ServerClientSessionShared sharedReadSession = new ServerClientSessionShared(systemDir)) { sharedReadSession.BeginRead(); Parallel.ForEach(Enumerable.Range(1, 3), (num) => LockConflict(sharedReadSession)); } } finally { SessionBase.ClearAllCachedObjectsWhenDetectingUpdatedDatabase = doClearAll; } }
public void CreateDataAndIterateDb(int numObj) { using (SessionNoServer session = new SessionNoServer(systemDir)) { session.Verify(); session.BeginUpdate(); UInt32 dbNum = session.DatabaseNumberOf(typeof(NotSharingPage)); Database db = session.OpenDatabase(dbNum, true, false); if (db != null) session.DeleteDatabase(db); dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeA)); db = session.OpenDatabase(dbNum, true, false); if (db != null) session.DeleteDatabase(db); dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeB)); db = session.OpenDatabase(dbNum, true, false); if (db != null) session.DeleteDatabase(db); session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.Verify(); session.BeginUpdate(); UInt32 dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeB)); Placement place = new Placement(dbNum, 100); for (int i = 0; i < numObj; i++) { NotSharingPage ns = new NotSharingPage(); session.Persist(ns); SharingPageTypeA sA = new SharingPageTypeA(); session.Persist(sA); SharingPageTypeB sB = new SharingPageTypeB(); if (i % 5 == 0) sB.Persist(session, place); else if (i % 1001 == 0) sB.Persist(session, sA); else if (i % 3001 == 0) sB.Persist(session, ns); else session.Persist(sB); } session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginRead(); session.Verify(); UInt32 dbNum = session.DatabaseNumberOf(typeof(NotSharingPage)); Database db = session.OpenDatabase(dbNum); AllObjects<NotSharingPage> all = db.AllObjects<NotSharingPage>(); ulong ct = all.Count(); dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeA)); OfType ofType = db.OfType(typeof(NotSharingPage)); ulong ct2 = ofType.Count(); Assert.AreEqual(ct, ct2); Database dbA = session.OpenDatabase(dbNum); dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeB)); Database dbB = session.OpenDatabase(dbNum); AllObjects<SharingPageTypeA> allA = dbA.AllObjects<SharingPageTypeA>(); AllObjects<SharingPageTypeB> allB = dbB.AllObjects<SharingPageTypeB>(); OfType allA2 = dbA.OfType(typeof(SharingPageTypeA)); int start = numObj / 2; NotSharingPage ns = all.ElementAt(numObj); SharingPageTypeA sA = allA.ElementAt(numObj); SharingPageTypeA sA2 = (SharingPageTypeA)allA2.ElementAt(numObj); Assert.AreEqual(sA, sA2); sA = allA.ElementAt(10); sA2 = (SharingPageTypeA)allA2.ElementAt(10); Assert.AreEqual(sA, sA2); //MethodInfo method = typeof(Database).GetMethod("AllObjects"); //MethodInfo generic = method.MakeGenericMethod(sA.GetType()); //dynamic itr = generic.Invoke(dbA, new object[]{ true }); //SharingPageTypeA sAb = itr.ElementAt(numObj); //Assert.AreEqual(sA, sAb); //SharingPageTypeA sAc = itr.ElementAt(numObj); SharingPageTypeB sB = allB.ElementAt(numObj); List<NotSharingPage> notSharingPageList = all.Skip(100).ToList(); List<SharingPageTypeA> sharingPageTypeA = allA.Take(5).Skip(100).ToList(); for (int i = start; i < numObj; i++) sA = allA.ElementAt(i); for (int i = start; i < numObj; i += 5) ns = all.ElementAt(i); for (int i = start; i < numObj; i += 5) sB = allB.ElementAt(i); for (int i = 0; i < numObj; i += 45000) ns = all.ElementAt(i); int allB_count = (int) allB.Count(); for (int i = 0; i < allB_count - 1; i++) { Assert.NotNull(allB.ElementAt(i)); } session.Commit(); session.BeginUpdate(); session.DeleteDatabase(db); session.DeleteDatabase(dbA); session.DeleteDatabase(dbB); session.Commit(); } }
static void ImportEntireWikipedia() { const ushort btreeNodeSize = 10000; Console.WriteLine(DateTime.Now.ToString() + ", start importing Wikipedia text"); //System.Xml.Schema.XmlSchema docSchema; //using (System.Xml.XmlTextReader schemaReader = new System.Xml.XmlTextReader("c:\\export-0_5.xsd")) //{ // docSchema = System.Xml.Schema.XmlSchema.Read(schemaReader, ValidationCallBack); // } int docCount = 0; using (SessionNoServer session = new SessionNoServer(s_systemDir, 5000, false, false, CacheEnum.No)) // turn of page and object caching { Console.WriteLine($"Running with databases in directory: {session.SystemDirectory}"); //GCSettings.LatencyMode = GCLatencyMode.Batch;// try to keep the WeakIOptimizedPersistableReference objects around longer XmlComment xmlComment; XmlElement xmlElement; XmlEntity xmlEntity; XmlText xmlText; XmlWhitespace xmlWhitespace; session.BeginUpdate(); // register all database schema classes used by the application in advance to avoid lock conflict later in parallel indexing Database db = session.OpenDatabase(IndexRoot.PlaceInDatabase, false, false); if (db != null) { outputSomeInfo(session); session.Abort(); return; } //session.SetTraceDbActivity(Lexicon.PlaceInDatabase); //session.SetTraceAllDbActivity(); XmlDocument xmlDocument = new XmlDocument("enwiki-latest-pages-articles.xml"); IndexRoot indexRoot = new IndexRoot(btreeNodeSize, session); indexRoot.Persist(session, indexRoot, true); UInt32 currentDocumentDatabaseNum = 0; Document doc = null; bool titleElement = false; bool pageText = false; using (FileStream fs = new FileStream(s_wikipediaXmlFile, FileMode.Open)) { //using (GZipStream zipStream = new GZipStream(fs, CompressionMode.Decompress)) // if input was a .gz file { using (System.Xml.XmlTextReader textReader = new System.Xml.XmlTextReader(fs)) { while (textReader.Read()) { System.Xml.XmlNodeType nodeType = textReader.NodeType; switch (nodeType) { case System.Xml.XmlNodeType.Attribute: break; case System.Xml.XmlNodeType.CDATA: break; case System.Xml.XmlNodeType.Comment: xmlComment = new XmlComment(textReader.Value, xmlDocument); break; case System.Xml.XmlNodeType.Document: break; case System.Xml.XmlNodeType.DocumentFragment: break; case System.Xml.XmlNodeType.DocumentType: break; case System.Xml.XmlNodeType.Element: xmlElement = new XmlElement(textReader.Prefix, textReader.LocalName, textReader.NamespaceURI, xmlDocument); if (textReader.LocalName == "title") { titleElement = true; } else if (textReader.LocalName == "text") { pageText = true; } break; case System.Xml.XmlNodeType.EndElement: if (textReader.LocalName == "title" && doc != null) { titleElement = false; } else if (textReader.LocalName == "text" && doc != null) { pageText = false; } break; case System.Xml.XmlNodeType.EndEntity: break; case System.Xml.XmlNodeType.Entity: xmlEntity = new XmlEntity(textReader.LocalName, xmlDocument); break; case System.Xml.XmlNodeType.EntityReference: break; case System.Xml.XmlNodeType.None: break; case System.Xml.XmlNodeType.Notation: break; case System.Xml.XmlNodeType.ProcessingInstruction: break; case System.Xml.XmlNodeType.SignificantWhitespace: break; case System.Xml.XmlNodeType.Text: xmlText = new XmlText(textReader.Value, xmlDocument); if (titleElement) { doc = new Document(textReader.Value, indexRoot, session); session.Persist(doc); if (doc.DatabaseNumber != currentDocumentDatabaseNum) { if (currentDocumentDatabaseNum > 0) { session.FlushUpdates(); Console.WriteLine("Database: " + currentDocumentDatabaseNum + " is completed, done importing article " + docCount + " number of lines: " + textReader.LineNumber); } currentDocumentDatabaseNum = doc.DatabaseNumber; } //doc.Page.Database.Name = doc.Name; } else if (doc != null && pageText) { #if DEBUGx Console.WriteLine(doc.Name + " line: " + textReader.LineNumber); #endif //if (textReader.LineNumber > 1000000) //{ // session.Commit(); // return; //} DocumentText content = new DocumentText(textReader.Value, doc); session.Persist(content, 10000); doc.Content = content; indexRoot.Repository.DocumentSet.AddFast(doc); if (++docCount % 1000000 == 0) { //session.Commit(false); // skip recovery check, we do it in BeginUpdate which is enough Console.WriteLine("Done importing article " + docCount + " number of lines: " + textReader.LineNumber); //session.BeginUpdate(); } } break; case System.Xml.XmlNodeType.Whitespace: xmlWhitespace = new XmlWhitespace(textReader.Value, xmlDocument); break; case System.Xml.XmlNodeType.XmlDeclaration: break; } ; } Console.WriteLine("Finished importing article " + docCount + " number of lines: " + textReader.LineNumber); } } } session.Commit(); } Console.WriteLine(DateTime.Now.ToString() + ", done importing Wikipedia text"); }
public void CreateDataAndIterateDb(int numObj) { using (SessionNoServer session = new SessionNoServer(systemDir)) { session.Verify(); session.Commit(); session.BeginUpdate(); UInt32 dbNum = session.DatabaseNumberOf(typeof(NotSharingPage)); Database db = session.OpenDatabase(dbNum, true, false); if (db != null) { session.DeleteDatabase(db); } dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeA)); db = session.OpenDatabase(dbNum, true, false); if (db != null) { session.DeleteDatabase(db); } dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeB)); db = session.OpenDatabase(dbNum, true, false); if (db != null) { session.DeleteDatabase(db); } session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.Verify(); session.Commit(); session.BeginUpdate(); UInt32 dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeB)); Placement place = new Placement(dbNum, 100); for (int i = 0; i < numObj; i++) { NotSharingPage ns = new NotSharingPage(); session.Persist(ns); SharingPageTypeA sA = new SharingPageTypeA(); session.Persist(sA); SharingPageTypeB sB = new SharingPageTypeB(); if (i % 5 == 0) { sB.Persist(session, place); } else if (i % 1001 == 0) { sB.Persist(session, sA); } else if (i % 3001 == 0) { sB.Persist(session, ns); } else { session.Persist(sB); } } session.Commit(); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.Verify(); UInt32 dbNum = session.DatabaseNumberOf(typeof(NotSharingPage)); Database db = session.OpenDatabase(dbNum); AllObjects <NotSharingPage> all = db.AllObjects <NotSharingPage>(); int ct = all.Count(); dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeA)); OfType ofType = db.OfType(typeof(NotSharingPage)); int ct2 = (int)ofType.Count; Assert.AreEqual(ct, ct2); Database dbA = session.OpenDatabase(dbNum); dbNum = session.DatabaseNumberOf(typeof(SharingPageTypeB)); Database dbB = session.OpenDatabase(dbNum); AllObjects <SharingPageTypeA> allA = dbA.AllObjects <SharingPageTypeA>(); AllObjects <SharingPageTypeB> allB = dbB.AllObjects <SharingPageTypeB>(); OfType allA2 = dbA.OfType(typeof(SharingPageTypeA)); int start = numObj / 2; NotSharingPage ns = all.ElementAt(numObj); SharingPageTypeA sA = allA.ElementAt(numObj); SharingPageTypeA sA2 = (SharingPageTypeA)allA2.ElementAt(numObj); Assert.AreEqual(sA, sA2); sA = allA.ElementAt(10); sA2 = (SharingPageTypeA)allA2.ElementAt(10); Assert.AreEqual(sA, sA2); //MethodInfo method = typeof(Database).GetMethod("AllObjects"); //MethodInfo generic = method.MakeGenericMethod(sA.GetType()); //dynamic itr = generic.Invoke(dbA, new object[]{ true }); //SharingPageTypeA sAb = itr.ElementAt(numObj); //Assert.AreEqual(sA, sAb); //SharingPageTypeA sAc = itr.ElementAt(numObj); SharingPageTypeB sB = allB.ElementAt(numObj); List <NotSharingPage> notSharingPageList = all.Skip(100).ToList(); List <SharingPageTypeA> sharingPageTypeA = allA.Take(5).Skip(100).ToList(); for (int i = start; i < numObj; i++) { sA = allA.ElementAt(i); } for (int i = start; i < numObj; i += 5) { ns = all.ElementAt(i); } for (int i = start; i < numObj; i += 5) { sB = allB.ElementAt(i); } for (int i = 0; i < numObj; i += 45000) { ns = all.ElementAt(i); } int allB_count = allB.Count(); for (int i = 0; i < allB_count - 1; i++) { Assert.NotNull(allB.ElementAt(i)); } session.Commit(); session.BeginUpdate(); session.DeleteDatabase(db); session.DeleteDatabase(dbA); session.DeleteDatabase(dbB); session.Commit(); } }
[TestCase(false)] // test will fail if pessimistic locking is used public void SingleReaderSingleUpdater4(bool useReaderCommit) { using (SessionNoServer updater = new SessionNoServer(systemDir, 5000)) using (SessionNoServer reader = new SessionNoServer(systemDir, 5000)) { updater.SetTraceAllDbActivity(); reader.SetTraceAllDbActivity(); updater.BeginUpdate(); UInt32 dbNum = updater.DatabaseNumberOf(typeof(Man)); Database db = updater.OpenDatabase(dbNum, true, false); if (db != null) updater.DeleteDatabase(db); updater.Commit(); updater.BeginUpdate(); Man man = new Man(); for (int i = 0; i < 100; i++) { man = new Man(); updater.Persist(man); } updater.Commit(); reader.BeginRead(); updater.BeginUpdate(); db = reader.OpenDatabase(dbNum); foreach (Page page in db) Assert.True(page.PageInfo.VersionNumber == 1); if (useReaderCommit) reader.Commit(); if (useReaderCommit) reader.BeginRead(); else reader.ForceDatabaseCacheValidation(); for (int i = 1; i < 25; i++) { db = reader.OpenDatabase(dbNum); foreach (Page page in db) { if (page.PageNumber > 1) // skip AutoPlacemnt page { Assert.True(page.PageInfo.VersionNumber == (ulong)i); Man man2 = (Man)reader.Open(dbNum, page.PageNumber, 1, false); Man manUpdated = (Man)updater.Open(dbNum, page.PageNumber, 1, true); } } if (useReaderCommit) { reader.Commit(); reader.BeginRead(); } else reader.ForceDatabaseCacheValidation(); updater.Commit(); updater.BeginUpdate(); } Database db2 = reader.OpenDatabase(dbNum); db = updater.OpenDatabase(dbNum); for (int i = 25; i < 50; i++) { foreach (Page page in db) { if (page.PageNumber > 1) { Assert.True(page.PageInfo.VersionNumber == (ulong)i); Man manUpdated = (Man)updater.Open(dbNum, page.PageNumber, 1, true); } } updater.Commit(); updater.BeginUpdate(); db2 = reader.OpenDatabase(dbNum); foreach (Page page in db2) { if (page.PageNumber > 1) { //Assert.True(page.PageInfo.VersionNumber == (ulong)i + 1); Man man2 = (Man)reader.Open(dbNum, page.PageNumber, 1, false); } } reader.ClearPageCache(); System.GC.Collect(); } reader.Commit(); updater.Commit(); } }
public void ConcurrentUpdates(bool serverSession, int numberofThreads, bool optimisticLocking) { using (SessionBase session = new SessionNoServer(systemDir)) { session.BeginRead(); Database db = session.OpenDatabase(FixedSize.PlaceInDatabase, false, false); if (db != null) Console.WriteLine("ConcurrentUpdates start, Number of FixedSize objects: " + db.AllObjects<FixedSize>().Count); } using (SessionNoServer session = new SessionNoServer(systemDir)) { session.BeginUpdate(); FixedSize fixedSize = new FixedSize(); session.Persist(fixedSize); session.Commit(); } Thread[] threads = new Thread[numberofThreads]; for (int i = 0; i < numberofThreads; i++) threads[i] = new Thread(() => { SessionBase session; if (serverSession) session = new ServerClientSession(systemDir, null, 500, optimisticLocking); else session = new SessionNoServer(systemDir, 500, optimisticLocking); try { for (int j = 0; j < 10; j++) try { using (var transaction = session.BeginUpdate()) { session.SetTraceDbActivity(FixedSize.PlaceInDatabase); session.SetTraceDbActivity(2); Trace.Listeners.Add(new ConsoleTraceListener()); session.CrossTransactionCacheAllDatabases(); for (int k = 0; k < 4200; k++) { FixedSize fixedSize = new FixedSize(); session.Persist(fixedSize); if (k == 4000 && Thread.CurrentThread.ManagedThreadId % 3 != 0) session.FlushUpdates(); } session.Commit(); if (!serverSession) session.Compact(); Console.WriteLine("Commit OK for thread " + Thread.CurrentThread.ManagedThreadId + " Transaction: " + j); } } catch (PageUpdateLockException ex) { Console.WriteLine("Commit failed (OptimisticLockingFailed) for thread " + Thread.CurrentThread.ManagedThreadId + " Transaction: " + j); Console.WriteLine(ex.ToString()); } catch (OptimisticLockingFailed ex) { Console.WriteLine("Commit failed (OptimisticLockingFailed) for thread " + Thread.CurrentThread.ManagedThreadId + " Transaction: " + j); Console.WriteLine(ex.ToString()); } catch (Exception ex) { Console.WriteLine("Commit failed for thread " + Thread.CurrentThread.ManagedThreadId + " Transaction: " + j); Console.WriteLine(ex.ToString()); } } finally { session.Dispose(); } }); foreach (Thread thread in threads) thread.Start(); bool keepWaiting = true; while (keepWaiting) { keepWaiting = false; foreach (Thread thread in threads) if (thread.IsAlive) { keepWaiting = true; thread.Join(500); } } using (SessionBase session = new SessionNoServer(systemDir)) { session.BeginRead(); Database db = session.OpenDatabase(FixedSize.PlaceInDatabase, false, false); if (db != null) Console.WriteLine("ConcurrentUpdates finished, number of FixedSize objects: " + db.AllObjects<FixedSize>().Count); } }
public MainWindow() { const ushort btreeNodeSize = 5000; GCSettings.LatencyMode = GCLatencyMode.Batch;// try to keep the WeakIOptimizedPersistableReference objects around longer dataGridList = new List <DataGrid>(); dataTableList = new List <DataTable>(); InitializeComponent(); session = new SessionNoServer(s_systemDir); Placement placerIndexRoot = new Placement(IndexRoot.PlaceInDatabase); session.BeginUpdate(); Console.WriteLine("Running with databases in directory: " + session.SystemDirectory); File.Copy(s_licenseDbFile, Path.Combine(session.SystemDirectory, "4.odb"), true); IndexRoot indexRoot; Database db = session.OpenDatabase(IndexRoot.PlaceInDatabase, false, false); if (db == null) { session.NewDatabase(IndexRoot.PlaceInDatabase, 0, "IndexRoot"); session.NewDatabase(Lexicon.PlaceInDatabase, 0, "Lexicon"); session.NewDatabase(Document.PlaceInDatabase, 0, "Document"); session.NewDatabase(Repository.PlaceInDatabase, 0, "Repository"); session.NewDatabase(DocumentText.PlaceInDatabase, 0, "DocumentText"); session.NewDatabase(Word.PlaceInDatabase, 0, "Word"); indexRoot = new IndexRoot(btreeNodeSize, session); if (Directory.Exists(s_booksDir)) { string[] directoryTextFiles = Directory.GetFiles(s_booksDir, "*.txt"); foreach (string fileName in directoryTextFiles) { listBoxPagesToAdd.Items.Add(fileName); } } else { wordMinCt.Text = 1.ToString(); listBoxPagesToAdd.Items.Add("http://www.VelocityDB.com/"); // other database products listBoxPagesToAdd.Items.Add("https://foundationdb.com/"); listBoxPagesToAdd.Items.Add("http://www.oracle.com/us/products/database/index.html"); listBoxPagesToAdd.Items.Add("http://www-01.ibm.com/software/data/db2/"); listBoxPagesToAdd.Items.Add("http://www.versant.com/"); listBoxPagesToAdd.Items.Add("http://web.progress.com/en/objectstore/"); listBoxPagesToAdd.Items.Add("https://www.mongodb.org/"); listBoxPagesToAdd.Items.Add("http://cassandra.apache.org/"); listBoxPagesToAdd.Items.Add("http://www.sybase.com/"); listBoxPagesToAdd.Items.Add("http://www.mcobject.com/perst"); listBoxPagesToAdd.Items.Add("http://www.marklogic.com/what-is-marklogic/"); listBoxPagesToAdd.Items.Add("http://hamsterdb.com/"); listBoxPagesToAdd.Items.Add("http://www.firebirdsql.org/"); listBoxPagesToAdd.Items.Add("http://www.h2database.com/"); listBoxPagesToAdd.Items.Add("http://www.oracle.com/technology/products/berkeley-db"); listBoxPagesToAdd.Items.Add("http://www.scimore.com/"); listBoxPagesToAdd.Items.Add("http://www.stsdb.com/"); listBoxPagesToAdd.Items.Add("http://www.sqlite.org/about.html"); listBoxPagesToAdd.Items.Add("http://www.mysql.com/products/enterprise/techspec.html"); listBoxPagesToAdd.Items.Add("http://www.objectivity.com"); listBoxPagesToAdd.Items.Add("http://vistadb.net/"); listBoxPagesToAdd.Items.Add("http://www.google.com/search?q=object+database&sourceid=ie7&rls=com.microsoft:en-us:IE-SearchBox&ie=&oe="); } indexRoot.Persist(session, indexRoot); } else { indexRoot = (IndexRoot)session.Open(Oid.Encode(IndexRoot.PlaceInDatabase, 1, 1)); } if (indexRoot.repository.documentSet.Count > 0) { List <Document> docs = indexRoot.repository.documentSet.ToList <Document>().Take(50).ToList <Document>(); inDbListBox.ItemsSource = docs; } updateDataGrids(indexRoot); session.Commit(); //verify(); }
static void Main(string[] args) { long triangles = 0; try { using (SessionNoServer session = new SessionNoServer(systemDir)) { int numberOfWorkerThreads = -1; if (args.Length > 0) { if (!int.TryParse(args[0], out numberOfWorkerThreads)) { Console.WriteLine("First parameter is numberOfWorkerThreads which must be an Int32"); } } bool useLinq = args.Length > 1; Placement btreePlace = new Placement(40, 1, 1, 10000, 65500, true); Placement edgeInfoPlace = new Placement(40, 10000, 1, 10000, 65500, true); session.BeginUpdate(); BTreeMap <int, int[]> edges; BTreeMapIterator <int, int[]> edgesItr; int[] edge = null; Database edgeDb = session.OpenDatabase(40, false, false); if (edgeDb != null) { session.Commit(); session.BeginRead(); edges = (BTreeMap <int, int[]>)session.Open(40, 1, 1, false); } else { DatabaseLocation location = session.DatabaseLocations.Default(); //location.CompressPages = false; // no compression should make it faster (?) session.NewDatabase(40, 395, "Edges"); edges = new BTreeMap <int, int[]>(null, session, 6000); edges.Persist(btreePlace, session, true); edgesItr = edges.Iterator(); using (StreamReader stream = new StreamReader(edgesInputFile, true)) { int a; int b; string line; string[] fields; while ((line = stream.ReadLine()) != null) { fields = line.Split(' '); if (!int.TryParse(fields[0], out a)) { break; } b = int.Parse(fields[1]); if (a != b) { if (edgesItr.CurrentKey() == a || edgesItr.GoTo(a)) { edge = edgesItr.CurrentValue(); Array.Resize(ref edge, edge.Length + 1); edge[edge.Length - 1] = b; edgesItr.ReplaceValue(ref edge); // we need to update the value in the BTreeMap } else { edge = new int[1]; edge[0] = b; edges.Add(a, edge); } } } } edgesItr = edges.Iterator(); while (edgesItr.MoveNext()) { edge = edgesItr.CurrentValue(); Array.Sort(edge); edgesItr.ReplaceValue(ref edge); } session.Commit(); session.BeginRead(); } Console.WriteLine("Number of Nodes found: " + edges.Count); if (useLinq) { Console.WriteLine("Query using LINQ"); } if (numberOfWorkerThreads > 0) { Console.WriteLine("Start of triangle discovery using " + numberOfWorkerThreads + " threads, time is " + DateTime.Now); } else if (numberOfWorkerThreads < 0) { Console.WriteLine("Start of triangle discovery using system automatically selected number of threads, time is " + DateTime.Now); } else { Console.WriteLine("Start of triangle discovery using main thread, time is " + DateTime.Now); } // Start counting triangles ! if (numberOfWorkerThreads != 0) { if (useLinq) { // Please help, I have not figured out how to properly do the triangle query using LINQ int[] edge2values = null; if (numberOfWorkerThreads > 0) { triangles = (from KeyValuePair <int, int[]> edgeFrom in edges from int edgeTo1 in edgeFrom.Value where edgeFrom.Key < edgeTo1 from int edgeTo2 in edgeFrom.Value where edgeFrom.Key < edgeTo2 && edgeTo2 > edgeTo1 && edges.TryGetValue(edgeTo1, out edge2values) && Array.BinarySearch(edge2values, edgeTo2) >= 0 select edge).AsParallel().WithDegreeOfParallelism(numberOfWorkerThreads).Count(); } else { triangles = (from KeyValuePair <int, int[]> edgeFrom in edges from int edgeTo1 in edgeFrom.Value where edgeFrom.Key < edgeTo1 from int edgeTo2 in edgeFrom.Value where edgeFrom.Key <edgeTo2 && edgeTo2> edgeTo1 && edges.TryGetValue(edgeTo1, out edge2values) && Array.BinarySearch(edge2values, edgeTo2) >= 0 select edge).AsParallel().Count(); } } else { edgesItr = edges.Iterator(); ParallelOptions pOptions = new ParallelOptions(); pOptions.MaxDegreeOfParallelism = numberOfWorkerThreads; // First type parameter is the type of the source elements // Second type parameter is the type of the local data (subtotal) Parallel.ForEach <KeyValuePair <int, int[]>, long>(edges, // source collection pOptions, () => 0, // method to initialize the local variable (pair, loop, subtotal) => // method invoked by the loop on each iteration { int nodeId = pair.Key; int[] nodeTo = pair.Value; int stop = nodeTo.Length - 1; int i = stop; int edgeToStart, edgeTo; int pos; while (i >= 0) { int[] edgeInfo2; edgeToStart = nodeTo[i--]; if (nodeId < edgeToStart) { if (edges.TryGetValue(edgeToStart, out edgeInfo2)) { for (int j = stop; j >= i; j--) { edgeTo = nodeTo[j]; if (edgeToStart < edgeTo) { pos = Array.BinarySearch <int>(edgeInfo2, edgeTo); if (pos >= 0) { // we know this one is connected to edgeInfo.From because it is part of edgeInfo.To subtotal++; } } else { break; } } } } else { break; } } return(subtotal); }, // Method to be executed when all loops have completed. // finalResult is the final value of subtotal. supplied by the ForEach method. (finalResult) => Interlocked.Add(ref triangles, finalResult)); } } else if (useLinq) { triangles = queryUsingLINQ(edges); } else { triangles = discoverTrianglesSingleCore(edges); } session.Commit(); } Console.WriteLine("Number of Triangles found: " + triangles); } catch (Exception e) { System.Console.WriteLine(e); } }
static void Main(string[] args) { long triangles = 0; try { using (SessionNoServer session = new SessionNoServer(systemDir)) { int numberOfWorkerThreads = -1; if (args.Length > 0) { if (!int.TryParse(args[0], out numberOfWorkerThreads)) Console.WriteLine("First parameter is numberOfWorkerThreads which must be an Int32"); } bool useLinq = args.Length > 1; Placement btreePlace = new Placement(40, 1, 1, 10000, 65500, true); Placement edgeInfoPlace = new Placement(40, 10000, 1, 10000, 65500, true); session.BeginUpdate(); BTreeMap<int, int[]> edges; BTreeMapIterator<int, int[]> edgesItr; int[] edge = null; Database edgeDb = session.OpenDatabase(40, false, false); if (edgeDb != null) { session.Commit(); session.BeginRead(); edges = (BTreeMap<int, int[]>)session.Open(40, 1, 1, false); } else { DatabaseLocation location = session.DatabaseLocations.Default(); //location.CompressPages = false; // no compression should make it faster (?) session.NewDatabase(40, 395, "Edges"); edges = new BTreeMap<int, int[]>(null, session, 6000); edges.Persist(btreePlace, session, true); edgesItr = edges.Iterator(); using (StreamReader stream = new StreamReader(edgesInputFile, true)) { int a; int b; string line; string[] fields; while ((line = stream.ReadLine()) != null) { fields = line.Split(' '); if (!int.TryParse(fields[0], out a)) break; b = int.Parse(fields[1]); if (a != b) { if (edgesItr.CurrentKey() == a || edgesItr.GoTo(a)) { edge = edgesItr.CurrentValue(); Array.Resize(ref edge, edge.Length + 1); edge[edge.Length - 1] = b; edgesItr.ReplaceValue(ref edge); // we need to update the value in the BTreeMap } else { edge = new int[1]; edge[0] = b; edges.Add(a, edge); } } } } edgesItr = edges.Iterator(); while (edgesItr.MoveNext()) { edge = edgesItr.CurrentValue(); Array.Sort(edge); edgesItr.ReplaceValue(ref edge); } session.Commit(); session.BeginRead(); } Console.WriteLine("Number of Nodes found: " + edges.Count); if (useLinq) Console.WriteLine("Query using LINQ"); if (numberOfWorkerThreads > 0) Console.WriteLine("Start of triangle discovery using " + numberOfWorkerThreads + " threads, time is " + DateTime.Now); else if (numberOfWorkerThreads < 0) Console.WriteLine("Start of triangle discovery using system automatically selected number of threads, time is " + DateTime.Now); else Console.WriteLine("Start of triangle discovery using main thread, time is " + DateTime.Now); // Start counting triangles ! if (numberOfWorkerThreads != 0) { if (useLinq) { // Please help, I have not figured out how to properly do the triangle query using LINQ int[] edge2values = null; if (numberOfWorkerThreads > 0) triangles = (from KeyValuePair<int, int[]> edgeFrom in edges from int edgeTo1 in edgeFrom.Value where edgeFrom.Key < edgeTo1 from int edgeTo2 in edgeFrom.Value where edgeFrom.Key < edgeTo2 && edgeTo2 > edgeTo1 && edges.TryGetValue(edgeTo1, out edge2values) && Array.BinarySearch(edge2values, edgeTo2) >= 0 select edge).AsParallel().WithDegreeOfParallelism(numberOfWorkerThreads).Count(); else triangles = (from KeyValuePair<int, int[]> edgeFrom in edges from int edgeTo1 in edgeFrom.Value where edgeFrom.Key < edgeTo1 from int edgeTo2 in edgeFrom.Value where edgeFrom.Key < edgeTo2 && edgeTo2 > edgeTo1 && edges.TryGetValue(edgeTo1, out edge2values) && Array.BinarySearch(edge2values, edgeTo2) >= 0 select edge).AsParallel().Count(); } else { edgesItr = edges.Iterator(); ParallelOptions pOptions = new ParallelOptions(); pOptions.MaxDegreeOfParallelism = numberOfWorkerThreads; // First type parameter is the type of the source elements // Second type parameter is the type of the local data (subtotal) Parallel.ForEach<KeyValuePair<int, int[]>, long>(edges, // source collection pOptions, () => 0, // method to initialize the local variable (pair, loop, subtotal) => // method invoked by the loop on each iteration { int nodeId = pair.Key; int[] nodeTo = pair.Value; int stop = nodeTo.Length - 1; int i = stop; int edgeToStart, edgeTo; int pos; while (i >= 0) { int[] edgeInfo2; edgeToStart = nodeTo[i--]; if (nodeId < edgeToStart) { if (edges.TryGetValue(edgeToStart, out edgeInfo2)) { for (int j = stop; j >= i; j--) { edgeTo = nodeTo[j]; if (edgeToStart < edgeTo) { pos = Array.BinarySearch<int>(edgeInfo2, edgeTo); if (pos >= 0) { // we know this one is connected to edgeInfo.From because it is part of edgeInfo.To subtotal++; } } else break; } } } else break; } return subtotal; }, // Method to be executed when all loops have completed. // finalResult is the final value of subtotal. supplied by the ForEach method. (finalResult) => Interlocked.Add(ref triangles, finalResult)); } } else if (useLinq) triangles = queryUsingLINQ(edges); else triangles = discoverTrianglesSingleCore(edges); session.Commit(); } Console.WriteLine("Number of Triangles found: " + triangles); } catch (Exception e) { System.Console.WriteLine(e); } }