/// <summary> /// LevelTop只能有一个 /// </summary> /// <param name="flight"></param> /// <param name="collection"></param> /// <returns></returns> public LevelTopFlightRecord FromLevel1RecordCollectionToLevelTopRecords( Flight flight, MongoCollection<Level1FlightRecord> collection) { FlightParameter[] parameters = this.GetParameters(); Dictionary<string, LevelTopFlightRecord> topRecordMaps = new Dictionary<string, LevelTopFlightRecord>(); Dictionary<LevelTopFlightRecord, List<Level2FlightRecord>> level2RecordMap = new Dictionary<LevelTopFlightRecord, List<Level2FlightRecord>>(); List<LevelTopFlightRecord> topRecords = new List<LevelTopFlightRecord>(); foreach (FlightParameter para in parameters) { LevelTopFlightRecord topRecord = new LevelTopFlightRecord() { StartSecond = flight.StartSecond, EndSecond = flight.EndSecond, ParameterID = para.ParameterID, }; topRecordMaps.Add(para.ParameterID, topRecord); level2RecordMap.Add(topRecord, new List<Level2FlightRecord>()); for (int currentSecond = flight.StartSecond; currentSecond > flight.EndSecond; currentSecond += SecondGap) { int step = SecondGap; Level2FlightRecord level2 = this.HandleOneStep(currentSecond, step, para, topRecord, flight, collection); level2RecordMap[topRecord].Add(level2); } } return null;//DEBUG //return topRecords.ToArray(); }
internal string AddFlightRawDataRelationPoints(Flight flight, List<FlightRawDataRelationPoint> flightRawDataRelationPoints) { using (AircraftMongoDbDal dal = new AircraftMongoDbDal()) { MongoServer mongoServer = dal.GetMongoServer(); //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常 try {//此方法操作的记录为跟架次密切相关,但肯定LevelTopRecord需要包含趋势分析等信息, //建议不要分表,存放在Common里面 MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel); if (database != null) { MongoCollection<FlightDataEntities.FlightRawDataRelationPoint> modelCollection1 = dal.GetFlightRawDataRelationPointMongoCollectionByFlight(database, flight); //IMongoQuery q1 = Query.EQ("FlightID", new MongoDB.Bson.BsonString(flight.FlightID)); //modelCollection1.Remove(q1); modelCollection1.InsertBatch(flightRawDataRelationPoints); } } catch (Exception e) { LogHelper.Error("AddOrReplaceFlightRawDataRelationPoints", e); return e.Message; } } return string.Empty; }
private Level2FlightRecord HandleOneStep(int currentSecond, int step, FlightParameter para, LevelTopFlightRecord topRecord, Flight flight, MongoCollection<Level1FlightRecord> collection) { IMongoQuery query = Query.And(Query.EQ("ParameterID", new BsonString(para.ParameterID)), Query.GTE("FlightSecond", new BsonInt32(currentSecond)), Query.LT("FlightSecond", new BsonInt32(currentSecond + step))); MongoCursor<Level1FlightRecord> flightRecord = collection.Find(query); Level2FlightRecord level2 = new Level2FlightRecord() { StartSecond = currentSecond, EndSecond = Math.Min(flight.EndSecond, currentSecond + step), // Level1FlightRecords = flightRecord.ToArray(), ParameterID = para.ParameterID, }; //var sum = from one in level2.Level1FlightRecords // select one.ValueCount; //level2.Count = sum.Sum(); //var avg = from one in level2.Level1FlightRecords // select one.AvgValue; //level2.AvgValue = avg.Sum() * level2.Count; //var min = from one in level2.Level1FlightRecords // select one.MinValue; //level2.MinValue = min.Min(); //var max = from one in level2.Level1FlightRecords // select one.MaxValue; //level2.MaxValue = max.Max(); return level2; }
public string AddFlightConditionDecisionRecordsBatch(Flight flight, FlightDataEntities.Decisions.DecisionRecord[] records) { try { LogHelper.Info("DataInputService.AddFlightConditionDecisionRecordsBatch Requested.", null); DataInputServiceBll bll = new DataInputServiceBll(); return bll.AddFlightConditionDecisionRecordsBatch(flight, records); } catch (Exception ex) { LogHelper.Error("AddFlightConditionDecisionRecordsBatch", ex); return ex.Message; } }
public string AddFlightRawDataRelationPoints(Flight flight, List<FlightRawDataRelationPoint> flightRawDataRelationPoints) { try { LogHelper.Info("DataInputService.AddOrReplaceFlightRawDataRelationPoints Requested.", null); DataInputServiceBll bll = new DataInputServiceBll(); return bll.AddFlightRawDataRelationPoints(flight, flightRawDataRelationPoints); } catch (Exception ex) { LogHelper.Error("AddOrReplaceFlightRawDataRelationPoints", ex); return ex.Message; } }
public KeyValuePair<string, FlightDataEntities.FlightRawData[]>[] GetFlightData(Flight flight, string[] parameterIds, int startSecond, int endSecond) { try { LogHelper.Info("AircraftService.GetFlightData Requested.", null); AircraftServiceBll bll = new AircraftServiceBll(); return bll.GetFlightData(flight, parameterIds, startSecond, endSecond); } catch (Exception e) { LogHelper.Error("AircraftService.GetFlightData", e); return null; } }
/// <summary> /// 根据FlightID插入或更新一个架次信息,插入的是实体,使用Common库 /// </summary> /// <param name="flight"></param> /// <param name="flightResult">flightResult才是真正要返回的结果,因为flight如果是需要新增的,则不会有MongoDB需要的ObjectId</param> /// <param name="modelCollection"></param> /// <returns></returns> private static Flight InsertOrUpdateByFlightID( FlightDataEntities.Flight flight, Flight flightResult, MongoCollection<Flight> modelCollection) { try { IMongoQuery q1 = Query.EQ("FlightID", new MongoDB.Bson.BsonString(flight.FlightID)); var cursor = modelCollection.Find(q1); //第一次查询,是判断是否需要UPDATE if (cursor != null && cursor.Count() > 0) { foreach (var value in cursor.AsEnumerable()) { value.FlightName = flight.FlightName; value.Aircraft = flight.Aircraft; value.EndSecond = flight.EndSecond; value.StartSecond = flight.StartSecond; value.FlightDate = flight.FlightDate; modelCollection.Save(value); flightResult = value; } } else {//如果INSERT,就必须插入之后才有ObjectId,需要返回带有ObjectId的对象(不单单只考虑WCF返回没带有ObjectId的情况) modelCollection.Insert(flight); var cursor2 = modelCollection.Find(q1); if (cursor2 != null && cursor2.Count() > 0) { flightResult = cursor2.First(); } else flightResult = null; } } catch (Exception e) { LogHelper.Error("InsertOrUpdateByFlightID", e); flightResult = null; } return flightResult; }
internal KeyValuePair<string, FlightRawData[]>[] GetFlightData( Flight flight, string[] parameterIds, int startSecond, int endSecond) { if (flight == null || string.IsNullOrEmpty(flight.FlightID) || flight.Aircraft == null || flight.Aircraft.AircraftModel == null || string.IsNullOrEmpty(flight.Aircraft.AircraftModel.ModelName)) { LogHelper.Warn("Flight或Aircraft信息不正确(GetFlightData)。", null); return null; } if (startSecond == flight.StartSecond && endSecond == flight.EndSecond) {//应该取最顶层数据,暂时未实现此Return } using (AircraftMongoDbDal dal = new AircraftMongoDbDal()) { MongoServer mongoServer = dal.GetMongoServer(); //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常 try {//此方法操作的记录为跟架次密切相关,需要拆分存储的记录,最好在DAL里面去处理表名构建逻辑 MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel); if (database != null) { var cursor = FindMongoDBCursor(flight, parameterIds, startSecond, endSecond, dal, database); //var queryable = cursor.AsQueryable(); //转换成RawData记录 var result = TransformToFlightRawData(parameterIds, cursor); return result.ToArray(); } } catch (Exception e) { LogHelper.Error("GetFlightData", e); } } return null; }
/// <summary> /// 删除一个架次相关记录,这是记录,需要重新定位数据库和Collection /// </summary> /// <param name="mongoServer"></param> /// <param name="flight"></param> private void RemoveRelatedRecords(MongoServer mongoServer, Flight flight, AircraftMongoDbDal dal, IMongoQuery flightIdQuery) {//TODO: try {//此方法操作的记录为跟架次密切相关,需要拆分存储的记录,最好在DAL里面去处理表名构建逻辑 MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel); if (database != null) { //删除判据记录 MongoCollection<FlightDataEntities.Decisions.DecisionRecord> modelCollection = dal.GetDecisionRecordMongoCollectionByFlight(database, flight); modelCollection.Remove(flightIdQuery); //删除Level1记录 MongoCollection<FlightDataEntities.Level1FlightRecord> modelCollection1 = dal.GetLevel1FlightRecordMongoCollectionByFlight(database, flight); modelCollection1.Remove(flightIdQuery); //删除LevelTop记录 MongoCollection<FlightDataEntities.LevelTopFlightRecord> modelCollection2 = dal.GetLevelTopFlightRecordMongoCollectionByFlight(database, flight); modelCollection2.Remove(flightIdQuery); //删除FlightRawDataRelationPoint记录 MongoCollection<FlightDataEntities.FlightRawDataRelationPoint> modelCollection3 = dal.GetFlightRawDataRelationPointMongoCollectionByFlight(database, flight); modelCollection3.Remove(flightIdQuery); //删除FlightConditionDecisionRecord记录 MongoCollection<FlightDataEntities.Decisions.DecisionRecord> modelCollection4 = dal.GetFlightConditionDecisionRecordMongoCollectionByFlight(database, flight); modelCollection4.Remove(flightIdQuery); //删除FlightRawDataRelationPoint记录 MongoCollection<FlightDataEntities.ExtremumPointInfo> modelCollection5 = dal.GetFlightExtremeMongoCollectionByFlight(database, flight); modelCollection5.Remove(flightIdQuery); //删除FlightExtreme记录 MongoCollection<FlightDataEntities.ExtremumPointInfo> modelCollection6 = dal.GetFlightExtremeMongoCollectionByFlight(database, flight); modelCollection6.Remove(flightIdQuery); } } catch (Exception e) { LogHelper.Error("RemoveRelatedRecords", e); } }
internal string AddLevelTopFlightRecords(Flight flight, LevelTopFlightRecord[] topRecords) { using (AircraftMongoDbDal dal = new AircraftMongoDbDal()) { MongoServer mongoServer = dal.GetMongoServer(); //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常 try {//此方法操作的记录为跟架次密切相关,但肯定LevelTopRecord需要包含趋势分析等信息, //建议不要分表,存放在Common里面 MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel); if (database != null) { MongoCollection<FlightDataEntities.LevelTopFlightRecord> modelCollection1 = dal.GetLevelTopFlightRecordMongoCollectionByFlight(database, flight); modelCollection1.InsertBatch(topRecords); //MongoCollection<FlightDataEntities.Level2FlightRecord> modelCollection2 // = dal.GetLevel2FlightRecordMongoCollectionByFlight(database, flight); //modelCollection2.InsertBatch(level2Records); } } catch (Exception e) { LogHelper.Error("AddLevelTopFlightRecords", e); return e.Message; } } return string.Empty; }
internal MongoCollection<Level2FlightRecord> GetLevel2FlightRecordMongoCollectionByFlight(MongoDatabase database, Flight flight) { return database.GetCollection<Level2FlightRecord>( AircraftMongoDb.COLLECTION_FLIGHT_RECORD_LEVELTOP + "_" + flight.FlightID); }
internal string DeleteFlight(Flight flight) { using (AircraftMongoDbDal dal = new AircraftMongoDbDal()) { MongoServer mongoServer = dal.GetMongoServer(); //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常 try { MongoDatabase database = mongoServer.GetDatabase(AircraftMongoDb.DATABASE_COMMON); if (database != null) { MongoCollection<Flight> modelCollection = database.GetCollection<Flight>(AircraftMongoDb.COLLECTION_FLIGHT); ////删除架次 IMongoQuery q1 = Query.EQ("FlightID", new MongoDB.Bson.BsonString(flight.FlightID)); var writeResult = modelCollection.Remove(q1); } } catch (Exception e) { LogHelper.Error("DeleteFlight", e); return e.Message; } } return string.Empty; }
GetFlightConditionDecisionRecordMongoCollectionByFlight(MongoDatabase database, Flight flight) { return database.GetCollection<FlightDataEntities.Decisions.DecisionRecord>( AircraftMongoDb.COLLECTION_FLIGHT_CONDITION_DECISION);// + "_" + flight.FlightID); }
internal MongoCollection<FlightDataEntities.Decisions.DecisionRecord> GetDecisionRecordMongoCollectionByFlight( MongoDatabase database, Flight flight) { return database.GetCollection<FlightDataEntities.Decisions.DecisionRecord>( AircraftMongoDb.COLLECTION_FLIGHT_DECISIONS + "_" + flight.FlightID); }
internal MongoCollection<FlightRawDataRelationPoint> GetFlightRawDataRelationPointMongoCollectionByFlight(MongoDatabase database, Flight flight) { return database.GetCollection<FlightRawDataRelationPoint>( AircraftMongoDb.COLLECTION_FLIGHT_RAWDATA_RELATION);// + "_" + flight.FlightID); }
internal MongoCollection<ExtremumPointInfo> GetFlightExtremeMongoCollectionByFlight(MongoDatabase database, Flight flight) { return database.GetCollection<ExtremumPointInfo>( AircraftMongoDb.COLLECTION_FLIGHT_EXTREME);// + "_" + flight.FlightID); }
public FlightDataEntities.Decisions.DecisionRecord[] GetDecisionRecords(Flight flight) { try { LogHelper.Info("AircraftService.GetDecisionRecords Requested.", null); AircraftServiceBll bll = new AircraftServiceBll(); return bll.GetDecisionRecords(flight); } catch (Exception e) { LogHelper.Error("AircraftService.GetDecisionRecords", e); return null; } }
private MongoCursor<Level1FlightRecord> FindMongoDBCursor(Flight flight, string[] parameterIds, int startSecond, int endSecond, AircraftMongoDbDal dal, MongoDatabase database) { MongoCollection<FlightDataEntities.Level1FlightRecord> modelCollection1 = dal.GetLevel1FlightRecordMongoCollectionByFlight(database, flight); List<IMongoQuery> qs = new List<IMongoQuery>(); qs.Add(Query.EQ("FlightID", flight.FlightID)); qs.Add(Query.Or(Query.And( Query.GTE("StartSecond", startSecond), Query.LT("StartSecond", endSecond)), Query.And( Query.GT("EndSecond", startSecond), Query.LTE("EndSecond", endSecond)))); //最后这个条件是如果一个Level1Record的起始秒、结束秒 //介于参数起始值和结束值之间,都可以Select, //因为区间段基本上是定长的,所以可以这样认定 if (parameterIds != null && parameterIds.Length > 0) { var bsonParamID = from id in parameterIds select new BsonString(id); qs.Add(Query.In("ParameterID", bsonParamID));//前两个条件必须:架次、时间 } IMongoQuery q1 = Query.And(qs); //var bsonParamID = from id in parameterIds // select new BsonString(id); ////先取出Level1记录 //IMongoQuery q1 = Query.And( // Query.EQ("FlightID", flight.FlightID), // Query.Or(Query.And( // Query.GTE("StartSecond", startSecond), // Query.LT("StartSecond", endSecond)), // Query.And( // Query.GT("EndSecond", startSecond), // Query.LTE("EndSecond", endSecond))), // //最后这个条件是如果一个Level1Record的起始秒、结束秒 // //介于参数起始值和结束值之间,都可以Select, // //因为区间段基本上是定长的,所以可以这样认定 // Query.In("ParameterID", bsonParamID) //前两个条件必须:架次、时间 // ); var cursor = modelCollection1.Find(q1); return cursor; }
public FlightDataEntities.LevelTopFlightRecord[] GetLevelTopFlightRecords( Flight flight, string[] parameterIds) { try { LogHelper.Info("AircraftService.GetLevelTopFlightRecords Requested.", null); AircraftServiceBll bll = new AircraftServiceBll(); return bll.GetLevelTopFlightRecords(flight, parameterIds); } catch (Exception e) { LogHelper.Error("AircraftService.GetLevelTopFlightRecords", e); return null; } }
public bool IsValidAircraftInfo(Flight flight) { if (flight == null) return false; if (flight == null || string.IsNullOrEmpty(flight.FlightID) || flight.Aircraft == null || flight.Aircraft.AircraftModel == null || string.IsNullOrEmpty(flight.Aircraft.AircraftModel.ModelName)) return false; return true; }
internal FlightDataEntities.Decisions.DecisionRecord[] GetDecisionRecords(Flight flight) { if (flight == null || string.IsNullOrEmpty(flight.FlightID)) { LogHelper.Warn("flight为空或FlightID为空(GetDecisionRecords)。", null); return null; } using (AircraftMongoDbDal dal = new AircraftMongoDbDal()) { MongoServer mongoServer = dal.GetMongoServer(); //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常 try {//此方法操作的记录为跟架次密切相关,需要拆分存储的记录,最好在DAL里面去处理表名构建逻辑 MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel); if (database != null) { MongoCollection<FlightDataEntities.Decisions.DecisionRecord> modelCollection = dal.GetDecisionRecordMongoCollectionByFlight(database, flight); IMongoQuery q1 = Query.EQ("FlightID", flight.FlightID); var cursor = modelCollection.Find(q1); var result = cursor.AsQueryable(); return result.ToArray(); } } catch (Exception e) { LogHelper.Error("AddDecisionRecordsBatch", e); } } return null; }
/// <summary> /// 精简数据,返回最顶一层的数据 /// </summary> /// <param name="flight"></param> /// <param name="collection"></param> /// <returns></returns> public static LevelTopFlightRecord[] FromLevel1RecordCollectionToLevelTopRecords( Flight flight, MongoCollection<Level1FlightRecord> collection) { return null;//DEBUG }
public string OptimizeForLevel2Data(Flight flight) { if (!this.IsValidAircraftInfo(flight)) return "缺少机型或架次信息。"; //产生汇总数据 MongoServer mongoServer = this.GetMongoServer(); if (mongoServer != null) { MongoDatabase database = mongoServer.GetDatabase(flight.Aircraft.AircraftModel.ModelName); if (database != null) { MongoCollection<Level1FlightRecord> modelCollection = database.GetCollection<Level1FlightRecord>( AircraftMongoDb.COLLECTION_FLIGHT_RECORD_LEVEL1 + flight.FlightID); Level2FlightRecord[] records = null;//DEBUG // FlightDataEntityTransform.FromLevel1RecordCollectionToLevel2Record(flight, modelCollection); } } return string.Empty; }
/// <summary> /// 不急着做,TopLevel还 /// </summary> /// <param name="flight"></param> /// <param name="parameterIds"></param> /// <param name="withLevel1Data"></param> /// <returns></returns> internal LevelTopFlightRecord[] GetLevelTopFlightRecords(Flight flight, string[] parameterIds) { using (AircraftMongoDbDal dal = new AircraftMongoDbDal()) { MongoServer mongoServer = dal.GetMongoServer(); //不用判断是否为空,必须不能为空才能继续,否则内部要抛异常 try {//此方法操作的记录为跟架次密切相关,但肯定LevelTopRecord需要包含趋势分析等信息, //建议不要分表,存放在Common里面 MongoDatabase database = dal.GetMongoDatabaseByAircraftModel(mongoServer, flight.Aircraft.AircraftModel); if (database != null) { MongoCollection<FlightDataEntities.LevelTopFlightRecord> modelCollection1 = dal.GetLevelTopFlightRecordMongoCollectionByFlight(database, flight); IMongoQuery q1 = null; if (parameterIds == null || parameterIds.Length == 0) q1 = Query.EQ("FlightID", new BsonString(flight.FlightID)); else q1 = Query.And(Query.EQ("FlightID", new BsonString(flight.FlightID)), Query.In("ParameterID", (from pm in parameterIds select new BsonString(pm)))); var cursor = modelCollection1.Find(q1); return cursor.ToArray(); } } catch (Exception e) { LogHelper.Error("GetLevelTopFlightRecords", e); return new LevelTopFlightRecord[] { }; } } return new LevelTopFlightRecord[] { }; }
public string AddOrReplaceFlightExtreme(Flight flight, ExtremumPointInfo[] extremumPointInfo) { try { LogHelper.Info("DataInputService.AddOrReplaceFlightExtreme Requested.", null); DataInputServiceBll bll = new DataInputServiceBll(); return bll.AddOrReplaceFlightExtreme(flight, extremumPointInfo); } catch (Exception ex) { LogHelper.Error("AddOrReplaceFlightExtreme", ex); return ex.Message; } }