public static ModAndDateResult GetModAndDate(DateObject beginDate, DateObject endDate, DateObject referenceDate, string timex, bool future) { DateObject beginDateResult = beginDate; DateObject endDateResult = endDate; var isBusinessDay = timex.EndsWith(Constants.TimexBusinessDay, StringComparison.Ordinal); var businessDayCount = 0; List <DateObject> dateList = null; if (isBusinessDay) { businessDayCount = int.Parse(timex.Substring(1, timex.Length - 3), CultureInfo.InvariantCulture); } if (future) { string mod = Constants.AFTER_MOD; // For future the beginDate should add 1 first if (isBusinessDay) { beginDateResult = DurationParsingUtil.GetNextBusinessDay(referenceDate); endDateResult = DurationParsingUtil.GetNthBusinessDay(beginDateResult, businessDayCount - 1, true, out dateList); endDateResult = endDateResult.AddDays(1); return(new ModAndDateResult(beginDateResult, endDateResult, mod, dateList)); } else { beginDateResult = referenceDate.AddDays(1); endDateResult = DurationParsingUtil.ShiftDateTime(timex, beginDateResult, true); return(new ModAndDateResult(beginDateResult, endDateResult, mod, null)); } } else { const string mod = Constants.BEFORE_MOD; if (isBusinessDay) { endDateResult = DurationParsingUtil.GetNextBusinessDay(endDateResult, false); beginDateResult = DurationParsingUtil.GetNthBusinessDay(endDateResult, businessDayCount - 1, false, out dateList); endDateResult = endDateResult.AddDays(1); return(new ModAndDateResult(beginDateResult, endDateResult, mod, dateList)); } else { beginDateResult = DurationParsingUtil.ShiftDateTime(timex, endDateResult, false); return(new ModAndDateResult(beginDateResult, endDateResult, mod, null)); } } }
private List <ExtractResult> MergeMultipleDuration(string text, List <ExtractResult> extractorResults) { if (extractorResults.Count <= 1) { return(extractorResults); } var unitMap = UnitMap; var unitValueMap = UnitValueMap; var unitRegex = DurationUnitRegex; List <ExtractResult> ret = new List <ExtractResult>(); var firstExtractionIndex = 0; var timeUnit = 0; var totalUnit = 0; while (firstExtractionIndex < extractorResults.Count) { string curUnit = null; var unitMatch = unitRegex.Match(extractorResults[firstExtractionIndex].Text); if (unitMatch.Success && unitMap.ContainsKey(unitMatch.Groups["unit"].ToString())) { curUnit = unitMatch.Groups["unit"].ToString(); totalUnit++; if (DurationParsingUtil.IsTimeDurationUnit(unitMap[curUnit])) { timeUnit++; } } if (string.IsNullOrEmpty(curUnit)) { firstExtractionIndex++; continue; } var secondExtractionIndex = firstExtractionIndex + 1; while (secondExtractionIndex < extractorResults.Count) { var valid = false; var midStrBegin = extractorResults[secondExtractionIndex - 1].Start + extractorResults[secondExtractionIndex - 1].Length ?? 0; var midStrEnd = extractorResults[secondExtractionIndex].Start ?? 0; if (midStrBegin > midStrEnd) { return(extractorResults); } var midStr = text.Substring(midStrBegin, midStrEnd - midStrBegin); var match = DurationConnectorRegex.Match(midStr); if (match.Success) { unitMatch = unitRegex.Match(extractorResults[secondExtractionIndex].Text); if (unitMatch.Success && unitMap.ContainsKey(unitMatch.Groups["unit"].ToString())) { var nextUnitStr = unitMatch.Groups["unit"].ToString(); if (unitValueMap[UnitMap[nextUnitStr]] != unitValueMap[UnitMap[curUnit]]) { valid = true; if (unitValueMap[UnitMap[nextUnitStr]] < unitValueMap[UnitMap[curUnit]]) { curUnit = nextUnitStr; } } totalUnit++; if (DurationParsingUtil.IsTimeDurationUnit(unitMap[nextUnitStr])) { timeUnit++; } } } if (!valid) { break; } secondExtractionIndex++; } if (secondExtractionIndex - 1 > firstExtractionIndex) { var node = new ExtractResult(); node.Start = extractorResults[firstExtractionIndex].Start; node.Length = extractorResults[secondExtractionIndex - 1].Start + extractorResults[secondExtractionIndex - 1].Length - node.Start; node.Text = text.Substring(node.Start ?? 0, node.Length ?? 0); node.Type = extractorResults[firstExtractionIndex].Type; // Add multiple duration type to extract result string type = Constants.MultipleDuration_DateTime; // Default type if (timeUnit == totalUnit) { type = Constants.MultipleDuration_Time; } else if (timeUnit == 0) { type = Constants.MultipleDuration_Date; } node.Data = type; ret.Add(node); timeUnit = 0; totalUnit = 0; } else { ret.Add(extractorResults[firstExtractionIndex]); } firstExtractionIndex = secondExtractionIndex; } return(ret); }