<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sun-June</title>
    <description>The latest articles on DEV Community by Sun-June (@sunjune).</description>
    <link>https://dev.to/sunjune</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1179022%2F255dbeb5-a7c3-42cd-a40f-b8a1f80f2e2f.png</url>
      <title>DEV Community: Sun-June</title>
      <link>https://dev.to/sunjune</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sunjune"/>
    <language>en</language>
    <item>
      <title>solve-calculate</title>
      <dc:creator>Sun-June</dc:creator>
      <pubDate>Sat, 07 Oct 2023 01:09:47 +0000</pubDate>
      <link>https://dev.to/sunjune/solve-calculate-216g</link>
      <guid>https://dev.to/sunjune/solve-calculate-216g</guid>
      <description>&lt;p&gt;solve-calculate is a simple formula parsing and calculation tool, mainly aimed at no code or business scenarios that&lt;br&gt;
require custom formulas.&lt;/p&gt;

&lt;p&gt;github: &lt;a href="https://github.com/Sun-June/solve-calculate"&gt;https://github.com/Sun-June/solve-calculate&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple online demo： &lt;a href="https://solve-example.azurewebsites.net/"&gt;solve-calculate-example&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Minimum support for Java 1.8 and above versions.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The formula parsing and definition part of this project is inspired by the implementation&lt;br&gt;
of &lt;a href="https://javaluator.sourceforge.net/en/home/"&gt;javaluator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can also take a look at the future plans.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  How to Use
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Maven Dependency
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;
&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;info.sun-june.solve&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;solve-calculate&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;0.8.3&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Simple Example：&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;NumberCalculator is a numeric calculator, and objects involved in the operation must be numeric. It also provides a&lt;br&gt;
mixed calculator implementation, which can perform conditional and string calculations, as explained later.&lt;/p&gt;

&lt;p&gt;assertEquals is an assertion method used to verify that the results on both sides are the same.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NumberCalculatorTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;base_test&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;NumberCalculator&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NumberCalculator&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"1 + 1"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-1 + -100 + 11 * 10"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-1 + -100 + 11 * 10 - 10 * 2 + sum(2, 3)"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-1 + -100 + 11 * 10  + sum(1, 2, 5 * 2, min(5, 6, avg(8, 9 / 3 , 10 + 2 + (5 - 3))))"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-1 + -100 + 11 * 10 / 2 + 5 / 2"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;43.5d&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"1 + round(3.15 * 2.45, 2, \"ROUND_UP\")"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;8.72d&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"1 + round(3.15 * 2.45, 2, \"ROUND_DOWN\")"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;8.71d&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"1 + 2 ^ 3 / 2 + 1"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"2 + 5 % 2000‰ + 1"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"2 + round( 2 * π * 7, 0) + 1"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;        
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Simple calculation formula validity check
&lt;/h4&gt;

&lt;p&gt;Example：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NumberCalculatorTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;errorCheck&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;NumberCalculator&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NumberCalculator&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"π + sum(10, min(, 10)) - 10"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="nc"&gt;FormulaException&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;assertThrows&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FormulaException&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;checkFormula&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FormulaError&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ARGUMENT_MISSING&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;","&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;substring&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startIndex&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endIndex&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Use the &lt;code&gt;checkFormula&lt;/code&gt; method to check if the formula is correct.&lt;/li&gt;
&lt;li&gt;In case of an error, a &lt;code&gt;FormulaException&lt;/code&gt; is thrown.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;error&lt;/code&gt; represents the error code of the exception, and each code corresponds to an enum that you can use for
internationalized error messages.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;startIndex&lt;/code&gt; and &lt;code&gt;endIndex&lt;/code&gt; indicate the starting and ending positions of the error in the formula.&lt;/li&gt;
&lt;li&gt;With this information, you can better provide error messages and check the correctness of the formula.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Retrieval of Calculation History
&lt;/h4&gt;

