Esempio n. 1
0
        public IEnumerable <ITimePeriod> GetTimePeriodsFromText(string text, TemporalParserOptions options)
        {
            var components        = GetComponentsFromText(text);
            var groupedComponents = TemporalComponent.GroupComponents(components);
            var result            = new List <ITimePeriod>();

            foreach (var componentGroup in groupedComponents)
            {
                var tmpTimePeriod = GetTimePeriodFromComponents(componentGroup, options);
                if (tmpTimePeriod != null)
                {
                    result.Add(tmpTimePeriod);
                }
            }

            return(result);
        }
Esempio n. 2
0
        private ITimePeriod GetTimePeriodFromComponents(IEnumerable <TemporalComponent> components, TemporalParserOptions options)
        {
            //TODO: Overhaul this so it actually is smart! It currently can't:
            //		- Match all component types together
            //		- Handle variations of types (eg. open-ended date with open-ended time)
            var processedComponents = components.Select(c => new ProcessedComponent
            {
                Component  = c,
                TimePeriod = c.GetTimePeriod(options.BaseDate)
            }).Where(c => c.TimePeriod != null).ToList();

            if (processedComponents.Count() == 0)
            {
                return(null);
            }
            else if (processedComponents.Count() == 1)
            {
                return(processedComponents.FirstOrDefault().TimePeriod);
            }

            var dateComponents     = processedComponents.Where(c => c.Component is DateComponent);
            var timeComponents     = processedComponents.Where(c => c.Component is TimeComponent);
            var sequenceComponents = processedComponents.Where(c => c.Component is SequenceComponent);
            var fuzzyComponents    = processedComponents.Where(c => c.Component is FuzzyComponent);

            //var durationComponents = processedComponents.Where(c => c.Component is DurationComponent);
            //var relativeComponents = processedComponents.Where(c => c.Component is RelativeDateTimeComponent);

            if (components.Any(c => c is SequenceComponent))
            {
                var dateComponent     = dateComponents.FirstOrDefault();
                var timeComponent     = timeComponents.FirstOrDefault();
                var sequenceComponent = sequenceComponents.FirstOrDefault();
                if (sequenceComponent != null)
                {
                    return(TransformSequenceDateTime(
                               sequenceComponent,
                               dateComponent,
                               timeComponent
                               ));
                }
            }
            else if (components.Count() == 2 && components.Any(c => c is DateComponent) && components.Any(c => c is TimeComponent))
            {
                var dateComponent = dateComponents.FirstOrDefault();
                var timeComponent = timeComponents.FirstOrDefault();
                if (dateComponent != null && timeComponent != null)
                {
                    return(TransformDateTimeComponents(dateComponent.TimePeriod, timeComponent.TimePeriod));
                }
            }
            else if (components.Count() == 2 && components.Any(c => c is FuzzyComponent) && components.Any(c => c is TimeComponent))
            {
                var fuzzyComponent = fuzzyComponents.FirstOrDefault();
                var timeComponent  = timeComponents.FirstOrDefault();
                if (fuzzyComponent != null && timeComponent != null)
                {
                    return(TransformDateTimeComponents(fuzzyComponent.TimePeriod, timeComponent.TimePeriod));
                }
            }

            return(null);
        }