public IEnumerable <string> GetProducts(string content, int lineNumber)
        {
            SLogger.LogDebugFormat("Line number {0} is a question.", lineNumber);

            if (string.IsNullOrEmpty(content) || string.IsNullOrWhiteSpace(content))
            {
                SLogger.LogWarnFormat("Line number {0} does not have valid product(s). Skipping...", lineNumber);
                return(null);
            }

            string[] products = content.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);

            foreach (string product in products)
            {
                if (!this.productsList.Contains(product))
                {
                    SLogger.LogInfoFormat("Product List (derived by reading the input lines) does not contain product uptil now:{0} at line number {1}.\nSkipping...",
                                          product, lineNumber);

                    return(null);
                }
            }

            return(products);
        }
Exemple #2
0
        public string Validate(int numeral)
        {
            SLogger.LogInfoFormat("Validating {0}", numeral);

            ValidationResult result = this.arabicNumeralValidator.Validate(numeral);

            return(this.Validate(result));
        }
Exemple #3
0
        public IEnumerable <string> Analyze(IEnumerable <Tuple <int, InputType, IEnumerable <string>, string> > contents)
        {
            ICollection <string> analyzedResponses = new Collection <string>();

            if (contents != null && contents.Any())
            {
                foreach (Tuple <int, InputType, IEnumerable <string>, string> content in contents)
                {
                    int                  lineNumber   = content.Item1;
                    InputType            typeOfInput  = content.Item2;
                    IEnumerable <string> products     = content.Item3;
                    string               productValue = content.Item4;

                    SLogger.LogInfoFormat("Analyzing line number {0}.", lineNumber);

                    try
                    {
                        Tuple <int, IEnumerable <string>, string> contentToInterpret =
                            new Tuple <int, IEnumerable <string>, string>(lineNumber, products, productValue);

                        switch (typeOfInput)
                        {
                        case InputType.ProductData:
                        {
                            if (products == null || !products.Any())
                            {
                                SLogger.LogWarn("No products found to analyze. Skipping product data intrepretation...");
                                continue;
                            }

                            this.productDataInterpreter.Interpret(contentToInterpret);
                        }
                        break;

                        case InputType.Query:
                        {
                            string queryResponse = this.queryInterpreter.Interpret(contentToInterpret);
                            analyzedResponses.Add(queryResponse);
                        }
                        break;

                        default:
                            throw new InvalidOperationException("Invalid InputType Enum.");
                        }
                    }
                    catch (Exception ex)
                    {
                        SLogger.LogErrorFormat(ex, "Exception found when Analyzing line: {0}.", lineNumber);
                    }
                }
            }

            return(analyzedResponses);
        }
Exemple #4
0
        private void ProcessContent(string content, int lineNumber,
                                    InputType typeOfInput, out IEnumerable <string> products, out string productValue)
        {
            SLogger.LogInfoFormat("Preprocessing line number {0} with content {1}", lineNumber, content);

            products     = new Collection <string>();
            productValue = string.Empty;

            if (content.IndexOf(" is ", StringComparison.OrdinalIgnoreCase) == -1)
            {
                SLogger.LogWarnFormat("{0} at line number {1} does not contain 'is' keyword. Skipping...", content, lineNumber);
                return;
            }

            string[] words = content.Split(new string[] { " is " }, StringSplitOptions.None);

            if (words.Length != 2)
            {
                SLogger.LogWarnFormat("{0} at line number {1} is not properly formatted. Skipping...", content, lineNumber);
                return;
            }

            switch (typeOfInput)
            {
            case InputType.ProductData:
            {
                products = this.productDataValidator.GetProducts(words[0].Trim(), lineNumber);
                if (products == null || !products.Any())
                {
                    return;
                }

                productValue = this.productDataValidator.GetProductValue(words[1].Trim(), lineNumber);
            }
            break;

            case InputType.Query:
            {
                products = this.queryValidator.GetProducts(words[1].Replace("?", string.Empty).Trim(), lineNumber);

                productValue = words[0].IndexOf(CREDITS_TEXT) != -1 ? CREDITS_TEXT : string.Empty;
            }
            break;

            default:     // This won't hit, since GetInputType will always return either of ProductData or Query as InputType
                throw new InvalidOperationException("Invalid InputType Enum.");
            }
        }
Exemple #5
0
        private bool UpdateProductCache(string product, int lineNumber)
        {
            if (!this.productsList.Contains(product))
            {
                if (this.productCategorizer.IsProductValid(product))
                {
                    SLogger.LogInfoFormat("Line number {0} contains valid product:{1}.", lineNumber, product);
                    this.productsList.Add(product);
                    return(true);
                }
                else
                {
                    SLogger.LogWarnFormat("Line number {0} contained an invalid product entry:{1}, Skipping...", lineNumber, product);
                    return(false);
                }
            }

            SLogger.LogInfoFormat("Line number {0} contains valid product:{1}. Found in 'in-memory' list of products. Skipping adding to it.", lineNumber, product);
            return(true);
        }
        public int Interpret(Tuple <int, IEnumerable <string>, string> content)
        {
            int lineNumber = content.Item1;
            IEnumerable <string> products = content.Item2;
            string productValue           = content.Item3;

            SLogger.LogInfoFormat("Interpreting Product(s) at line number {0}.", lineNumber);

            if (products == null || !products.Any())
            {
                return(0);
            }

            if (!this.validator.IsProductRepresentationValid(products, productValue, InputType.ProductData, lineNumber, intergalacticProductsCache))
            {
                return(0);
            }

            this.InterpretProducts(products, productValue);
            return(1);
        }
        public string Interpret(Tuple <int, IEnumerable <string>, string> content)
        {
            int lineNumber = content.Item1;
            IEnumerable <string> products = content.Item2;
            string responseFormat         = content.Item3;

            SLogger.LogInfoFormat("Interpreting Query at line number {0}.", lineNumber);

            if (products == null || !products.Any())
            {
                return(INVALID_RESPONSE);
            }

            if (!this.validator.IsProductRepresentationValid(products, null, InputType.Query, lineNumber, intergalacticProductsCache))
            {
                return(INVALID_RESPONSE);
            }

            OutputUnitType outputUnit = this.GetOutputUnitType(responseFormat);

            return(this.InterpretProducts(products, outputUnit));
        }