public AppUpdateQuery RetrieveByApp(AppUpdateQuery query) { List<IMongoQuery> mongoQueries = new List<IMongoQuery>(); mongoQueries.Add(Query.EQ("app", query.App)); mongoQueries.Add(Query.LTE("time", query.LatestTime)); if (query.EarliestTime.HasValue) { mongoQueries.Add(Query.GTE("time", query.EarliestTime)); } AppUpdate[] result = appUpdates.Find(Query.And(mongoQueries.ToArray())).ToArray(); query.Fill(result); return query; }
public AppUpdateQuery RetrieveByApp(AppUpdateQuery query) { MySqlCommand command = connection.CreateCommand(); command.CommandText = "select * from AppUpdate where App = ?App and Time <= ?LatestTime"; command.Parameters.AddWithValue("?App", query.App); command.Parameters.AddWithValue("?LatestTime", query.LatestTime); if (query.EarliestTime.HasValue) { command.CommandText += " and Time >= ?EarliestTime"; command.Parameters.AddWithValue("?EarliestTime", query.EarliestTime); } command.CommandText += ";"; List<AppUpdate> result = new List<AppUpdate>(); using (IDataReader reader = command.ExecuteReader()) { while (reader.Read()) { AppUpdate update = reader.ToAppUpdate(); result.Add(update); } } query.Fill(result); return query; }
private static AppUpdate GetLastValidUpdate(App app) { AppUpdateQuery query = new AppUpdateQuery() { App = app.Id, LatestTime = DateTime.Now }; query = repository.AppUpdate.RetrieveByApp(query); ICollection<AppUpdate> updates = query.Result; // 当第一次加入应用时,App的最后更新类型为New,这是为了显示效果,但时间是AddToPing的时间,为了排序效果 if (app.Brief.LastValidUpdate.Type == AppUpdateType.New) { AppUpdate update = updates.First(u => u.Type == AppUpdateType.AddToPing); return update; } // AppStore曾经将价格从美元改为人民币,后续部分应用没有更新过直接下架了,这部分应用的最后更新在AppUpdate表中是找不到的 // 这种情况下,找最后一个有意义的更新(不是New也不是Revoke的) if (app.Brief.LastValidUpdate.Type == AppUpdateType.PriceIncrease) { float oldPrice = Single.Parse(app.Brief.LastValidUpdate.OldValue); float newPrice = Single.Parse(app.Brief.LastValidUpdate.NewValue); // 价格从小数变成整数是换了货币单位 if ((int)oldPrice != oldPrice && (int)newPrice == newPrice) { AppUpdate update = updates.First(u => u.Type != AppUpdateType.New && u.Type != AppUpdateType.Revoke); return update; } } AppUpdate candidate = updates.FirstOrDefault( u => u.Time.ToUniversalTime() == app.Brief.LastValidUpdate.Time.ToUniversalTime()); // 部分重新上架的应用有丢失最后一次更新的AppUpdate信息 if (candidate == null) { // 找到最后一次有效的更新,如果这次更新比App自带的更早,则把App自带的那个放到AppUpdate中去沿用 AppUpdate lastValidUpdate = updates.First(u => AppUpdate.IsValidUpdate(u.Type)); if (app.Brief.LastValidUpdate.Time.ToUniversalTime() > lastValidUpdate.Time.ToUniversalTime()) { repository.AppUpdate.Save((app.Brief.LastValidUpdate)); Console.WriteLine(app.Brief.LastValidUpdate.Id); candidate = app.Brief.LastValidUpdate; } } return candidate; }
private static AppUpdate GetRevokeUpdate(int app) { AppUpdateQuery query = new AppUpdateQuery() { App = app, LatestTime = DateTime.Now }; query = repository.AppUpdate.RetrieveByApp(query); AppUpdate update = query.Result.First(u => u.Type == AppUpdateType.Revoke); return update; }