Hey Askar, I never knew about Apache FreeMarker. Sounds like this will definitely be a good option. One reason why I am interested to use Calcite is because of custom rule definitions (custom traits), I intend to restrict the kind of queries a user can run on a given table. But I appreciate your input. :D
With regards, Soumyadeep Mukhopadhyay. On Sun, Apr 2, 2023 at 10:31 PM Askar Bozcan <[email protected]> wrote: > Hello again Soumyadeep, > Another thing I forgot to talk about. > For your use case, maybe something like Apache FreeMarker will be a better > fit as Calcite is a bit too heavy-handed for that, I feel :) > > - Askar > > On Sun, 2 Apr 2023 at 18:37, Soumyadeep Mukhopadhyay < > [email protected]> > wrote: > > > Hello Askar, > > > > Thank you so much for taking the time to compile the list I shall try > them. > > :) > > > > With regards, > > Soumyadeep Mukhopadhyay. > > > > On Sun, Apr 2, 2023 at 8:59 PM Oscar Mulin <[email protected]> > wrote: > > > > > Hey Soumyadeep, > > > I think that can work with a few caveats. > > > 0) Use the Planner from Frameworks > > > < > > > > > > https://calcite.apache.org/javadocAggregate/org/apache/calcite/tools/Frameworks.html > > > > > > > 1) Parse the “template query" into a syntax tree (a root SqlNode) but > do > > > not validate it > > > 2) Cast the root SqlNode into a SqlSelect > > > < > > > > > > https://calcite.apache.org/javadocAggregate/org/apache/calcite/sql/SqlSelect.html > > > > > > > (can > > > verify that it's a SELECT by using getKind()) > > > 3) Use the setters from SqlSelect to modify the children of root > > SqlSelect > > > node. > > > 4) Unparse the root query back into a string (SqlNode.unparse()). > > > > > > Now the tricky part is 3), as you have to set proper SqlNode types as > > > children of the SELECT node for column names, table names and for WHERE > > > predicate. I don't remember them properly, but what you can do is > parse a > > > proper query (again, don't validate it as you'll then need table > > metadata), > > > and check the kinds (getKind()) of children SqlNode's and replace them > > with > > > your replacements using setters of root SqlSelect node. > > > > > > This should work, but I'm not 100% certain as I'm unable to check right > > > now. > > > > > > PS: Take care about dialects. Dialects are used in unparsing as a > > > "configuration" of SqlWriter, and can unparse the syntax tree > differently > > > based on the dialect you have chosen. > > > > > > Kind regards, > > > Askar Bozcan > > > > > > On 2 Apr 2023, at 14:56, Soumyadeep Mukhopadhyay < > [email protected]> > > > wrote: > > > > > > Hello All, > > > > > > I have just heard of Apache Calcite and was exploring the > possibilities. > > I > > > wish to achieve the following, and wanted to check if my hunch is > > correct: > > > - Use a template to build SQL queries, like use jinja-sql or even > pebble > > > (interpret the SqlNode tree kind of structure from my template and then > > add > > > the necessary fields like table name and group by fields from an input) > > > > > > So what I am expecting is "SELECT ? FROM ? WHERE ?" would be inside a > > query > > > template (in Jinja-sql it may look like "SELECT {{select_fields | > > sqlsafe}} > > > FROM {{table_name | sqlsafe}} WHERE {{where_clause | sqlsafe}}" and > > values > > > like 'select_fields' would be substituted at run-time from a processing > > > engine like https://pypi.org/project/Jinja2/, but for Java) and the > > output > > > would be "SELECT col1 FROM table1 WHERE col1 IS NOT NULL" with some > > dialect > > > (like Snowflake or Big-Query). > > > > > > Is this possible? Any recommendations or suggestions are welcome. Even > if > > > the approach feels wrong please let me know. :) > > > Thank you for your time and consideration. > > > > > > With regards, > > > Soumyadeep Mukhopadhyay. > > > > > >
