For posterity's sake and future-searchers, I just hit this error again
under different circumstances and wanted to share why here.
The value of the second parameter ("name") to "JdbcSchema.create()" is
apparently very important.
Somehow I was passing something that was causing it to look for things that
didn't exist during query execution.
If you hit this error, check that:
1) You are getting a RelRunner from the CalciteConnection, so it can
actually execute
2) You are passing valid values to "name" in JdbcSchema.create()
I'm not sure what the extent/purpose of the "name" value is, but it's been
related to two things I've hit now, so it's got to be critical.
On Mon, Jan 3, 2022 at 3:44 PM Gavin Ray <[email protected]> wrote:
> Ahhh -- thanks for the code sample Gunnar and the clarification that you
> can do it two ways Julian.
>
> Data-source metadata updates should be infrequent
> I can try to use a mutex/arc for the global SchemaPlus
>
> Think it would be really beneficial to have a single schema tree that can
> see every data source, but
> will try both ways just to be sure
>
>
> On Mon, Jan 3, 2022 at 3:28 PM Julian Hyde <[email protected]> wrote:
>
>> Gunnar’s point is a good one. To make it a little more explicit: if the
>> value of the the “model” parameter starts with “inline:”, the model is just
>> the rest of the string.
>>
>> As to whether you use models or deal with the SchemaPlus API directly.
>> It’s your decision based on how much concurrency control you want to do. If
>> you use the SchemaPlus API, you can use the same schema tree for successive
>> requests, and even for concurrent requests. But you’d better be sure that
>> one request is not mutating the tree while another request is using it.
>> Generating a new model string (and hence a new schema tree) for each
>> request is a little less efficient but much safer.
>>
>>
>> > On Jan 3, 2022, at 12:20 PM, Gunnar Morling
>> <[email protected]> wrote:
>> >
>> > Am Mo., 3. Jan. 2022 um 20:44 Uhr schrieb Gavin Ray <
>> [email protected] <mailto:[email protected]>>:
>> >
>> >> @Stamatis
>> >>
>> >> Thank you, I actually did not know that! That's useful information to
>> >> have =)
>> >>
>> >> @Julian
>> >>
>> >> Is it possible to programmatically generate the JSON model? Why I ask
>> is
>> >> because part of the functionality I'm trying to mirror is the ability
>> to
>> >> add
>> >> data sources dynamically while the app server is running
>> >>
>> >> So you might send a POST /metadata/datasource saying "Here is the info
>> of a
>> >> new
>> >> data source I would like you to connect to" And then I need to figure
>> out
>> >> how to
>> >> handle creating a Calcite source from it and adding the new datasource
>> +
>> >> schemas
>> >> to the global pool of registered ones, if that makes sense
>> >>
>> >> Worst case I could write the JSON file to disk and load from the
>> tempfile I
>> >> suppose, right?
>> >>
>> >
>> > No need for writing to disk, you just can pass in a String representing
>> the
>> > JSON model. Here's an example:
>> >
>> >
>> >
>> https://github.com/moditect/jfr-analytics/blob/main/src/test/java/org/moditect/jfranalytics/JfrSchemaFactoryTest.java#L381-L388
>> <
>> https://github.com/moditect/jfr-analytics/blob/main/src/test/java/org/moditect/jfranalytics/JfrSchemaFactoryTest.java#L381-L388
>> >
>> >
>> > Hth,
>> >
>> > --Gunnar
>> >
>> >
>> >>
>> >>
>> >>
>> >> On Mon, Jan 3, 2022 at 1:30 PM Julian Hyde <[email protected]>
>> wrote:
>> >>
>> >>>> Will try to figure out how to manually perform the process of
>> creating
>> >> a
>> >>>> proper "Connection" object and adding the schemas to it.
>> >>>
>> >>>
>> >>> Generally the best way is to write a JSON model, and then create a
>> >>> connection using ‘jdbc:calcite:…model=...'. For that to work, your
>> >>> component needs to implement ‘interface SchemaFactory’, i.e. be an
>> >> adapter.
>> >>>
>> >>> Julian
>>
>>