Пример #1
0
        /// <inheritdoc/>
        public override AnalysisValueIntermediateResult ResultWithArgumentRowContextValueContext(JsValue argument, AnalysisProcessingQueryResultRowExecutionContext rowContext, AnalysisProcessingValueExecutionContext valueContext)
        {
            JavascriptEngine engine       = JavascriptEngine.Current;
            double           maximumValue = 0;
            bool             first        = true;
            var arr = JavascriptEngine.ArrayForValue(argument);

            if (arr == null)
            {
                return(new AnalysisValueIntermediateResult(0));
            }

            foreach (JsValue v in arr)
            {
                double curVal = JavascriptEngine.DoubleForObject(v);
                if (first)
                {
                    maximumValue = curVal;
                    first        = false;
                }
                else if (curVal > maximumValue)
                {
                    maximumValue = curVal;
                }
            }

            return(new AnalysisValueIntermediateResult(maximumValue));
        }
Пример #2
0
        /// <inheritdoc/>
        public override AnalysisValueIntermediateResult ResultWithArgumentRowContextValueContext(JsValue argument, AnalysisProcessingQueryResultRowExecutionContext rowContext, AnalysisProcessingValueExecutionContext valueContext)
        {
            JavascriptEngine engine = JavascriptEngine.Current;
            var arr = JavascriptEngine.ArrayForValue(argument);

            if (arr == null || arr.Count < 3)
            {
                return(new AnalysisValueIntermediateResult(0));
            }

            double curVal = JavascriptEngine.DoubleForObject(arr[0]);
            double minVal = JavascriptEngine.DoubleForObject(arr[1]);
            double maxVal = JavascriptEngine.DoubleForObject(arr[2]);

            if (minVal <= curVal && curVal <= maxVal)
            {
                if (arr.Count > 3)
                {
                    return(new AnalysisValueIntermediateResult(JavascriptEngine.DoubleForObject(arr[3])));
                }
                else
                {
                    return(new AnalysisValueIntermediateResult(1));
                }
            }
            else if (arr.Count > 4)
            {
                return(new AnalysisValueIntermediateResult(JavascriptEngine.DoubleForObject(arr[4])));
            }
            else
            {
                return(new AnalysisValueIntermediateResult(0));
            }
        }
Пример #3
0
        public void DiffKeysWithArrays()
        {
            using (var engine = new JavascriptEngine()) {
                engine.Execute("var a = {};");
                var startObj = engine.ExecuteAndReturn("a");

                engine.Execute("var a = {};");
                engine.Execute("a.users = []");
                var endObj = engine.ExecuteAndReturn("a");

                // Added
                var diff = new ObjectDiff();
                diff.Diff(startObj, endObj, "a");

                Assert.AreEqual(1, diff.Added.Count);
                Assert.AreEqual("a.users", diff.Added.Keys.First(), "It actually equals " + diff.Added.Keys.First());

                var val = JsonConvert.SerializeObject(diff.Added.First().Value);
                Assert.AreEqual("[]", val);
            }
            using (var engine = new JavascriptEngine())
            {
                engine.Execute("var a = {};");
                engine.Execute("a.users = []");
                var startObj = engine.ExecuteAndReturn("a");

                engine.Execute("var a = {};");
                engine.Execute("a.users = []");
                engine.Execute("a.users[1] = 12");
                var endObj = engine.ExecuteAndReturn("a");

                // Added
                var diff = new ObjectDiff();
                diff.Diff(startObj, endObj, "a");

                Assert.AreEqual(2, diff.Added.Count);
                Assert.True(diff.Added.ContainsKey("a.users[0]"));
                Assert.True(diff.Added.ContainsKey("a.users[1]"));

                // Deleted
                diff = new ObjectDiff();
                diff.Diff(endObj, startObj, "a");

                Assert.AreEqual(2, diff.Deleted.Count);
                Assert.True(diff.Deleted.Contains("a.users[0]"));
                Assert.True(diff.Deleted.Contains("a.users[1]"));

                // Modified
                engine.Execute("var a = {};");
                engine.Execute("a.users = []");
                engine.Execute("a.users[1] = 14");
                var changedObj = engine.ExecuteAndReturn("a");

                diff = new ObjectDiff();
                diff.Diff(endObj, changedObj, "a");

                Assert.AreEqual(1, diff.Modified.Count);
                Assert.AreEqual("a.users[1]", diff.Modified.Keys.First(), "It actually equals " + diff.Modified.Keys.First());
            }
        }
