public DataItem Type3Relation(DataItem di, RelationTable rt) { //<Time, VID, Xway, QID, Day, InTime(DateTime)> di.AddCapacity(1); object[] keys = { di[1] }; lock (rt) { DataRow drow = rt.Find(keys); if (drow == null) { drow = rt.GetRow(); drow["VID"] = Convert.ToInt32(di[1]); drow["Bal"] = 0; drow["Time"] = DateTime.Now.Subtract(di.TimeStamp).TotalSeconds; rt.Add(drow); //Console.WriteLine("We had to make a new balance for a type 3 query"); } di.AddValue(drow["Bal"]); } return di; //<Time, VID, Xway, QID, Day, Bal> }
public DataItem Type2Relation(DataItem di, RelationTable rt) { //<Time, VID, QID> if (!(di is Punctuation)) { object[] keys = { di[1] }; //VID int bal, time; di.AddCapacity(2); lock (rt) { DataRow drow = rt.Find(keys); if (drow == null) { drow = rt.GetRow(); drow["VID"] = Convert.ToInt32(di[1]); drow["Bal"] = 0; drow["Time"] = DateTime.Now.Subtract(di.TimeStamp).TotalSeconds; rt.Add(drow); //Console.WriteLine("We had to make a new balance for a type 2 query"); } bal = drow["Bal"]; time = drow["Time"]; } di.AddValue(bal); di.AddValue(time); return di; } else return di; //<Time, VID, QID, Bal, UTime> }
public DataItem Type3MapConvert(DataItem di) { //<Time, VID, Xway, QID, Day, Bal> di.AddCapacity(1); di.AddValue(Convert.ToInt32(di[0]) + (int)(DateTime.Now.Subtract(di.TimeStamp).TotalSeconds)); return di; //<Time, VID, Xway, QID, Day, Bal, Emit> }
public DataItem IsDupCheckVID(DataItem di) { //<Time, VID, Spd, Xway, Lane, Dir, Seg, Pos, WID(List)> di.AddCapacity(1); if (di is Punctuation) { Punctuation p = di as Punctuation; p.AddValue(new Punctuation.WildcardPattern()); IsDupTable.Clear(); return p; } else { int VID = (int)di[1]; if (IsDupTable.Contains(VID)) { di.AddValue((int)1); } else { di.AddValue((int)0); IsDupTable.Add(VID); } return di; } //<Time, VID, Spd, Xway, Lane, Dir, Seg, Pos, WID(List), ?isDup> }
public DataItem FindToll(DataItem di, RelationTable rt) { //<Time, VID, Xway, Lane, Dir, Seg, ?isNSS> di.AddCapacity(2); if (di is Punctuation) { Punctuation p = di as Punctuation; p.AddValue(new Punctuation.WildcardPattern()); p.AddValue(new Punctuation.WildcardPattern()); return p; } else { uint seg = Convert.ToUInt32(di[5]); if (Convert.ToUInt32(di[4]) == 0) //find the seg before this one seg--; else seg++; object[] keys = { di[1], seg }; //VID lock (rt) { DataRow drow = rt.Find(keys); if (drow == null) //there's no toll, we can drop it { di.AddValue((int)0); di.AddValue((int)0); } else { di.AddValue(drow["Toll"]); di.AddValue(drow["LAV"]); rt.Drop(drow); //Console.WriteLine("We found a toll"); } } return di; } //<Time, VID, Xway, Lane, Dir, Seg, ?isNSS, Toll, LAV> }
public DataItem ConvertTimeStamp(DataItem di) { //<Time, VID, Xway, Lane, Dir, Seg, ?isNSS, ...> if (!(di is Punctuation)) { di.AddCapacity(1); di.AddValue(Convert.ToUInt32(di[0]) + ((DateTime.Now.Subtract(di.TimeStamp)).TotalSeconds)); return di; } return di; //<Time, VID, Xway, Lane, Dir, Seg, ?isNSS, ...> }
public DataItem AttachStats(DataItem di, RelationTable rt) { //<Time, VID, Xway, Lane, Dir, Seg, InTime(DateTime), ?isNSS, isAIR> di.AddCapacity(2); if (!(di is Punctuation)) { try { object[] keys = { di[5], di[2], di[4] }; //Seg, Xway, Dir lock (rt) { DataRow drow = rt.Find(keys); if (drow == null) { di.AddValue((uint)0); di.AddValue((uint)0); } else { di.AddValue(drow["LAV"]); di.AddValue(drow["Count"]); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } return di; //<Time, VID, Xway, Lane, Dir, Seg, InTime(DateTime), ?isNSS, ?isAIR, LAV, Count> }
public DataItem AccidentInRange(DataItem di, RelationTable rt) { //<Time, VID, Xway, Lane, Dir, Seg, ?isNSS> di.AddCapacity(1); if (di is Punctuation) { Punctuation p = di as Punctuation; p.AddValue(new Punctuation.WildcardPattern()); return p; } else { int Xway = (int)di[2], dir = (int)di[4], seg = (int)di[5]; lock (rt) { DataRow[] drows = rt.Find("[Xway] = " + Xway + " AND [Dir] = " + dir); if (drows.Length > 0) { int accseg = (int)drows[0]["Seg"], lbound, hbound; if (dir == 0)//segs are increasing { lbound = accseg - 4; hbound = accseg; } else { lbound = accseg; hbound = accseg + 4; } if (seg <= hbound && seg >= lbound) //between the bounds di.AddValue(accseg); else di.AddValue((int)-1); } else di.AddValue((int)-1); } return di; } //<Time, VID, Xway, Lane, Dir, Seg, ?isNSS, isAIR> }