&lt;p&gt;Example：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NumberCalculatorTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;record_test&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;NumberCalculator&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NumberCalculator&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="nc"&gt;BothValue&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Context&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;bothValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculationBoth&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-1 + -100 + 11 * 10  + sum(1, 2, 5 * 2, min(5, 6, avg(8, 9 / 3 , 10 + 2 + (5 - 3))))"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bothValue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLeft&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Gson&lt;/span&gt; &lt;span class="n"&gt;gson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Gson&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CalculationRecord&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bothValue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRight&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;recordList&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nc"&gt;Kind&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;LITERAL&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"record::"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;gson&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toJson&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;record::&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"-"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:0,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[1.0],&lt;span class="s2"&gt;"result"&lt;/span&gt;:-1,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"MONADIC_OPERATOR"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record::&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"-"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:5,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[100.0],&lt;span class="s2"&gt;"result"&lt;/span&gt;:-100,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"MONADIC_OPERATOR"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record::&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"+"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:3,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[-1,-100],&lt;span class="s2"&gt;"result"&lt;/span&gt;:-101,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"OPERATOR"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record::&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"*"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:15,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[11.0,10.0],&lt;span class="s2"&gt;"result"&lt;/span&gt;:110,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"OPERATOR"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record::&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"+"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:10,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[-101,110],&lt;span class="s2"&gt;"result"&lt;/span&gt;:9,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"OPERATOR"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record::&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"*"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:35,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[5.0,2.0],&lt;span class="s2"&gt;"result"&lt;/span&gt;:10,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"OPERATOR"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record::&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"/"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:59,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[9.0,3.0],&lt;span class="s2"&gt;"result"&lt;/span&gt;:3,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"OPERATOR"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record::&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"+"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:68,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[10.0,2.0],&lt;span class="s2"&gt;"result"&lt;/span&gt;:12,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"OPERATOR"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record::&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"-"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:77,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[5.0,3.0],&lt;span class="s2"&gt;"result"&lt;/span&gt;:2,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"OPERATOR"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record::&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"+"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:72,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[12,2],&lt;span class="s2"&gt;"result"&lt;/span&gt;:14,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"OPERATOR"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record::&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"avg"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:50,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[8.0,3,14],&lt;span class="s2"&gt;"result"&lt;/span&gt;:8.333333333333332,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"FUNCTION"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record::&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"min"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:40,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[5.0,6.0,8.333333333333332],&lt;span class="s2"&gt;"result"&lt;/span&gt;:5.0,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"FUNCTION"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record::&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"sum"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:23,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[1.0,2.0,10,5.0],&lt;span class="s2"&gt;"result"&lt;/span&gt;:18,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"FUNCTION"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record::&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"+"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:21,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[9,18],&lt;span class="s2"&gt;"result"&lt;/span&gt;:27,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"OPERATOR"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;You can use the &lt;code&gt;calculationBoth&lt;/code&gt; method to get an object that includes the calculation result and the context.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;context&lt;/code&gt; contains the entire calculation history in the &lt;code&gt;recordList&lt;/code&gt; field.

&lt;ul&gt;
&lt;li&gt;The order of calculation records corresponds to the actual calculation order.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;arithmetic&lt;/code&gt; represents the original string used for the calculation.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;index&lt;/code&gt; indicates the position in the formula.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;values&lt;/code&gt; stores the values involved in the calculation (in the order they were passed for the operation).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;result&lt;/code&gt; represents the result of this calculation.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kind&lt;/code&gt; represents the type of calculation.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Accurate identification of issues arising during calculations
&lt;/h4&gt;