Пример #4
0
        /// <summary>
        /// Package typed document asynchronously
        /// </summary>
        /// <typeparam name="T">Type of document body</typeparam>
        /// <param name="request">Request to be packaged</param>
        /// <param name="responseTask">Reponse task to be packaged</param>
        /// <returns>Packaged document</returns>
        protected async Task <IDocument <T> > PackageAndAddDocumentAsync <T>(IRestRequest request, Task <IRestResponse <T> > responseTask)
        {
            Uri requestUri                 = _restClient.BaseUrl;
            IRestResponse <T> response     = await responseTask;
            HtmlParser        parser       = new HtmlParser();
            IHtmlDocument     htmlDocument = parser.ParseDocument(response.Content);
            IDocument <T>     document     = new Document <T>(request, response, htmlDocument);

            Task <int> result      = null;
            Task <int> styleResult = null;

            if (JavascriptScrapingEnabled)
            {
                result = JavascriptEngine.AddAsync(document);
            }
            if (StyleScrapingEnabled)
            {
                styleResult = StyleEngine.AddAsync(document);
            }

            if (JavascriptScrapingEnabled && result != null)
            {
                await result;
            }
            if (StyleScrapingEnabled && styleResult != null)
            {
                await styleResult;
            }
            document.RequestUri = requestUri;
            Documents.Add(document);
            return(document);
        }
        /// <inheritdoc/>
        public override AnalysisValueIntermediateResult ResultWithArgumentRowContextValueContext(JsValue argument, AnalysisProcessingQueryResultRowExecutionContext rowContext, AnalysisProcessingValueExecutionContext valueContext)
        {
            AnalysisResultCounter resultCounter;

            if (!string.IsNullOrEmpty(rowContext.XCategoryKey))
            {
                resultCounter = valueContext.ContextForYCategoryValueXCategoryValue(rowContext.YCategoryKey, rowContext.XCategoryKey) as AnalysisResultCounter;
            }
            else
            {
                resultCounter = valueContext.ContextForYCategoryValue(rowContext.YCategoryKey) as AnalysisResultCounter;
            }

            if (resultCounter == null)
            {
                resultCounter = new AnalysisResultCounter();
                if (!string.IsNullOrEmpty(rowContext.XCategoryKey))
                {
                    valueContext.SetContextForYCategoryValueXCategoryValue(resultCounter, rowContext.YCategoryKey, rowContext.XCategoryKey);
                }
                else
                {
                    valueContext.SetContextForYCategoryValue(resultCounter, rowContext.YCategoryKey);
                }
            }

            resultCounter.AddValue(JavascriptEngine.DoubleForValue(argument));
            return(new AnalysisValueIntermediateResultDelayed(resultCounter, rowContext));
        }
