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 <soumyamy...@gmail.com> 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.