&lt;p&gt;Example：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NumberCalculatorTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;calculationError&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;MixedCalculator&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MixedCalculator&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"100 - 50 / (2 - min(2, 2000)) + 1"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;CalculationException&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;assertThrows&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CalculationException&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getErrorInfo&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="nc"&gt;StandardError&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DIVISION_BY_ZERO&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pendingItem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Gson&lt;/span&gt; &lt;span class="n"&gt;gson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Gson&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;CalculationRecord&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;recordList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;recordList&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CalculationRecord&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;recordList&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nc"&gt;Kind&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;LITERAL&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"record:"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;gson&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toJson&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;record:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"min"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:16,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[2.0,2000.0],&lt;span class="s2"&gt;"result"&lt;/span&gt;:2.0,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"FUNCTION"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"-"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:14,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[2.0,2.0],&lt;span class="s2"&gt;"result"&lt;/span&gt;:0,&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"OPERATOR"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
record:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;:&lt;span class="s2"&gt;"/"&lt;/span&gt;,&lt;span class="s2"&gt;"index"&lt;/span&gt;:9,&lt;span class="s2"&gt;"values"&lt;/span&gt;:[50.0,0],&lt;span class="s2"&gt;"kind"&lt;/span&gt;:&lt;span class="s2"&gt;"OPERATOR"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;You can access the problematic &lt;code&gt;pendingItem&lt;/code&gt; in the exception's bound &lt;code&gt;context&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You can obtain the corresponding error message, the source string, and the coordinates.&lt;/li&gt;
&lt;li&gt;The execution records still contain successfully computed entries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Simple Variable Substitution
&lt;/h4&gt;

&lt;p&gt;Example：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NumberContext&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Context&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt; &lt;span class="nf"&gt;getLiteralValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;literal&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Number&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLiteralValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;literal&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;getNumberValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;literal&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt; &lt;span class="nf"&gt;getNumberValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;literal&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"π"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;literal&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PI&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ValueUtil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNumberByString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;literal&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The provided example defines a context for numeric operations (you can extend &lt;code&gt;NumberContext&lt;/code&gt; to customize the context
you need).&lt;/li&gt;
&lt;li&gt;It includes handling the conversion of &lt;code&gt;π&lt;/code&gt; to a numeric value.&lt;/li&gt;
&lt;li&gt;By following this approach, you can define which variables can be substituted into the formula for calculations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Simple Function and Operator Extensions
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;You can also add or adjust supported calculation functions and operators.

&lt;ul&gt;
&lt;li&gt;Override the corresponding retrieval methods in &lt;code&gt;NumberCalculator&lt;/code&gt; or &lt;code&gt;MixedCalculator&lt;/code&gt; to adjust what is involved
in the calculation.&lt;/li&gt;
&lt;li&gt;Alternatively, you can directly extend &lt;code&gt;Calculator&lt;/code&gt; to design your own calculator utility class.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;For extending calculation functions, refer to the implementations in the &lt;code&gt;info.sunjune.solve.calculation.function&lt;/code&gt;
package, such as &lt;code&gt;info.sunjune.solve.calculation.function.NumberFunction&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For extending operators, refer to the implementations in the &lt;code&gt;info.sunjune.solve.calculation.operator&lt;/code&gt; package, such
as &lt;code&gt;info.sunjune.solve.calculation.operator.AdditionNumberOperator&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Mixed Calculator
&lt;/h4&gt;