Пример #6
0
 /// <summary>
 /// Secondary initializer
 /// </summary>
 /// <param name="javascriptEngine"></param>
 /// <param name="styleEngine"></param>
 /// <param name="restClient"></param>
 /// <param name="cookieContainer"></param>
 /// <param name="historyManager"></param>
 /// <param name="styleScrapingEnabled"></param>
 /// <param name="javascriptScrapingEnabled"></param>
 /// <param name="defaultUriProtocol"></param>
 public StandardCore(JavascriptEngine javascriptEngine, StyleEngine styleEngine,
                     RestClient restClient, CookieContainer cookieContainer,
                     HistoryManager historyManager, bool styleScrapingEnabled,
                     bool javascriptScrapingEnabled, string defaultUriProtocol) :
     base(javascriptEngine, styleEngine, restClient,
          cookieContainer, historyManager, styleScrapingEnabled,
          javascriptScrapingEnabled, defaultUriProtocol)
 {
 }
        /// <inheritdoc/>
        public override AnalysisValueIntermediateResult ResultWithArgumentRowContextValueContext(JsValue argument, AnalysisProcessingQueryResultRowExecutionContext rowContext, AnalysisProcessingValueExecutionContext valueContext)
        {
            double           argumentValue;
            double           weight        = 0;
            bool             defaultWeight = true;
            JavascriptEngine engine        = JavascriptEngine.Current;

            if (JavascriptEngine.IsObject(argument))
            {
                var arr = JavascriptEngine.ArrayForValue(argument);
                if (arr.Count > 0)
                {
                    object argobj = arr[0];
                    argumentValue = argobj.ToDouble();
                }
                else
                {
                    argumentValue = 0;
                }

                if (arr.Count > 1)
                {
                    object argobj = arr[1];
                    weight        = argobj.ToDouble();
                    defaultWeight = false;
                }
            }
            else
            {
                argumentValue = JavascriptEngine.DoubleForValue(argument);
            }

            if (defaultWeight)
            {
                if (rowContext.ProcessingContext.Analysis.WeightField != null)
                {
                    string weightStringValue = rowContext.Row.RawValueAtIndex(rowContext.ProcessingContext.Analysis.WeightField.QueryResultFieldIndex);
                    if (weightStringValue?.Length > 0)
                    {
                        weight = weightStringValue.ToDouble();
                    }
                    else
                    {
                        weight = 1;
                    }
                }
                else
                {
                    weight = 1;
                }
            }

            return(new AnalysisValueIntermediateResult(argumentValue * weight));
        }
Пример #8
0
 /// <summary>
 /// Default Constructor
 /// </summary>
 public BrowserCore()
 {
     _javascriptEngine           = new JavascriptEngine();
     _styleEngine                = new StyleEngine();
     _restClient                 = new RestClient();
     _restClient.CookieContainer = new CookieContainer();
     _history = new HistoryManager();
     _styleScrapingEnabled      = true;
     _javascriptScrapingEnabled = true;
     DefaultUriProtocol         = "http";
 }
        /// <inheritdoc/>
        public override AnalysisValueIntermediateResult ResultWithArgumentRowContextValueContext(JsValue argument, AnalysisProcessingQueryResultRowExecutionContext rowContext, AnalysisProcessingValueExecutionContext valueContext)
        {
            var resultCounter = valueContext.ContextForYCategoryValue("all") as AnalysisResultCounter;

            if (resultCounter == null)
            {
                resultCounter = new AnalysisResultCounter();
                valueContext.SetContextForYCategoryValue(resultCounter, "all");
            }

            resultCounter.AddValue(JavascriptEngine.DoubleForValue(argument));
            return(new AnalysisValueIntermediateResultDelayed(resultCounter, rowContext));
        }
Пример #10
0
 /// <summary>
 /// Browser core secondary constructor
 /// </summary>
 /// <param name="javascriptEngine"></param>
 /// <param name="styleEngine"></param>
 /// <param name="restClient"></param>
 /// <param name="cookieContainer"></param>
 /// <param name="historyManager"></param>
 /// <param name="styleScrapingEnabled"></param>
 /// <param name="javascriptScrapingEnabled"></param>
 /// <param name="defaultUriProtocol"></param>
 public BrowserCore(JavascriptEngine javascriptEngine, StyleEngine styleEngine,
                    RestClient restClient, CookieContainer cookieContainer,
                    HistoryManager historyManager, bool styleScrapingEnabled,
                    bool javascriptScrapingEnabled, string defaultUriProtocol)
 {
     _javascriptEngine           = javascriptEngine;
     _styleEngine                = styleEngine;
     _restClient                 = restClient;
     _restClient.CookieContainer = cookieContainer;
     _history = historyManager;
     _styleScrapingEnabled      = styleScrapingEnabled;
     _javascriptScrapingEnabled = javascriptScrapingEnabled;
     DefaultUriProtocol         = defaultUriProtocol;
 }
