I'm trying to understand the template definition described here.
Would it be the case that the template defines the format string and a
list of "extra objects" that are utilized by the code processing the
template?

For example, a template for IsTrue(x) might be:
    {0} = :trueValue
Then, the list of objects would have just a named parameter:
    NamedParam("trueValue", true)

Is this what was meant?

Regarding the comments on Linq... would the idea be to use this same
definition style to convert from a particular LINQ signature into a
particular HQL signature?  It basically allows you to define the
mapping in a similar way to the conversion from HQL to SQL?

Sorry if I'm slow in understanding.

       Patrick Earl

On Aug 29, 3:20 am, "Frans Bouma" <[email protected]> wrote:
> > I think the original intention for ISQLFunction was to call (dialect-
> > specific) user-defined functions (hence the name), not to create arbitrary
> > snippets of SQL.  Since the implementation has used positional parameters
> I
> > don't think you can generate the SQL you're wanting.
>
> > I think the two options you suggested are viable:  Create a new
> > interface/implementation that allows arbitrary hand-cut SQL from a
> parameter
> > list, or change the current implementation to use named parameters (which
> > would only be needed in this specific case, and we'd need to be careful to
> > generate a unique parameter name for each instance of the function call
> > within a single query).  Either one could be added to JIRA as a potential
> > improvement.
>
> > I'm guessing (but I haven't tried it) that a simpler option might be to
> just
> > render the actual parameter values into the SQL string (i.e., not
> > parameterised).  Notwithstanding that the simplest option, if it's open to
> > you, is to create a user-defined function in the database that you can
>
> call.
>
>         One solution could be similar to what console.writeline does and
> what I do in my framework as well: use {} placeholders. So if someone wants
> to call a function Foo(@a, @b), they specify the function as Foo({0}, {1}),
> and the function definition object has besides this string also a list of
> objects, which are transformed into parameters or pieces of this string
> (e.g. values, another function, etc.).
>
>         This way, the dialect or at least the part where db specific
> parameters are created, can deal with the parameter creation by transforming
> the list of objects in the function definition object to parameters or
> snippets, place them back in the list of objects and a generic piece of code
> can then transform the function definition object to a SQL snippet. So if
> you have to re-use a parameter: "FooBar({0}, {1}) <> {0}", you can.
>
>         This system is also usable for creating case statements and for
> example function mappings in linq.
>
>                 FB
>
>
>
>
>
>
>
> > Regards,
> >     Richard
>
> >    From: Fabio Maulo <mailto:[email protected]>
> >    Sent: Sunday, August 29, 2010 5:05 AM
> >    To: [email protected]
> >    Subject: Re: [nhibernate-development] Re: ISQLFunction with Repeated
> > Arguments
>
> >    Which is the problem you have found implementing
> > NullSafeEquals(p1,p2) ?
>
> >    On Sat, Aug 28, 2010 at 6:13 PM, Patrick Earl <[email protected]>
> > wrote:
>
> >            Thanks for your feedback Fabio.  The function would be
> similar
> > to
> >            EqOrNullExpression but would offer the following additional
> >            functionality:
>
> >            1.  It would work for database columns and subselects as
> well,
> > not
> >            just parameters passed from .NET.
> >            3.  The HQL function would make the code easy to read and
> > eliminate
> >            the possibility of error in this area where errors are
> common.
> >            2.  The function could easily be mapped from a LINQ method
> > call.
>
> >            For example, NullSafeEquals(x.Prop1, x.Prop2).  I see that a
> > method
> >            similar to EqOrNullExpression could be implemented to
> provide
> > support
> >            for comparing projections in the criteria API.  However, my
> > immediate
> >            problem was HQL based, and I would like this to be solvable
> > with LINQ
> >            as well.  Alternatives include implementing something like
> "IS
> >            DISTINCT FROM" as a built-in HQL operation and then having a
> > LINQ
> >            method map to that type of node.  The dialect would then
> > specifically
> >            handle the SQL implementation using the SQL-99 IS [NOT]
> > DISTINCT FROM,
> >            MySQL <=>, or the complicated clause as needed.
>
> >                   Patrick Earl
>
> >            On Aug 28, 1:13 pm, Fabio Maulo <[email protected]>
> wrote:
> >            > Personally I didn't understand which is the function you
> are
> > needing.
> >            > Can you explain a usecase ?
>
> >            > In criteria base queries with a property compared to a
> > parameter that
> >            > function is unneeded... perhaps you are thinking something
> > else than
> >            > EqOrNullExpression... I'll wait your explication.
>
> >            > On Sat, Aug 28, 2010 at 4:02 PM, Patrick Earl
> > <[email protected]> wrote:
> >            > > Solution #1 (duplicate positional parameters based on
> > template
> >            > > contents) looks to be somewhat complicated to implement.
> >            > > Solution #2 (manipulate HQL AST and parameter list)
> > doesn't work for
> >            > > ICriteria / QueryOver.
> >            > > Solution #3 (replace positional parameters with named)
> > seems
> >            > > potentially viable.
>
> >            > > I have two "big" questions:
>
> >            > > 1.  Are there cases where positional parameters are
> > required, or is it
> >            > > reasonable to always pre-process positional parameters
> > into named
> >            > > parameters?  Along with this, what kind of parameters do
> > the criteria
> >            > > API and Linq generate?  Are they always named
> parameters?
> >            > > 2.  Why is it required that the type of a null parameter
> > is known.  In
> >            > > other words, why is it necessary to call SetParameter
> with
> > a type
> >            > > overload?  Is there any way to say "put NULL in the DB
> > query and
> >            > > disregard the type?"
>
> >            > > I'll do some digging, but if anyone knows this stuff
> off-
> > hand, that'd
> >            > > be great to know.
>
> >            > >        Patrick Earl
>
> >            > > On Aug 28, 2:55 am, Patrick Earl <[email protected]>
> wrote:
> >            > > > I'm interested in implementing a function to duplicate
> > the behavior of
> >            > > > "IS NOT DISTINCT FROM" on SQL Server.  On PostgreSQL,
> > I'd simply use ?
> >            > > > 1 IS NOT DISTINCT FROM ?2 as the function template.
> On
> > SQL Server
> >            > > > though, the template involves repeating the same
> > argument: (?1 IS NULL
> >            > > > AND ?2 IS NULL) OR (?1 IS NOT NULL AND ?2 IS NOT NULL
> > AND ?1 = ?2)
>
> >            > > > Unfortunately, when used with positional parameters,
> the
> > function
> >            > > > template is not processed correctly.  The system
> > duplicates the ?
> >            > > > within the query, but it doesn't add another copy of
> the
> > parameter to
> >            > > > the parameter list.  Here are some possible techniques
> > for dealing
> >            > > > with this issue:
>
> >            > > > 1.  Create another interface like
> > ISQLParameterizedFunction that
> >            > > > allows modification of the parameter list as well.
> >            > > > 2.  Allow dialects to access the HQL AST and parameter
> > list and modify
> >            > > > them directly.
> >            > > > 3.  Replace the positional parameters with named
> > parameters.
>
> >            > > > Sadly, I'm too tired for my brain to work properly.  I
> > just wanted to
> >            > > > get these thoughts out there to see if anyone had any
> > feedback or work-
> >            > > > arounds.
>
> >            > > >         Patrick Earl
>
> >            > --
> >            > Fabio Maulo
>
> >    --
> >    Fabio Maulo

Reply via email to