&lt;p&gt;Example：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MixedCalculatorTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;baseTest&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;MixedCalculator&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MixedCalculator&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-1 + -100 + 11 * 10 + \"abc\""&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"9abc"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"if(1 * 10 &amp;gt; 5, 10, \"abc\") + 2"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"if(1 * 10 &amp;lt; 5, 10, \"abc\") + 2"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"abc2"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"if(1 * 10 &amp;lt;= 5 * 2, 10, \"abc\") + 2"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"if(1 * 10 &amp;lt;= 5 * 2 || 10 &amp;lt; 3, 10, \"abc\") + 2"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"if(1 * 10 &amp;lt;= 5 * 2 &amp;amp;&amp;amp; 1 == 1, 10, \"abc\") + 2"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;In the mixed calculator implementation, &lt;code&gt;+&lt;/code&gt; can be used for string operations (other non-numeric objects are also
converted to strings for calculations).&lt;/li&gt;
&lt;li&gt;It supports comparison operators (&lt;code&gt;&amp;gt; &amp;gt;= &amp;lt; &amp;lt;= == !=&lt;/code&gt;) and logical operators (&lt;code&gt;&amp;amp;&amp;amp; ||&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Future Plans
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;del&gt;0.8.0&lt;/del&gt;

&lt;ul&gt;
&lt;li&gt;Enhance code comments&lt;/li&gt;
&lt;li&gt;Add support for common calculation functions&lt;/li&gt;
&lt;li&gt;Publish to the Maven Central Repository&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;0.9.0

&lt;ul&gt;
&lt;li&gt;Add support for chained calculations, as follows:

&lt;ul&gt;
&lt;li&gt;ProjectA, calculation formula: &lt;code&gt;num + 100&lt;/code&gt;, where &lt;code&gt;num&lt;/code&gt; is a custom variable&lt;/li&gt;
&lt;li&gt;ProjectB, calculation formula: &lt;code&gt;ProjectA - 9&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ProjectC, calculation formula: &lt;code&gt;ProjectA + ProjectB&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Add checks for chained calculations to prevent cycles&lt;/li&gt;
&lt;li&gt;Add features for recording chained calculations and more&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1.0.0

&lt;ul&gt;
&lt;li&gt;Continue to enhance chained calculations&lt;/li&gt;
&lt;li&gt;Add support for table-like data in chained calculations, including:

&lt;ul&gt;
&lt;li&gt;Calculations for each row of multi-row data, allowing the introduction of variables from outside the data&lt;/li&gt;
&lt;li&gt;Limited support for accessing data outside the multi-row data&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Post 1.0.0

&lt;ul&gt;
&lt;li&gt;Routine maintenance&lt;/li&gt;
&lt;li&gt;Introduce a TypeScript version, allowing Node.js or front-end applications to achieve the same functionality&lt;/li&gt;
&lt;li&gt;Release Java 21 version (as a separate project), which may utilize features like virtual threads to accelerate
computation&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>calculate</category>
      <category>formula</category>
    </item>
    <item>
      <title>Cosmos Surge</title>
      <dc:creator>Sun-June</dc:creator>
      <pubDate>Sat, 07 Oct 2023 01:03:17 +0000</pubDate>
      <link>https://dev.to/sunjune/cosmos-surge-275</link>
      <guid>https://dev.to/sunjune/cosmos-surge-275</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IPVir7cP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fjkdooxqzi98wdytm89g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IPVir7cP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fjkdooxqzi98wdytm89g.png" alt="logo" width="256" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;github: &lt;a href="https://github.com/Sun-June/cosmos-surge"&gt;https://github.com/Sun-June/cosmos-surge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cosmos Surge is a client tool for Azure Cosmos DB data layer.&lt;/p&gt;

&lt;p&gt;Its main purpose is to help developers or data maintenance personnel manage and operate data more conveniently.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2gNpoIS2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/50ztk86jg7r4q5jf3x6g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2gNpoIS2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/50ztk86jg7r4q5jf3x6g.png" alt="main" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Use
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: Download the Client:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Download the client from the provided link.

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Sun-June/cosmos-surge/releases"&gt;Releases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Install the client on your system.&lt;/li&gt;
&lt;li&gt;Launch the application and start using it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Option 2: Run Using Docker:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Make sure Docker is installed on your system.&lt;/li&gt;
&lt;li&gt;Pull the Cosmos Surge Tool image from Docker Hub.

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker pull sunjune/cosmos-surge:latest&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Run the tool within a Docker container.

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker run --name cosmos-surge -d -p 1212:9999 sunjune/cosmos-surge&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Finally, open your web browser.

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://localhost:1212/"&gt;http://localhost:1212&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Operating Instructions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;First, click on &lt;code&gt;Add&lt;/code&gt; or &lt;code&gt;Create Link&lt;/code&gt; to add a database link.

&lt;ul&gt;
&lt;li&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VMLIz7F9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zsulrkodxm2iny401gnm.png" alt="step1" width="800" height="276"&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;name&lt;/code&gt; is the custom name for this link.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;connectionString&lt;/code&gt; is the connection string for your cosmosdb, and the example here is for the local emulator.&lt;/li&gt;
&lt;li&gt;You can click &lt;code&gt;test&lt;/code&gt; to verify if the link is valid.&lt;/li&gt;
&lt;li&gt;If everything is correct, click &lt;code&gt;Save&lt;/code&gt; to add it.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;After adding successfully, a menu item will appear on the left, and hovering over it will reveal the following three-level menu:

&lt;ul&gt;
&lt;li&gt; &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P7qc_xaI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ulo1a4u3ueox05ctald8.png" alt="step2" width="534" height="351"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TestData2&lt;/code&gt; , &lt;code&gt;TestData&lt;/code&gt; , &lt;code&gt;BF&lt;/code&gt; correspond to the &lt;code&gt;database id&lt;/code&gt; in cosmos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Data1&lt;/code&gt;, &lt;code&gt;Data2&lt;/code&gt;, &lt;code&gt;Data3&lt;/code&gt; under &lt;code&gt;TestData&lt;/code&gt; are the &lt;code&gt;container id&lt;/code&gt; in cosmos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;REFRESH&lt;/code&gt; is for refreshing the current menu item.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EDIT&lt;/code&gt; is for re-editing the link.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DELETE&lt;/code&gt; is for removing the current link.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Clicking on the third-level menu &lt;code&gt;Data1&lt;/code&gt; will show the following operation interface:

&lt;ul&gt;
&lt;li&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GLsxFIje--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bsxqmxy6uj2mzwb0k5va.png" alt="step3" width="800" height="187"&gt;&lt;/li&gt;
&lt;li&gt;The tabs in the main interface are the operation panels for the current &lt;code&gt;container&lt;/code&gt; (multiple can be opened at the same time).&lt;/li&gt;
&lt;li&gt;The list displays the &lt;code&gt;partition&lt;/code&gt; classifications in the current database. You can quickly query by selecting (multi-selectable), and the query results are paginated.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;After clicking the query, the result will be displayed as follows:

&lt;ul&gt;
&lt;li&gt; &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6IPyp9SM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7sfe7821asdo5qpveo1u.png" alt="step4" width="800" height="347"&gt;
&lt;/li&gt;
&lt;li&gt;In the interface, the upper part is the selected &lt;code&gt;partition&lt;/code&gt; and related operation buttons.&lt;/li&gt;
&lt;li&gt;The middle part is the corresponding query SQL and pagination information.&lt;/li&gt;
&lt;li&gt;The SQL can be edited, and after editing, you can click &lt;code&gt;query&lt;/code&gt; to execute the query.&lt;/li&gt;
&lt;li&gt;The lower part displays the main query content for viewing, modification, and deletion.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;After modifying the data, you can click &lt;code&gt;Update items&lt;/code&gt; to update:

&lt;ul&gt;
&lt;li&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nnPEr-9v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2mam57570qlx0rxifh2m.png" alt="step5" width="800" height="617"&gt;&lt;/li&gt;
&lt;li&gt;The update operation, as shown in the figure, will display the comparison of the data to be changed this time.&lt;/li&gt;
&lt;li&gt;After confirming, click &lt;code&gt;update&lt;/code&gt; to perform the update operation.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;You can also perform deletion operations. After deleting the data, click &lt;code&gt;Delete items&lt;/code&gt; to delete:

&lt;ul&gt;
&lt;li&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ruX2jXVm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wtl1bhk9pg7worjcyx2h.png" alt="step6" width="785" height="746"&gt;&lt;/li&gt;
&lt;li&gt;The displayed data will be deleted. After confirming, click &lt;code&gt;delete&lt;/code&gt; to confirm the deletion.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Functions&lt;/code&gt; button group:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;add&lt;/code&gt; allows you to add new data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;history&lt;/code&gt; allows you to view the operation records.&lt;/li&gt;
&lt;li&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GgHiiNgq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nig89a1v5e24qsmlp1o3.png" alt="step7" width="800" height="209"&gt;&lt;/li&gt;
&lt;li&gt;The tabs are types of operations.&lt;/li&gt;
&lt;li&gt;The current page is the update log just performed, and clicking &lt;code&gt;update details...&lt;/code&gt; will show the data at that time.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;export&lt;/code&gt; button allows you to import the current query result data into another &lt;code&gt;container&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--urfnXBpY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oxs0cialvir9wikbhxvs.png" alt="step8" width="800" height="181"&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;toId&lt;/code&gt; is the target &lt;code&gt;container&lt;/code&gt; you selected.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Handling duplicate data&lt;/code&gt; is the way to handle identical data (i.e., data with the same id and partition).

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;upsert&lt;/code&gt; is for forceful update.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;skip&lt;/code&gt; is for skipping without processing.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;After confirming, click &lt;code&gt;Do&lt;/code&gt; to start.&lt;/li&gt;
&lt;li&gt;The execution interface is as follows:

&lt;ul&gt;
&lt;li&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kQio_oQ9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kq7fnqs9c9tzevtkef8u.png" alt="step9" width="800" height="259"&gt;&lt;/li&gt;
&lt;li&gt;The execution interface can be closed.&lt;/li&gt;
&lt;li&gt;It contains various progress information and corresponding SQL statement information.&lt;/li&gt;
&lt;li&gt;There are pause and cancel buttons in the upper right corner.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Local Development or Packaging
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Local Development
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Start by cloning the project for the view layer as well from this address:&lt;a href="https://github.com/Sun-June/cosmos-surge-view"&gt;cosmos-surge-view&lt;/a&gt; .

&lt;ul&gt;
&lt;li&gt;First, run the command &lt;code&gt;npm install&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Then, execute &lt;code&gt;npm run dev&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Clone the current project as well.

&lt;ul&gt;
&lt;li&gt;First, run the command &lt;code&gt;npm install&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Then, execute &lt;code&gt;npm run start&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;At this point, you will see Electron starting, and you can proceed with debugging and development.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Local Packaging
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Begin by cloning the project for the view layer as well from this address:&lt;a href="https://github.com/Sun-June/cosmos-surge-view"&gt;cosmos-surge-view&lt;/a&gt; .

&lt;ul&gt;
&lt;li&gt;First, run the command &lt;code&gt;npm install&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Then, execute &lt;code&gt;npm run build&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Prepare the files from the &lt;code&gt;dist&lt;/code&gt; directory for use in the next steps.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Also, clone the current project.

&lt;ul&gt;
&lt;li&gt;First, run the command &lt;code&gt;npm install&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Then, copy the contents of the &lt;code&gt;dist&lt;/code&gt; directory prepared earlier into the &lt;code&gt;static&lt;/code&gt; directory of the current project.&lt;/li&gt;
&lt;li&gt;If the &lt;code&gt;static&lt;/code&gt; directory does not exist, you will need to create it yourself.&lt;/li&gt;
&lt;li&gt;Finally, execute the appropriate command based on your platform:&lt;/li&gt;
&lt;li&gt;For Mac: &lt;code&gt;npm run package:mac&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For Windows: &lt;code&gt;npm run package:win&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cosmosdb</category>
      <category>electron</category>
      <category>typescript</category>
      <category>react</category>
    </item>
  </channel>
</rss>