Пример #11
0
        /// <summary>
        /// Package typed document
        /// </summary>
        /// <typeparam name="T">Type of document body</typeparam>
        /// <param name="request"></param>
        /// <param name="response"></param>
        /// <returns></returns>
        protected IDocument <T> PackageAndAddDocument <T>(IRestRequest request, IRestResponse <T> response)
        {
            Uri           requestUri   = _restClient.BaseUrl;
            HtmlParser    parser       = new HtmlParser();
            IHtmlDocument htmlDocument = parser.ParseDocument(response.Content);
            IDocument <T> document     = new Document <T>(request, response, htmlDocument);

            if (JavascriptScrapingEnabled)
            {
                JavascriptEngine.Add(document);
            }
            if (StyleScrapingEnabled)
            {
                StyleEngine.Add(document);
            }
            document.RequestUri = requestUri;
            Documents.Add(document);
            return(document);
        }
Пример #12
0
        /// <inheritdoc/>
        public override AnalysisValueIntermediateResult ResultWithArgumentRowContextValueContext(JsValue argument, AnalysisProcessingQueryResultRowExecutionContext rowContext, AnalysisProcessingValueExecutionContext valueContext)
        {
            AnalysisResultCounter resultCounter = valueContext.ContextForYCategoryValue(rowContext.YCategoryKey) as AnalysisResultCounter;

            if (resultCounter == null)
            {
                resultCounter = new AnalysisResultCounter();
                valueContext.SetContextForYCategoryValue(resultCounter, rowContext.YCategoryKey);
            }

            string strValue = JavascriptEngine.StringForValue(argument);

            if (strValue.Length > 0 && resultCounter.ObjectForKey(strValue) == null)
            {
                resultCounter.SetObjectForKey(strValue, strValue);
                resultCounter.AddValue(1);
            }

            return(new AnalysisValueIntermediateResultDelayed(resultCounter, rowContext));
        }
Пример #13
0
        private void InitializeJS()
        {
            this.AssertRunningOnThisThread();

            Javascript = new JavascriptEngine();
            Javascript.Script.console = new
            {
                log = new Action <object>(ScriptLog)
            };
            O = new OClass(this);
#pragma warning disable CC0021 // Use nameof
            Javascript.AddObject("O", O);
#pragma warning restore CC0021 // Use nameof
            O.Init();
            if (Resources != null)
            {
                Javascript.Execute(Resources.ReadEntryPoint());
            }
            ((ManualResetEvent)EngineInitialized).Set();
        }
Пример #14
0
        public void IsArray()
        {
            var js     = new JavascriptEngine();
            var arrays = new object[] {
                js.ExecuteAndReturn("[\"a\"]"),
                new string[1] {
                    "a"
                },
            };
            var notArrays = new object[]
            {
                js.ExecuteAndReturn("\"a\""),
                new ExpandoObject(),
                new Dictionary <int, string>()
            };

            for (var i = 0; i < arrays.Length; i++)
            {
                try
                {
                    Assert.True(ObjectDiff.IsArray(arrays[i]), "Item {0} is an array", i);
                }
                catch (Exception e)
                {
                    throw new Exception($"Item {i} in arrays threw an exception", e);
                }
            }

            for (var i = 0; i < notArrays.Length; i++)
            {
                try
                {
                    Assert.False(ObjectDiff.IsArray(notArrays[i]), "Item {0} is not an array", i);
                }
                catch (Exception e)
                {
                    throw new Exception($"Item {i} in notArrays threw an exception", e);
                }
            }
        }
Пример #15
0
 public JavascriptEvalutor(ExecutionContext executionContext)
 {
     engine = new JavascriptEngine();
     scope  = engine.CreateScope(new ScriptingContext(executionContext));
 }
