// parse "in 20 minutes" private DateTimeResolutionResult ParseNumberWithUnit(string text, DateObject referenceTime) { var ret = new DateTimeResolutionResult(); var numStr = string.Empty; var unitStr = string.Empty; // if there are spaces between nubmer and unit var ers = CardinalExtractor.Extract(text); if (ers.Count == 1) { var pr = CardinalParser.Parse(ers[0]); var srcUnit = text.Substring(ers[0].Start + ers[0].Length ?? 0).Trim().ToLower(); if (srcUnit.StartsWith("个")) { srcUnit = srcUnit.Substring(1); } var beforeStr = text.Substring(0, ers[0].Start ?? 0).Trim().ToLowerInvariant(); if (this.config.UnitMap.ContainsKey(srcUnit)) { numStr = pr.ResolutionStr; unitStr = this.config.UnitMap[srcUnit]; var prefixMatch = DateTimePeriodExtractorChs.PastRegex.Match(beforeStr); if (prefixMatch.Success && prefixMatch.Length == beforeStr.Length) { DateObject beginDate, endDate; switch (unitStr) { case "H": beginDate = referenceTime.AddHours(-(double)pr.Value); endDate = referenceTime; break; case "M": beginDate = referenceTime.AddMinutes(-(double)pr.Value); endDate = referenceTime; break; case "S": beginDate = referenceTime.AddSeconds(-(double)pr.Value); endDate = referenceTime; break; default: return(ret); } ret.Timex = $"({FormatUtil.LuisDate(beginDate)}T{FormatUtil.LuisTime(beginDate)},{FormatUtil.LuisDate(endDate)}T{FormatUtil.LuisTime(endDate)},PT{numStr}{unitStr[0]})"; ret.FutureValue = ret.PastValue = new Tuple <DateObject, DateObject>(beginDate, endDate); ret.Success = true; return(ret); } prefixMatch = DateTimePeriodExtractorChs.FutureRegex.Match(beforeStr); if (prefixMatch.Success && prefixMatch.Length == beforeStr.Length) { DateObject beginDate, endDate; switch (unitStr) { case "H": beginDate = referenceTime; endDate = referenceTime.AddHours((double)pr.Value); break; case "M": beginDate = referenceTime; endDate = referenceTime.AddMinutes((double)pr.Value); break; case "S": beginDate = referenceTime; endDate = referenceTime.AddSeconds((double)pr.Value); break; default: return(ret); } ret.Timex = $"({FormatUtil.LuisDate(beginDate)}T{FormatUtil.LuisTime(beginDate)},{FormatUtil.LuisDate(endDate)}T{FormatUtil.LuisTime(endDate)},PT{numStr}{unitStr[0]})"; ret.FutureValue = ret.PastValue = new Tuple <DateObject, DateObject>(beginDate, endDate); ret.Success = true; return(ret); } } } // handle "last hour" var match = DateTimePeriodExtractorChs.UnitRegex.Match(text); if (match.Success) { var srcUnit = match.Groups["unit"].Value.ToLower(); var beforeStr = text.Substring(0, match.Index).Trim().ToLowerInvariant(); if (this.config.UnitMap.ContainsKey(srcUnit)) { unitStr = this.config.UnitMap[srcUnit]; var prefixMatch = DateTimePeriodExtractorChs.PastRegex.Match(beforeStr); if (prefixMatch.Success && prefixMatch.Length == beforeStr.Length) { DateObject beginDate, endDate; switch (unitStr) { case "H": beginDate = referenceTime.AddHours(-1); endDate = referenceTime; break; case "M": beginDate = referenceTime.AddMinutes(-1); endDate = referenceTime; break; case "S": beginDate = referenceTime.AddSeconds(-1); endDate = referenceTime; break; default: return(ret); } ret.Timex = $"({FormatUtil.LuisDate(beginDate)}T{FormatUtil.LuisTime(beginDate)},{FormatUtil.LuisDate(endDate)}T{FormatUtil.LuisTime(endDate)},PT1{unitStr[0]})"; ret.FutureValue = ret.PastValue = new Tuple <DateObject, DateObject>(beginDate, endDate); ret.Success = true; return(ret); } prefixMatch = DateTimePeriodExtractorChs.FutureRegex.Match(beforeStr); if (prefixMatch.Success && prefixMatch.Length == beforeStr.Length) { DateObject beginDate, endDate; switch (unitStr) { case "H": beginDate = referenceTime; endDate = referenceTime.AddHours(1); break; case "M": beginDate = referenceTime; endDate = referenceTime.AddMinutes(1); break; case "S": beginDate = referenceTime; endDate = referenceTime.AddSeconds(1); break; default: return(ret); } ret.Timex = $"({FormatUtil.LuisDate(beginDate)}T{FormatUtil.LuisTime(beginDate)},{FormatUtil.LuisDate(endDate)}T{FormatUtil.LuisTime(endDate)},PT1{unitStr[0]})"; ret.FutureValue = ret.PastValue = new Tuple <DateObject, DateObject>(beginDate, endDate); ret.Success = true; return(ret); } } } return(ret); }
// handle like "三天前" private DateTimeResolutionResult ParserDurationWithBeforeAndAfter(string text, DateObject referenceDate) { var ret = new DateTimeResolutionResult(); var durationRes = durationExtractor.Extract(text); var numStr = string.Empty; var unitStr = string.Empty; if (durationRes.Count > 0) { var match = DateExtractorChs.UnitRegex.Match(text); if (match.Success) { var afterStr = text.Substring((int)durationRes[0].Start + (int)durationRes[0].Length, 1) .Trim() .ToLowerInvariant(); var srcUnit = match.Groups["unit"].Value.ToLowerInvariant(); var numberStr = text.Substring((int)durationRes[0].Start, match.Index - (int)durationRes[0].Start) .Trim() .ToLowerInvariant(); var number = ConvertChineseToNum(numberStr); if (this.config.UnitMap.ContainsKey(srcUnit)) { unitStr = this.config.UnitMap[srcUnit]; numStr = number.ToString(); if (afterStr.Equals("前")) { DateObject date; switch (unitStr) { case "D": date = referenceDate.AddDays(-double.Parse(numStr)); break; case "W": date = referenceDate.AddDays(-7 * double.Parse(numStr)); break; case "MON": date = referenceDate.AddMonths(-Convert.ToInt32(double.Parse(numStr))); break; case "Y": date = referenceDate.AddYears(-Convert.ToInt32(double.Parse(numStr))); break; default: return(ret); } ret.Timex = $"{FormatUtil.LuisDate(date)}"; ret.FutureValue = ret.PastValue = date; ret.Success = true; return(ret); } if (afterStr.Equals("后")) { DateObject date; switch (unitStr) { case "D": date = referenceDate.AddDays(double.Parse(numStr)); break; case "W": date = referenceDate.AddDays(7 * double.Parse(numStr)); break; case "MON": date = referenceDate.AddMonths(Convert.ToInt32(double.Parse(numStr))); break; case "Y": date = referenceDate.AddYears(Convert.ToInt32(double.Parse(numStr))); break; default: return(ret); } ret.Timex = $"{FormatUtil.LuisDate(date)}"; ret.FutureValue = ret.PastValue = date; ret.Success = true; return(ret); } } } } return(ret); }
private DateTimeResolutionResult MergeTwoTimePoints(string text, DateObject referenceTime) { var ret = new DateTimeResolutionResult(); DateTimeParseResult pr1 = null, pr2 = null; bool bothHasDate = false, beginHasDate = false, endHasDate = false; var er1 = SingleTimeExtractor.Extract(text); var er2 = TimeWithDateExtractor.Extract(text); if (er2.Count == 2) { pr1 = this.config.DateTimeParser.Parse(er2[0], referenceTime); pr2 = this.config.DateTimeParser.Parse(er2[1], referenceTime); bothHasDate = true; } else if (er2.Count == 1 && er1.Count == 2) { if (!er2[0].IsOverlap(er1[0])) { pr1 = this.config.TimeParser.Parse(er1[0], referenceTime); pr2 = this.config.DateTimeParser.Parse(er2[0], referenceTime); endHasDate = true; } else { pr1 = this.config.DateTimeParser.Parse(er2[0], referenceTime); pr2 = this.config.TimeParser.Parse(er1[1], referenceTime); beginHasDate = true; } } else if (er2.Count == 1 && er1.Count == 1) { if (er1[0].Start < er2[0].Start) { pr1 = this.config.TimeParser.Parse(er1[0], referenceTime); pr2 = this.config.DateTimeParser.Parse(er2[0], referenceTime); endHasDate = true; } else { pr1 = this.config.DateTimeParser.Parse(er2[0], referenceTime); pr2 = this.config.TimeParser.Parse(er1[0], referenceTime); beginHasDate = true; } } else if (er1.Count == 2) { // if both ends are Time. then this is a TimePeriod, not a DateTimePeriod return(ret); } else { return(ret); } if (pr1.Value == null || pr2.Value == null) { return(ret); } DateObject futureBegin = (DateObject)((DateTimeResolutionResult)pr1.Value).FutureValue, futureEnd = (DateObject)((DateTimeResolutionResult)pr2.Value).FutureValue; DateObject pastBegin = (DateObject)((DateTimeResolutionResult)pr1.Value).PastValue, pastEnd = (DateObject)((DateTimeResolutionResult)pr2.Value).PastValue; if (futureBegin > futureEnd) { futureBegin = pastBegin; } if (pastEnd < pastBegin) { pastEnd = futureEnd; } if (bothHasDate) { ret.Timex = $"({pr1.TimexStr},{pr2.TimexStr},PT{Convert.ToInt32((futureEnd - futureBegin).TotalHours)}H)"; // do nothing } else if (beginHasDate) { // TODO: Handle "明天下午两点到五点" futureEnd = new DateObject(futureBegin.Year, futureBegin.Month, futureBegin.Day, futureEnd.Hour, futureEnd.Minute, futureEnd.Second); pastEnd = new DateObject(pastBegin.Year, pastBegin.Month, pastBegin.Day, pastEnd.Hour, pastEnd.Minute, pastEnd.Second); var dateStr = pr1.TimexStr.Split('T')[0]; ret.Timex = $"({pr1.TimexStr},{dateStr + pr2.TimexStr},PT{Convert.ToInt32((futureEnd - futureBegin).TotalHours)}H)"; } else if (endHasDate) { // TODO: Handle "明天下午两点到五点" futureBegin = new DateObject(futureEnd.Year, futureEnd.Month, futureEnd.Day, futureBegin.Hour, futureBegin.Minute, futureBegin.Second); pastBegin = new DateObject(pastEnd.Year, pastEnd.Month, pastEnd.Day, pastBegin.Hour, pastBegin.Minute, pastBegin.Second); var dateStr = pr2.TimexStr.Split('T')[0]; ret.Timex = $"({dateStr + pr1.TimexStr},{pr2.TimexStr},PT{Convert.ToInt32((futureEnd - futureBegin).TotalHours)}H)"; } ret.FutureValue = new Tuple <DateObject, DateObject>(futureBegin, futureEnd); ret.PastValue = new Tuple <DateObject, DateObject>(pastBegin, pastEnd); ret.Success = true; return(ret); }
// handle like "前两年" "前三个月" private DTParseResult ParseNumberWithUnit(string text, DateObject referenceDate) { var ret = new DTParseResult(); var numStr = string.Empty; var unitStr = string.Empty; // if there are NO spaces between number and unit var match = DatePeriodExtractorChs.NumberCombinedWithUnit.Match(text); if (match.Success) { var srcUnit = match.Groups["unit"].Value.ToLowerInvariant(); var beforeStr = text.Substring(0, match.Index).Trim().ToLowerInvariant(); if (this.config.UnitMap.ContainsKey(srcUnit)) { unitStr = this.config.UnitMap[srcUnit]; numStr = match.Groups["num"].Value; var prefixMatch = DatePeriodExtractorChs.PastRegex.Match(beforeStr); if (prefixMatch.Success && prefixMatch.Length == beforeStr.Length) { DateObject beginDate, endDate; switch (unitStr) { case "D": beginDate = referenceDate.AddDays(-double.Parse(numStr)); endDate = referenceDate; break; case "W": beginDate = referenceDate.AddDays(-7 * double.Parse(numStr)); endDate = referenceDate; break; case "MON": beginDate = referenceDate.AddMonths(-Convert.ToInt32(double.Parse(numStr))); endDate = referenceDate; break; case "Y": beginDate = referenceDate.AddYears(-Convert.ToInt32(double.Parse(numStr))); endDate = referenceDate; break; default: return(ret); } ret.Timex = $"({Util.LuisDate(beginDate)},{Util.LuisDate(endDate)},P{numStr}{unitStr[0]})"; ret.FutureValue = ret.PastValue = new Tuple <DateObject, DateObject>(beginDate, endDate); ret.Success = true; return(ret); } prefixMatch = DatePeriodExtractorChs.FutureRegex.Match(beforeStr); if (prefixMatch.Success && prefixMatch.Length == beforeStr.Length) { DateObject beginDate, endDate; switch (unitStr) { case "D": beginDate = referenceDate; endDate = referenceDate.AddDays(double.Parse(numStr)); break; case "W": beginDate = referenceDate; endDate = referenceDate.AddDays(7 * double.Parse(numStr)); break; case "MON": beginDate = referenceDate; endDate = referenceDate.AddMonths(Convert.ToInt32(double.Parse(numStr))); break; case "Y": beginDate = referenceDate; endDate = referenceDate.AddYears(Convert.ToInt32(double.Parse(numStr))); break; default: return(ret); } ret.Timex = $"({Util.LuisDate(beginDate.AddDays(1))},{Util.LuisDate(endDate.AddDays(1))},P{numStr}{unitStr[0]})"; ret.FutureValue = ret.PastValue = new Tuple <DateObject, DateObject>(beginDate.AddDays(1), endDate.AddDays(1)); ret.Success = true; return(ret); } } } // for case "前两年" "后三年" var duration_res = durationextractor.Extract(text); if (duration_res.Count > 0) { var beforeStr = text.Substring(0, (int)duration_res[0].Start).Trim().ToLowerInvariant(); match = DatePeriodExtractorChs.UnitRegex.Match(duration_res[0].Text); if (match.Success) { var srcUnit = match.Groups["unit"].Value.ToLowerInvariant(); var numberStr = duration_res[0].Text.Substring(0, match.Index).Trim().ToLowerInvariant(); var number = ConvertChineseToNum(numberStr); if (this.config.UnitMap.ContainsKey(srcUnit)) { unitStr = this.config.UnitMap[srcUnit]; numStr = number.ToString(); var prefixMatch = DatePeriodExtractorChs.PastRegex.Match(beforeStr); if (prefixMatch.Success && prefixMatch.Length == beforeStr.Length) { DateObject beginDate, endDate; switch (unitStr) { case "D": beginDate = referenceDate.AddDays(-double.Parse(numStr)); endDate = referenceDate; break; case "W": beginDate = referenceDate.AddDays(-7 * double.Parse(numStr)); endDate = referenceDate; break; case "MON": beginDate = referenceDate.AddMonths(-Convert.ToInt32(double.Parse(numStr))); endDate = referenceDate; break; case "Y": beginDate = referenceDate.AddYears(-Convert.ToInt32(double.Parse(numStr))); endDate = referenceDate; break; default: return(ret); } ret.Timex = $"({Util.LuisDate(beginDate)},{Util.LuisDate(endDate)},P{numStr}{unitStr[0]})"; ret.FutureValue = ret.PastValue = new Tuple <DateObject, DateObject>(beginDate, endDate); ret.Success = true; return(ret); } prefixMatch = DatePeriodExtractorChs.FutureRegex.Match(beforeStr); if (prefixMatch.Success && prefixMatch.Length == beforeStr.Length) { DateObject beginDate, endDate; switch (unitStr) { case "D": beginDate = referenceDate; endDate = referenceDate.AddDays(double.Parse(numStr)); break; case "W": beginDate = referenceDate; endDate = referenceDate.AddDays(7 * double.Parse(numStr)); break; case "MON": beginDate = referenceDate; endDate = referenceDate.AddMonths(Convert.ToInt32(double.Parse(numStr))); break; case "Y": beginDate = referenceDate; endDate = referenceDate.AddYears(Convert.ToInt32(double.Parse(numStr))); break; default: return(ret); } ret.Timex = $"({Util.LuisDate(beginDate.AddDays(1))},{Util.LuisDate(endDate.AddDays(1))},P{numStr}{unitStr[0]})"; ret.FutureValue = ret.PastValue = new Tuple <DateObject, DateObject>(beginDate.AddDays(1), endDate.AddDays(1)); ret.Success = true; return(ret); } } } } return(ret); }
/// <summary> /// Collects all results and returns an IEnumerable of results /// </summary> /// <returns></returns> public IEnumerable <IResult> CollectResults() { return(fileCrawler.GetFiles() .Select(f => extractor.Extract(f))); }
// merge a Date entity and a Time entity private DateTimeResolutionResult MergeDateAndTime(string text, DateObject referenceTime) { var ret = new DateTimeResolutionResult(); var er1 = SingleDateExtractor.Extract(text); if (er1.Count == 0) { return(ret); } var er2 = SingleTimeExtractor.Extract(text); if (er2.Count == 0) { return(ret); } // TODO: Add reference time var pr1 = this.config.DateParser.Parse(er1[0], referenceTime.Date); var pr2 = this.config.TimeParser.Parse(er2[0], referenceTime); if (pr1.Value == null || pr2.Value == null) { return(ret); } var futureDate = (DateObject)((DateTimeResolutionResult)pr1.Value).FutureValue; var pastDate = (DateObject)((DateTimeResolutionResult)pr1.Value).PastValue; var time = (DateObject)((DateTimeResolutionResult)pr2.Value).FutureValue; var hour = time.Hour; var min = time.Minute; var sec = time.Second; // handle morning, afternoon if (SimplePmRegex.IsMatch(text) && hour < 12) { hour += 12; } else if (SimpleAmRegex.IsMatch(text) && hour >= 12) { hour -= 12; } var timeStr = pr2.TimexStr; if (timeStr.EndsWith("ampm")) { timeStr = timeStr.Substring(0, timeStr.Length - 4); } timeStr = "T" + hour.ToString("D2") + timeStr.Substring(3); ret.Timex = pr1.TimexStr + timeStr; var val = (DateTimeResolutionResult)pr2.Value; if (hour <= 12 && !SimplePmRegex.IsMatch(text) && !SimpleAmRegex.IsMatch(text) && !string.IsNullOrEmpty(val.Comment)) { //ret.Timex += "ampm"; ret.Comment = "ampm"; } ret.FutureValue = DateObject.MinValue.SafeCreateFromValue(futureDate.Year, futureDate.Month, futureDate.Day, hour, min, sec); ret.PastValue = DateObject.MinValue.SafeCreateFromValue(pastDate.Year, pastDate.Month, pastDate.Day, hour, min, sec); ret.Success = true; return(ret); }
public ExtractorResult Extract(string data) { return(_extractor.Extract(data)); }
private DateTimeResolutionResult MergeTwoTimePoints(string text, DateObject referenceTime) { var ret = new DateTimeResolutionResult(); DateTimeParseResult pr1 = null, pr2 = null; bool bothHasDate = false, beginHasDate = false, endHasDate = false; var er1 = SingleTimeExtractor.Extract(text); var er2 = TimeWithDateExtractor.Extract(text); var rightTime = DateObject.MinValue.SafeCreateFromValue(referenceTime.Year, referenceTime.Month, referenceTime.Day); var leftTime = DateObject.MinValue.SafeCreateFromValue(referenceTime.Year, referenceTime.Month, referenceTime.Day); if (er2.Count == 2) { pr1 = this.config.DateTimeParser.Parse(er2[0], referenceTime); pr2 = this.config.DateTimeParser.Parse(er2[1], referenceTime); bothHasDate = true; } else if (er2.Count == 1 && er1.Count == 2) { if (!er2[0].IsOverlap(er1[0])) { pr1 = this.config.TimeParser.Parse(er1[0], referenceTime); pr2 = this.config.DateTimeParser.Parse(er2[0], referenceTime); endHasDate = true; } else { pr1 = this.config.DateTimeParser.Parse(er2[0], referenceTime); pr2 = this.config.TimeParser.Parse(er1[1], referenceTime); beginHasDate = true; } } else if (er2.Count == 1 && er1.Count == 1) { if (er1[0].Start < er2[0].Start) { pr1 = this.config.TimeParser.Parse(er1[0], referenceTime); pr2 = this.config.DateTimeParser.Parse(er2[0], referenceTime); endHasDate = true; } else { pr1 = this.config.DateTimeParser.Parse(er2[0], referenceTime); pr2 = this.config.TimeParser.Parse(er1[0], referenceTime); beginHasDate = true; } } else if (er1.Count == 2) { // if both ends are Time. then this is a TimePeriod, not a DateTimePeriod return(ret); } else { return(ret); } if (pr1.Value == null || pr2.Value == null) { return(ret); } DateObject futureBegin = (DateObject)((DateTimeResolutionResult)pr1.Value).FutureValue, futureEnd = (DateObject)((DateTimeResolutionResult)pr2.Value).FutureValue; DateObject pastBegin = (DateObject)((DateTimeResolutionResult)pr1.Value).PastValue, pastEnd = (DateObject)((DateTimeResolutionResult)pr2.Value).PastValue; if (futureBegin > futureEnd) { futureBegin = pastBegin; } if (pastEnd < pastBegin) { pastEnd = futureEnd; } if (bothHasDate) { rightTime = DateObject.MinValue.SafeCreateFromValue(futureEnd.Year, futureEnd.Month, futureEnd.Day); leftTime = DateObject.MinValue.SafeCreateFromValue(futureBegin.Year, futureBegin.Month, futureBegin.Day); } else if (beginHasDate) { // TODO: Handle "明天下午两点到五点" futureEnd = DateObject.MinValue.SafeCreateFromValue(futureBegin.Year, futureBegin.Month, futureBegin.Day, futureEnd.Hour, futureEnd.Minute, futureEnd.Second); pastEnd = DateObject.MinValue.SafeCreateFromValue(pastBegin.Year, pastBegin.Month, pastBegin.Day, pastEnd.Hour, pastEnd.Minute, pastEnd.Second); leftTime = DateObject.MinValue.SafeCreateFromValue(futureBegin.Year, futureBegin.Month, futureBegin.Day); } else if (endHasDate) { // TODO: Handle "明天下午两点到五点" futureBegin = DateObject.MinValue.SafeCreateFromValue(futureEnd.Year, futureEnd.Month, futureEnd.Day, futureBegin.Hour, futureBegin.Minute, futureBegin.Second); pastBegin = DateObject.MinValue.SafeCreateFromValue(pastEnd.Year, pastEnd.Month, pastEnd.Day, pastBegin.Hour, pastBegin.Minute, pastBegin.Second); rightTime = DateObject.MinValue.SafeCreateFromValue(futureEnd.Year, futureEnd.Month, futureEnd.Day); } var leftResult = (DateTimeResolutionResult)pr1.Value; var rightResult = (DateTimeResolutionResult)pr2.Value; var leftResultTime = (System.DateTime)leftResult.FutureValue; var rightResultTime = (System.DateTime)rightResult.FutureValue; int day = referenceTime.Day, month = referenceTime.Month, year = referenceTime.Year; //check if the right time is smaller than the left time, if yes, add one day int hour = leftResultTime.Hour > 0 ? leftResultTime.Hour : 0, min = leftResultTime.Minute > 0 ? leftResultTime.Minute : 0, second = leftResultTime.Second > 0 ? leftResultTime.Second : 0; leftTime = leftTime.AddHours(hour); leftTime = leftTime.AddMinutes(min); leftTime = leftTime.AddSeconds(second); DateObject.MinValue.SafeCreateFromValue(year, month, day, hour, min, second); hour = rightResultTime.Hour > 0 ? rightResultTime.Hour : 0; min = rightResultTime.Minute > 0 ? rightResultTime.Minute : 0; second = rightResultTime.Second > 0 ? rightResultTime.Second : 0; rightTime = rightTime.AddHours(hour); rightTime = rightTime.AddMinutes(min); rightTime = rightTime.AddSeconds(second); //the right side time contains "ampm", while the left side doesn't if (rightResult.Comment != null && rightResult.Comment.Equals("ampm") && leftResult.Comment == null && rightTime < leftTime) { rightTime = rightTime.AddHours(12); } if (rightTime < leftTime) { rightTime = rightTime.AddDays(1); } ret.FutureValue = ret.PastValue = new Tuple <DateObject, DateObject>(leftTime, rightTime); var leftTimex = ""; var rightTimex = ""; //"X" is timex token for not determined time if (!pr1.TimexStr.Contains("X") && !pr2.TimexStr.Contains("X")) { leftTimex = FormatUtil.LuisDateTime(leftTime); rightTimex = FormatUtil.LuisDateTime(rightTime); } else { leftTimex = pr1.TimexStr; rightTimex = pr2.TimexStr; } ret.Timex = $"({leftTimex},{rightTimex},PT{Convert.ToInt32((rightTime - leftTime).TotalHours)}H)"; ret.Success = true; return(ret); }
public async Task <IActionResult> FullEtl([FromBody] EtlCommand command) { await _extractor.Extract(WorkMode.Continuous, command.Url); return(Ok()); }
public Dictionary <string, OrderKey> AcquireOrderKeys() { return(_extractor.Extract() .Select(p => _orderKeyFactory.Create(p)) .ToDictionary(k => k.ProductId)); }