On Mar 6, 2012, at 10:03 AM, Adrian Crum wrote:
> Replacing FSE with Groovy is a bad idea. Adam and I optimized FSE so that it
> is very lightweight and fast. I also optimized the UEL integration so there
> is very little overhead in the evaluation process. Switching everything to
> Groovy will slow things down and increase memory usage. Also keep in mind
> that Groovy creates a class for every script, so we will run out of permgen
> space again.
Ok, makes perfect sense, thank you.
>
> I think a wiser strategy would be to make mini-lang as feature complete as
> possible, and include a from-script attribute for any feature gaps. In other
> words, use from-script as a last resort - because it is costly.
+1: by the way we could still use the "from" attribute for both:
<set field="field4" from="parameters.inputField1"/> <!-- use Minilang built-in
and efficient support -->
<set field="field4" from="parameters.inputField1 + 10"/> <!-- use Minilang
built-in and efficient support: not currently supported but maybe something to
consider in the future -->
<set field="field4" from="groovy: parameters.inputField1 + 10"/> <!-- use
Groovy (inefficient) -->
Jacopo
>
>
> -Adrian
>
> On 3/6/2012 8:53 AM, Jacopo Cappellato wrote:
>> On Mar 6, 2012, at 9:32 AM, Adrian Crum wrote:
>>
>>> I don't understand what you mean by supporting a limited number of types.
>>> Currently, mini-lang supports any type - thanks to the conversion framework.
>> The conversion framework is fine; I was thinking that we could implicitly
>> (by default) treat in Minilang all the numbers as BigDecimals, all the
>> strings as GStrings/Expandable Strings; where special conversions are
>> required than the type can be specified.
>>
>>> I like the idea of changing the from-field attribute to from. I would like
>>> to see a from-script attribute added:
>>>
>>> <set field="field4" from-script="groovy: parameters.inputField1 + 10"/><!--
>>> Use Groovy -->
>>>
>> and why not:
>>
>> <set field="field4" from="parameters.inputField1"/><!-- Use Groovy
>> internally: refactor OFBiz custom code to delegate on Groovy the evaluation
>> of simple assignments; this could potentially replace FlexibleStringExpander
>> related code -->
>> <set field="field4" from="groovy: parameters.inputField1 + 10"/><!-- Use
>> Groovy explicitly to evaluate the expression (use the same "from" attribute
>> instead of a separate "from-script")-->
>> <set field="field4" from="parameters.inputField1 + 10"/><!-- Use Groovy (by
>> default, configurable) to evaluate the expression-->
>> <set field="field4" from="beanshell: parameters.inputField1 + 10"/><!-- Use
>> Beanshell to evaluate the expression-->
>>
>> ?
>>
>>> Then we can remove script support from expressions, which will eliminate
>>> ugly hacks like:
>>>
>>> <set field="field4" value="${groovy: parameters.inputField1 + 10}"/>
>>>
>> +1
>>
>> Jacopo
>>
>>> -Adrian
>>>
>>>
>>> On 3/6/2012 7:31 AM, Jacopo Cappellato wrote:
>>>> I am a big fan of Minilang too.
>>>> The "evolution" strategy that I would like to see implemented for Minilang
>>>> is actually the same one I would liketo see applied to OFBiz framework in
>>>> general: review the current usage of the tool, fix existing usage for
>>>> consistency (upgrade old code to use newer mechanisms offered by the
>>>> tool), get rid of unused or old mechanisms in the attempt to slim down the
>>>> size of the framework code, unify/simplify mechanisms based on lesson
>>>> learned; all of this could be useful even to prepare the future migration
>>>> to a different tool (e.g. Groovy).
>>>>
>>>> I know that it is very vague and doesn't add much to this thread but I
>>>> like the approach suggested by Adrian.
>>>> In my opinion, a good way to define a new version of the "set" operation
>>>> could be that of analyzing how we are currently using the operation in
>>>> OFBiz: as a starting point we could start by searching all occurrences of
>>>> "<set " string in OFBiz, then review them and see different patterns;
>>>> discuss and define the few ones that we like more, convert all code to use
>>>> them consistently, then (or in the same phase) define the new element to
>>>> better implement the patterns that we like.
>>>>
>>>> And now I am switching to the "brainstorming" mode :-)
>>>>
>>>> Kind regards,
>>>>
>>>> Jacopo
>>>>
>>>> ========================
>>>> <brainstorming>
>>>> I would like to have a "set" operation that implements some of the ideas
>>>> of the "configure by exception" concept.
>>>> As regards the type supported, but pending the review of existing usage,
>>>> we may consider to only support these:
>>>>
>>>> * Object
>>>> * List
>>>> * Map
>>>> * BigDecimal/BigInteger (all numbers in Minilang should be treated as
>>>> BigDecimal; no support for Integer, Float etc...)
>>>> * String (expander i.e. the equivalent of GString in Groovy)
>>>> * a date object
>>>>
>>>> Then we could get rid of the "from-field" attribute and replace it with a
>>>> "from" attribute that can take as input a single field (as it is now) or
>>>> an expression; some examples (all the following are evaluated using Groovy
>>>> except where a different language is specified i.e. default scripting
>>>> language):
>>>>
>>>> <set field="field1" from="parameters.inputField1"/> // field1 will have
>>>> the same type of inputField1
>>>> <set field="field2" from="parameters.inputField1 +
>>>> parameters.inputField2"/> // if inputField1 and inputField2 are numbers
>>>> then field2 will be the BigDecimal sum of the two
>>>> <set field="field3" from="parameters.inputField1 * 10"/>
>>>> <set field="field4" from="script:bsh parameters.inputField1 + 10"/> //
>>>> use Beanshell
>>>> <set field="field5" from="parameters.inputField1" type="BigDecimal"/> //
>>>> if inputField1 is a string representation of a number we can convert with
>>>> the explicit definition of the type
>>>>
>>>> For the constant values (I am not sure if it is a good idea, but for now I
>>>> will throw it out):
>>>>
>>>> <set field="stringField" value="This is a string"/>
>>>> <set field="stringField" value="This is a string with a ${variable}"/>
>>>> // the following two are equivalent
>>>> <set field="bigDecimalField" value="100"/> // the system attempt to
>>>> parse "100" as a number first (BigDecimal) and then as a string
>>>> <set field="bigDecimalField" value="100" type="BigDecimal"/>
>>>> <set field="stringField" value="100" type="String"/> // treat the field
>>>> as a string
>>>>
>>>> </brainstorming>
>>>> On Mar 5, 2012, at 9:07 PM, Adrian Crum wrote:
>>>>
>>>>> I am not one of those people. I use mini-lang almost exclusively.
>>>>>
>>>>> -Adrian
>>>>>
>>>>> On 3/5/2012 7:46 PM, Anil Patel wrote:
>>>>>> Adrian,
>>>>>> Thanks for starting this thread.
>>>>>>
>>>>>> While we all love mini-lang, I am wondering if we should really ask
>>>>>> ourselves if we really want to overhaul mini-lang or should we consider
>>>>>> alternates. From what I know, Not many people like to build application
>>>>>> using mini lang. Many end up using Java or Groovy.
>>>>>>
>>>>>> Thanks and Regards
>>>>>> Anil Patel
>>>>>> HotWax Media Inc
>>>>>>
>>>>>> On Mar 5, 2012, at 9:47 AM, Adrian Crum wrote:
>>>>>>
>>>>>>> Mini-language has evolved a lot over the years. Most of the development
>>>>>>> has occurred on an as-needed basis, so there is no clear design or
>>>>>>> implementation - things just get tacked on over time.
>>>>>>>
>>>>>>> A recent discussion has opened up the possibility to rework the
>>>>>>> mini-language<set> element. From my perspective, that task is long
>>>>>>> overdue.
>>>>>>>
>>>>>>> Also, the schemas are out of date, and they are unnecessarily
>>>>>>> complicated. So, those need a thorough going over.
>>>>>>>
>>>>>>> While we are at it, why don't we create a draft design document based
>>>>>>> on the current implementation, and then use it to look for other ways
>>>>>>> mini-language can be improved? We can all offer suggestions and
>>>>>>> comments, agree on a final design, finalize the draft, and then
>>>>>>> implement it in code. The design document then becomes the developer's
>>>>>>> reference.
>>>>>>>
>>>>>>> What do you think?
>>>>>>>
>>>>>>> -Adrian
>>>>>>>