Пример #16
0
        /// <inheritdoc/>
        public override AnalysisValueIntermediateResult ResultWithArgumentRowContextValueContext(JsValue argument, AnalysisProcessingQueryResultRowExecutionContext rowContext, AnalysisProcessingValueExecutionContext valueContext)
        {
            double           argumentValue        = 0;
            int              currencyCode         = 0;
            bool             defaultCurrencyField = true;
            JavascriptEngine engine = JavascriptEngine.Current;

            if (JavascriptEngine.IsObject(argument))
            {
                var arr = JavascriptEngine.ArrayForValue(argument);
                if (arr.Count > 0)
                {
                    object argobj = arr[0];
                    argumentValue = argobj.ToDouble();
                }
                else
                {
                    argumentValue = 0;
                }

                if (arr.Count > 1)
                {
                    object argobj = arr[1];
                    currencyCode         = argobj.ToInt();
                    defaultCurrencyField = false;
                }
            }
            else
            {
                argumentValue = JavascriptEngine.DoubleForValue(argument);
            }

            if (defaultCurrencyField)
            {
                if (rowContext.ProcessingContext.Analysis.CurrencyField != null)
                {
                    var currencyStringValue = rowContext.Row.RawValueAtIndex(rowContext.ProcessingContext.Analysis.CurrencyField.QueryResultFieldIndex);
                    if (currencyStringValue?.Length > 0)
                    {
                        currencyCode = currencyStringValue.ToInt();
                    }
                    else
                    {
                        currencyCode = 0;
                    }
                }
                else
                {
                    currencyCode = 0;
                }
            }

            int targetCode = rowContext.ProcessingContext.Analysis.CurrentSettings.CurrencyCode;

            if (currencyCode == 0 || targetCode == 0 || currencyCode == targetCode)
            {
                return(new AnalysisValueIntermediateResult(argumentValue));
            }

            var exchangeRate = rowContext.ProcessingContext.Analysis.CurrencyConversion.ExchangeRateFromCodeToCode(currencyCode, targetCode);

            if (exchangeRate != 0)
            {
                argumentValue /= exchangeRate;
            }

            return(new AnalysisValueIntermediateResult(argumentValue));
        }
Пример #17
0
        /// <inheritdoc/>
        public override AnalysisValueIntermediateResult ResultWithArgumentRowContextValueContext(JsValue argument, AnalysisProcessingQueryResultRowExecutionContext rowContext, AnalysisProcessingValueExecutionContext valueContext)
        {
            double           val;
            string           key;
            object           valueObject;
            JavascriptEngine engine = JavascriptEngine.Current;
            var arr = JavascriptEngine.ArrayForValue(argument);

            if (arr == null)
            {
                val = JavascriptEngine.DoubleForObject(argument);
                key = null;
            }
            else
            {
                if (arr.Count > 1)
                {
                    valueObject = arr[1];
                    if (valueObject is string)
                    {
                        key = (string)valueObject;
                    }
                    else
                    {
                        key = $"{valueObject}";
                    }

                    valueObject = arr[0];
                }
                else if (arr.Count == 1)
                {
                    valueObject = arr[0];
                    key         = "const";
                }
                else
                {
                    return(new AnalysisValueIntermediateResult(0));
                }

                if (valueObject is int || valueObject is string)
                {
                    val = valueObject.ToDouble();
                }
                else
                {
                    val = 0;
                }
            }

            var resultCounter = valueContext.ContextForYCategoryValue(rowContext.YCategoryKey) as AnalysisResultCounter;

            if (resultCounter == null)
            {
                resultCounter = new AnalysisResultCounter();
                valueContext.SetContextForYCategoryValue(resultCounter, rowContext.YCategoryKey);
            }

            if (key == null)
            {
                resultCounter.AddValue(val);
            }
            else
            {
                var num = resultCounter.ObjectForKey(key);
                if (num == null)
                {
                    resultCounter.AddValue(val);
                    resultCounter.SetObjectForKey(1, key);
                }
                else
                {
                    resultCounter.SetObjectForKey(num.ToInt() + 1, key);
                }
            }

            return(new AnalysisValueIntermediateResultDelayed(resultCounter, rowContext));
        }
Пример #18
0
 public TypescriptEngine()
 {
     _javascriptEngine = new JavascriptEngine();
 }