/// <summary> /// Creates the learn log entry. /// </summary> /// <param name="learnLogStruct">The learn log struct.</param> /// <param name="parent">The parent.</param> /// <remarks>Documented by Dev08, 2008-09-05</remarks> public static void CreateLearnLogEntry(LearnLogStruct learnLogStruct, ParentClass parent) { if (lastSessionId < 0) //Only write if there is a valid userSession { return; } if (parent.CurrentUser.ConnectionString.Typ == DatabaseType.Xml) { return; } else { try { lock (logQueue) { logQueue.Enqueue(learnLogStruct); Monitor.Pulse(logQueue); } } catch (Exception ex) { Trace.WriteLine("Error writing log: " + ex.Message); } } }
/// <summary> /// Creates the learn log entry. /// </summary> /// <param name="learnLog">The learn log.</param> /// <remarks>Documented by Dev10, 2009-01-11</remarks> public void CreateLearnLogEntry(LearnLogStruct learnLog) { bool answeredCardCorrect = false; if (learnLog.MoveType != MoveType.Manual) { if (learnLog.NewBox > 1) { answeredCardCorrect = true; } } using (SqlCeCommand cmd = MSSQLCEConn.CreateCommand(Parent.CurrentUser)) { cmd.CommandText = "INSERT INTO LearnLog (session_id, user_id, lm_id, cards_id, old_box, new_box, timestamp, duration, learn_mode, move_type, answer, direction, case_sensitive, correct_on_the_fly, percentage_known, percentage_required) "; cmd.CommandText += "VALUES(@sid, @uid, @lmid, @cid, @obox, @nbox, @ts, @dur, @lmode, @mtype, @answ, @dir, @csen, @cotf, @pknown, @preq); "; if (learnLog.MoveType != MoveType.Manual && answeredCardCorrect) { cmd.CommandText += "UPDATE LearningSessions SET sum_right=sum_right + 1 WHERE id=@sid AND user_id=@uid AND lm_id=@lmid; "; } else if (learnLog.MoveType != MoveType.Manual && !answeredCardCorrect) { cmd.CommandText += "UPDATE LearningSessions SET sum_wrong=sum_wrong + 1 WHERE id=@sid AND user_id=@uid AND lm_id=@lmid; "; } string newBoxContent = string.Empty; string oldBoxContent = string.Empty; if (learnLog.NewBox.Value > 0) { newBoxContent = "box" + learnLog.NewBox.Value.ToString() + "_content"; } else { newBoxContent = "pool_content"; } if (learnLog.OldBox.Value > 0) { oldBoxContent = "box" + learnLog.OldBox.Value.ToString() + "_content"; } else { oldBoxContent = "pool_content"; } if (learnLog.NewBox.Value != learnLog.OldBox.Value) { cmd.CommandText += "UPDATE LearningSessions SET " + newBoxContent + "=" + newBoxContent + " + 1, " + oldBoxContent + "=" + oldBoxContent + " - 1 WHERE id=@sid AND user_id=@uid AND lm_id=@lmid; "; } cmd.Parameters.Add("@sid", learnLog.SessionID.Value); cmd.Parameters.Add("@uid", Parent.CurrentUser.Id); cmd.Parameters.Add("@lmid", Parent.CurrentUser.ConnectionString.LmId); cmd.Parameters.Add("@cid", learnLog.CardsID.Value); cmd.Parameters.Add("@obox", learnLog.OldBox.Value); cmd.Parameters.Add("@nbox", learnLog.NewBox.Value); cmd.Parameters.Add("@ts", learnLog.TimeStamp.Value); cmd.Parameters.Add("@dur", learnLog.Duration.Value); cmd.Parameters.Add("@lmode", learnLog.LearnMode.Value.ToString()); cmd.Parameters.Add("@mtype", learnLog.MoveType.Value.ToString()); cmd.Parameters.Add("@answ", learnLog.Answer); cmd.Parameters.Add("@dir", learnLog.Direction.Value.ToString()); cmd.Parameters.Add("@csen", learnLog.CaseSensitive); cmd.Parameters.Add("@cotf", learnLog.CorrectOnTheFly); cmd.Parameters.Add("@pknown", learnLog.PercentageKnown); cmd.Parameters.Add("@preq", learnLog.PercentageRequired); MSSQLCEConn.ExecuteNonQuery(cmd); } //delete caches Parent.CurrentUser.Cache.Uncache(ObjectLifetimeIdentifier.GetIdentifier(CacheObject.StatisticWrongCards, learnLog.SessionID.Value)); Parent.CurrentUser.Cache.Uncache(ObjectLifetimeIdentifier.GetIdentifier(CacheObject.StatisticCorrectCards, learnLog.SessionID.Value)); Parent.CurrentUser.Cache.Uncache(ObjectLifetimeIdentifier.GetIdentifier(CacheObject.StatisticContentOfBoxes, learnLog.SessionID.Value)); }
public void IStatisticsLogAndSessionTest() { TestInfrastructure.DebugLineStart(TestContext); if (TestInfrastructure.IsActive(TestContext)) { using (IDictionary target = TestInfrastructure.GetLMConnection(TestContext, TestInfrastructure.GetAdminUser)) //Learning { if (target.Parent.CurrentUser.ConnectionString.Typ == DatabaseType.Xml) { return; } ICardsTests.FillDummyDic(target); Log.OpenUserSession(target.Id, target.Parent); for (int i = 0; i < 10; i++) { LearnLogStruct lls = new LearnLogStruct(); lls.SessionID = Log.LastSessionID; lls.CardsID = target.Cards.Cards[i].Id; lls.Answer = "testAnswer " + i; lls.CaseSensitive = i % 2 == 0 ? true : false; lls.CorrectOnTheFly = i % 2 == 0 ? true : false; lls.Direction = EQueryDirection.Mixed; lls.Duration = new TimeSpan(0, 0, 50).Ticks; lls.LearnMode = EQueryType.Word; lls.MoveType = i % 4 == 0 ? MoveType.AutoPromote : MoveType.AutoDemote; if (lls.MoveType == MoveType.AutoPromote) //promote { if (target.Cards.Cards[i].Box == 10) { lls.NewBox = 10; } else if (target.Cards.Cards[i].Box == 0) { lls.NewBox = 2; } else { lls.NewBox = target.Cards.Cards[i].Box + 1; } } else //demote { lls.NewBox = 1; } lls.OldBox = target.Cards.Cards[i].Box; lls.PercentageKnown = 100; lls.PercentageRequired = 50; lls.TimeStamp = DateTime.Now; Thread.Sleep(100); Log.CreateLearnLogEntry(lls, target.Parent); } Log.CloseUserSession(target.Parent); Thread.Sleep(250); Assert.AreEqual(1, target.Statistics.Count, "Dictionary.Statistics should contain ONE entry"); Assert.AreEqual(3, target.Statistics[0].Right, "Dictionary.Statistics[0].Right should contain the number 3."); Assert.AreEqual(7, target.Statistics[0].Wrong, "Dictionary.Statistics[0].Wrong should contain the number 7."); } } }
/// <summary> /// Creates a learn log entry. /// </summary> /// <param name="learnLog">A learn log struct.</param> /// <remarks>Documented by Dev08, 2008-09-05</remarks> public void CreateLearnLogEntry(LearnLogStruct learnLog) { bool answeredCardCorrect = false; if (learnLog.MoveType != MoveType.Manual) { if (learnLog.NewBox > 1) { answeredCardCorrect = true; } } using (NpgsqlConnection con = PostgreSQLConn.CreateConnection(Parent.CurrentUser)) { using (NpgsqlCommand cmd = con.CreateCommand()) { cmd.CommandText = "INSERT INTO \"LearnLog\" (session_id, user_id, lm_id, cards_id, old_box, new_box, timestamp, duration, learn_mode, move_type, answer, direction, case_sensitive, correct_on_the_fly, percentage_known, percentage_required) "; cmd.CommandText += " VALUES(:sid, :uid, :lmid, :cid, :obox, :nbox, :ts, :dur, :lmode, :mtype, :answ, :dir, :csen, :cotf, :pknown, :preq); "; if (learnLog.MoveType != MoveType.Manual && answeredCardCorrect) { cmd.CommandText += "UPDATE \"LearningSessions\" SET sum_right=sum_right + 1 WHERE id=:sid AND user_id=:uid AND lm_id=:lmid; "; } else if (learnLog.MoveType != MoveType.Manual && !answeredCardCorrect) { cmd.CommandText += "UPDATE \"LearningSessions\" SET sum_wrong=sum_wrong + 1 WHERE id=:sid AND user_id=:uid AND lm_id=:lmid; "; } string newBoxContent = string.Empty; string oldBoxContent = string.Empty; if (learnLog.NewBox.Value > 0) { newBoxContent = "box" + learnLog.NewBox.Value.ToString() + "_content"; } else { newBoxContent = "pool_content"; } if (learnLog.OldBox.Value > 0) { oldBoxContent = "box" + learnLog.OldBox.Value.ToString() + "_content"; } else { oldBoxContent = "pool_content"; } if (learnLog.NewBox.Value != learnLog.OldBox.Value) { cmd.CommandText += "UPDATE \"LearningSessions\" SET " + newBoxContent + "=" + newBoxContent + " + 1, " + oldBoxContent + "=" + oldBoxContent + " - 1 WHERE id=:sid AND user_id=:uid AND lm_id=:lmid; "; } cmd.Parameters.Add("sid", learnLog.SessionID.Value); cmd.Parameters.Add("uid", Parent.CurrentUser.Id); cmd.Parameters.Add("lmid", Parent.CurrentUser.ConnectionString.LmId); cmd.Parameters.Add("cid", learnLog.CardsID.Value); cmd.Parameters.Add("obox", learnLog.OldBox.Value); cmd.Parameters.Add("nbox", learnLog.NewBox.Value); cmd.Parameters.Add("ts", (NpgsqlTypes.NpgsqlTimeStamp)learnLog.TimeStamp.Value); cmd.Parameters.Add("dur", learnLog.Duration.Value); cmd.Parameters.Add("lmode", learnLog.LearnMode.Value.ToString()); cmd.Parameters.Add("mtype", learnLog.MoveType.Value.ToString()); cmd.Parameters.Add("answ", learnLog.Answer); cmd.Parameters.Add("dir", learnLog.Direction.Value.ToString()); cmd.Parameters.Add("csen", learnLog.CaseSensitive); cmd.Parameters.Add("cotf", learnLog.CorrectOnTheFly); cmd.Parameters.Add("pknown", learnLog.PercentageKnown); cmd.Parameters.Add("preq", learnLog.PercentageRequired); PostgreSQLConn.ExecuteNonQuery(cmd, Parent.CurrentUser); } } }