コード例 #1
0
        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;
        }
コード例 #2
0
        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;
        }
コード例 #3
0
ファイル: Program.cs プロジェクト: kahinke/PingApp
        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;
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: kahinke/PingApp
        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;
        }