[DISCUSS] FLIP-68: Extend Core Table System with Modular Plugins

classic Classic list List threaded Threaded
21 messages Options
12
Reply | Threaded
Open this post in threaded view
|

Re: [DISCUSS] FLIP-68: Extend Core Table System with Modular Plugins

bowen.li
Hi all,

I have updated the doc to reflect the discussion results. I will start a
voting thread shortly. Thanks!

Bowen

On Fri, Oct 11, 2019 at 12:44 AM Timo Walther <[hidden email]> wrote:

> I'm fine with `type` for consistency reasons for now. I hope we will fix
> that when we rework the properties design.
>
> @Bowen: could you update the wiki page? I think we could start a vote,
> right?
>
> Regards,
> Timo
>
> On 11.10.19 04:31, Jark Wu wrote:
> > Hi Timo,
> >
> > I agree that we are going to rework properties soon.
> > But we may come up with a better name or a better way than "kind" when
> the
> > proposal is started and more people involved.
> > On the other hand, reworking properties should be a compatible way.
> > So I think it's fine to use "type" for now (keep consistent with others)
> > and change them all together when refactoring in the near future.
> >
> > Regards,
> > Jark
> >
> > On Thu, 10 Oct 2019 at 21:12, Timo Walther <[hidden email]> wrote:
> >
> >> Hi Jark,
> >>
> >> restricting one module instance per kind sounds good to me. Modules can
> >> implement hashCode/equals and we can perform the check you metioned. The
> >> equals() method can determine what "same kind" means.
> >>
> >> Correct me if I'm wrong, but we wanted to perform a big properties
> >> rework soonish anyway, no? Then we can also change `connector.type` to
> >> `connector.kind`?
> >>
> >> In Calcite they distinguish between `type` and `kind`:
> >>
> >> SqlOperator(
> >>         String name,
> >>         SqlKind kind,
> >>         int leftPrecedence,
> >>         int rightPrecedence,
> >>         SqlReturnTypeInference returnTypeInference,
> >>         SqlOperandTypeInference operandTypeInference,
> >>         SqlOperandTypeChecker operandTypeChecker
> >>
> >> In Flink 1.9, we also started with
> >> org.apache.flink.table.functions.FunctionDefinition#getKind because type
> >> is just heavily overloaded with different meanings. Logical type, data
> >> type, connector type, etc.
> >>
> >> Regards,
> >> Timo
> >>
> >>
> >> On 10.10.19 14:40, Jark Wu wrote:
> >>> Hi Timo,
> >>>
> >>> Thanks for the explanation, it makes sense to me.
> >>> So at least, we can have a validation to restrict one module instance
> per
> >>> type in the first version.
> >>>
> >>> Regarding to "type" vs "kind", could we use "datatype" keyword to refer
> >>> data types exclusively in the future?
> >>> This can avoid the conflict/confusion when we use "type" here.
> >>> The concern of using "kind" is that it is inconsistent with other
> >>> descriptor properties.
> >>> We have heavily used "type" in properties, including `connector.type`,
> >>> `format.type`, `catalog.type`, etc...
> >>> Are we planning to change them all ?
> >>>
> >>> Best,
> >>> Jark
> >>>
> >>> On Thu, 10 Oct 2019 at 19:56, Timo Walther <[hidden email]> wrote:
> >>>
> >>>> Hi Jark,
> >>>>
> >>>> we had a long offline discussion yesterday where we considered all
> >>>> options again. The reasons why we decided for the updated design that
> >>>> Bowen suggested:
> >>>>
> >>>> - Both Dawid and Xuefu argued that in the old design "kind" has binary
> >>>> meanings. I agree here.
> >>>> - Compared to other SQL concepts such as tables/functions/catalogs, a
> >>>> "name" is never part of the object itself but always specified when
> >>>> registering the object. We should have the same behavior for modules
> >>>> because of consistency reasons. It also makes the "name" explicit when
> >>>> it comes to unloading the module compared to the previous design.
> >>>> - Regarding, "How to solve the class conflict problem?" this is an
> >>>> orthogonal issue that will be fixed in future versions once we use
> >>>> Flink's new plugin architecture. If a module is parameterizable, it is
> >>>> the responsibility of the module to prevent class conflicts. If the
> Hive
> >>>> classes are hidden in a module classloader, it should be possible to
> >>>> load both hive121 and hive234. But in general this problem is unsolved
> >>>> for now, also Kafka tables could clash if you read from two Kafka
> >>>> clusters with different versions.
> >>>>
> >>>> Regards,
> >>>> Timo
> >>>>
> >>>>
> >>>> On 10.10.19 08:01, Jark Wu wrote:
> >>>>> Hi Xuefu,
> >>>>>
> >>>>> If there is only one instance per type, then what's the "name" used
> >> for?
> >>>>> Could we remove it and only keep "type" or "kind" to identify
> modules?
> >>>>>
> >>>>> Best,
> >>>>> Jark
> >>>>>
> >>>>> On Thu, 10 Oct 2019 at 11:21, Xuefu Z <[hidden email]> wrote:
> >>>>>
> >>>>>> Jark has a good point. However, I think validation logic can put in
> >>>> place
> >>>>>> to restrict one instance per type. Maybe the doc needs to be
> specific
> >> on
> >>>>>> this.
> >>>>>>
> >>>>>> Thanks,
> >>>>>> Xuefu
> >>>>>>
> >>>>>> On Wed, Oct 9, 2019 at 7:41 PM Jark Wu <[hidden email]> wrote:
> >>>>>>
> >>>>>>> Thanks Bowen for the updating.
> >>>>>>>
> >>>>>>> I have some different opinions on the change.
> >>>>>>> IIUC, in the previous design, the "name" is also the "id" or "type"
> >> to
> >>>>>>> identify which module to load. Which means we can only load one
> >>>> instance
> >>>>>> of
> >>>>>>> a module.
> >>>>>>> In the new design, the "name" is just an alias to the module
> >> instance,
> >>>>>> the
> >>>>>>> "kind" is used to identify modules. Which means we can load
> different
> >>>>>>> instances of a module.
> >>>>>>> However, what's the "name" or alias used for? Do we need to support
> >>>>>> loading
> >>>>>>> different instances of a module? From my point of view, it brings
> >> more
> >>>>>>> complexity and confusion.
> >>>>>>> For example, if we load a "hive121" which uses HiveModule with
> >> version
> >>>>>>> 1.2.1 and load a "hive234" which uses HiveModule with version
> 2.3.4,
> >>>> then
> >>>>>>> how to solve the class conflict problem?
> >>>>>>>
> >>>>>>> IMO, a module can only be load once in a session, so "name" maybe
> >>>>>> useless.
> >>>>>>> So my proposal is similar to the previous one, but only change
> "name"
> >>>> to
> >>>>>>> "kind".
> >>>>>>>
> >>>>>>>       SQL:
> >>>>>>>             LOAD MODULE "kind" [WITH (properties)];
> >>>>>>>             UNLOAD MODULE "kind";
> >>>>>>>        Table:
> >>>>>>>             tEnv.loadModule("kind" [, properties]);
> >>>>>>>             tEnv.unloadModule("kind");
> >>>>>>>
> >>>>>>> What do you think?
> >>>>>>>
> >>>>>>>
> >>>>>>> Best,
> >>>>>>> Jark
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>> On Wed, 9 Oct 2019 at 20:38, Bowen Li <[hidden email]> wrote:
> >>>>>>>
> >>>>>>>> Thanks everyone for your review.
> >>>>>>>>
> >>>>>>>> After discussing with Timo and Dawid offline, as well as
> >> incorporating
> >>>>>>>> feedback from Xuefu and Jark on mailing list, I decided to make a
> >> few
> >>>>>>>> critical changes to the proposal.
> >>>>>>>>
> >>>>>>>> - renamed the keyword "type" to "kind". The community has plan to
> >> have
> >>>>>>>> "type" keyword in yaml/descriptor refer to data types exclusively
> in
> >>>>>> the
> >>>>>>>> near future. We should cater to that change in our design
> >>>>>>>> - allowed specifying names for modules to simplify and unify
> module
> >>>>>>>> loading/unloading syntax between programming and SQL. Here're the
> >>>>>>> proposed
> >>>>>>>> changes:
> >>>>>>>>        SQL:
> >>>>>>>>             LOAD MODULE "name" WITH ("kind"="xxx" [,
> (properties)])
> >>>>>>>>             UNLOAD MODULE "name";
> >>>>>>>>        Table:
> >>>>>>>>             tEnv.loadModule("name", new Xxx(properties));
> >>>>>>>>             tEnv.unloadModule("name");
> >>>>>>>>
> >>>>>>>> I have completely updated the google doc [1]. Please take another
> >>>> look,
> >>>>>>> and
> >>>>>>>> let me know if you have any other questions. Thanks!
> >>>>>>>>
> >>>>>>>> [1]
> >>>>>>>>
> >>>>>>>>
> >>
> https://docs.google.com/document/d/17CPMpMbPDjvM4selUVEfh_tqUK_oV0TODAUA9dfHakc/edit#
> >>>>>>>> On Tue, Oct 8, 2019 at 6:26 AM Jark Wu <[hidden email]> wrote:
> >>>>>>>>
> >>>>>>>>> Hi Bowen,
> >>>>>>>>>
> >>>>>>>>> Thanks for the proposal. I have two thoughts:
> >>>>>>>>>
> >>>>>>>>> 1) Regarding to "loadModule", how about
> >>>>>>>>> tableEnv.loadModule("xxx" [, propertiesMap]);
> >>>>>>>>> tableEnv.unloadModule(“xxx”);
> >>>>>>>>>
> >>>>>>>>> This makes the API similar to SQL. IMO, instance of Module is not
> >>>>>>> needed
> >>>>>>>>> and verbose as parameter.
> >>>>>>>>> And this makes it easier to load a simple module without any
> >>>>>> additional
> >>>>>>>>> properties, e.g. tEnv.loadModule("GEO"), tEnv.unloadModule("GEO")
> >>>>>>>>>
> >>>>>>>>> 2) In current design, the module interface only defines function
> >>>>>>>> metadata,
> >>>>>>>>> but no implementations.
> >>>>>>>>> I'm wondering how to call/map the implementations in runtime? Am
> I
> >>>>>>>> missing
> >>>>>>>>> something?
> >>>>>>>>>
> >>>>>>>>> Besides, I left some minor comments in the doc.
> >>>>>>>>>
> >>>>>>>>> Best,
> >>>>>>>>> Jark
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>> On Sat, 5 Oct 2019 at 08:42, Xuefu Z <[hidden email]> wrote:
> >>>>>>>>>
> >>>>>>>>>> I agree with Timo that the new table APIs need to be consistent.
> >>>>>> I'd
> >>>>>>> go
> >>>>>>>>>> further that an name (or id) is needed for module definition in
> >>>>>> YAML
> >>>>>>>>> file.
> >>>>>>>>>> In the current design, name is skipped and type has binary
> >>>>>> meanings.
> >>>>>>>>>> Thanks,
> >>>>>>>>>> Xuefu
> >>>>>>>>>>
> >>>>>>>>>> On Fri, Oct 4, 2019 at 5:24 AM Timo Walther <[hidden email]
> >
> >>>>>>>> wrote:
> >>>>>>>>>>> Hi everyone,
> >>>>>>>>>>>
> >>>>>>>>>>> first, I was also questioning my proposal. But Bowen's proposal
> >>>>>> of
> >>>>>>>>>>> `tEnv.offloadToYaml(<file_path>)` would not work with the
> current
> >>>>>>>>> design
> >>>>>>>>>>> because we don't know how to serialize a catalog or module into
> >>>>>>>>>>> properties. Currently, there is no converter from instance to
> >>>>>>>>>>> properties. It is a one way conversion. We can add a
> >>>>>> `toProperties`
> >>>>>>>>>>> method to both Catalog and Module class in the future to solve
> >>>>>>> this.
> >>>>>>>>>>> Solving the table environment serializability can be future
> work.
> >>>>>>>>>>>
> >>>>>>>>>>> However, I find the current proposal for the TableEnvironment
> >>>>>>> methods
> >>>>>>>>> is
> >>>>>>>>>>> contradicting:
> >>>>>>>>>>>
> >>>>>>>>>>> tableEnv.loadModule(new Yyy());
> >>>>>>>>>>> tableEnv.unloadModule(“Xxx”);
> >>>>>>>>>>>
> >>>>>>>>>>> The loading is specified programmatically whereas the unloading
> >>>>>>>>> requires
> >>>>>>>>>>> a string that is not specified in the module itself. But is
> >>>>>> defined
> >>>>>>>> in
> >>>>>>>>>>> the factory according to the current design.
> >>>>>>>>>>>
> >>>>>>>>>>> SQL does it more consistently. There, the name `xxx` is used
> when
> >>>>>>>>>>> loading and unloading the module:
> >>>>>>>>>>>
> >>>>>>>>>>> LOAD MODULE 'xxx' [WITH ('prop'='myProp', ...)]
> >>>>>>>>>>> UNLOAD MODULE 'xxx’
> >>>>>>>>>>>
> >>>>>>>>>>> How about:
> >>>>>>>>>>>
> >>>>>>>>>>> tableEnv.loadModule("xxx", new Yyy());
> >>>>>>>>>>> tableEnv.unloadModule(“xxx”);
> >>>>>>>>>>>
> >>>>>>>>>>> This would be similar to the catalog interfaces. The name is
> not
> >>>>>>> part
> >>>>>>>>> of
> >>>>>>>>>>> the instance itself.
> >>>>>>>>>>>
> >>>>>>>>>>> What do you think?
> >>>>>>>>>>>
> >>>>>>>>>>> Thanks,
> >>>>>>>>>>> Timo
> >>>>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>> On 01.10.19 21:17, Bowen Li wrote:
> >>>>>>>>>>>> If something like the yaml file is the way to go and achieve
> >>>>>> such
> >>>>>>>>>>>> motivation, we would cover that with current design.
> >>>>>>>>>>>>
> >>>>>>>>>>>> On Tue, Oct 1, 2019 at 12:05 Bowen Li <[hidden email]>
> >>>>>>> wrote:
> >>>>>>>>>>>>> Hi Timo, Dawid,
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> I've added the suggested SQL and related changes to
> >>>>>>>> TableEnvironment
> >>>>>>>>>> API
> >>>>>>>>>>>>> and other classes to the google doc. Also removed "USE
> MODULE"
> >>>>>>> and
> >>>>>>>>> its
> >>>>>>>>>>>>> APIs. Will update FLIP wiki once we have a consensus.
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> W.r.t. descriptor approach, my gut feeling is similar to
> >>>>>>> Dawid's.
> >>>>>>>>>>> Besides,
> >>>>>>>>>>>>> I feel yaml file would be a better solution to persist
> >>>>>>>> serializable
> >>>>>>>>>>> state
> >>>>>>>>>>>>> of an environment as the file itself is in serializable
> format
> >>>>>>>>>> already.
> >>>>>>>>>>>>> Though yaml file only serves SQL CLI at this moment, we may
> be
> >>>>>>>> able
> >>>>>>>>> to
> >>>>>>>>>>>>> extend its reach to Table API and allow users to load/offload
> >>>>>> a
> >>>>>>>>>>>>> TableEnvironment from/to yaml files, as something like
> >>>>>>>>>> "TableEnvironment
> >>>>>>>>>>>>> tEnv = TableEnvironment.loadFromYaml(<file_path>)" and
> >>>>>>>>>>>>> "tEnv.offloadToYaml(<file_path>)" to restore and persist
> >>>>>> state,
> >>>>>>>> and
> >>>>>>>>>> try
> >>>>>>>>>>> to
> >>>>>>>>>>>>> make yaml file more expressive.
> >>>>>>>>>>>>>
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> On Tue, Oct 1, 2019 at 6:47 AM Dawid Wysakowicz <
> >>>>>>>>>> [hidden email]
> >>>>>>>>>>>>> wrote:
> >>>>>>>>>>>>>
> >>>>>>>>>>>>>> Hi Timo, Bowen,
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Unfortunately I did not have enough time to go through all
> >>>>>> the
> >>>>>>>>>>>>>> suggestions in details so I can not comment on the whole
> >>>>>> FLIP.
> >>>>>>>>>>>>>> I just wanted to give my opinion on the "descriptor approach
> >>>>>> in
> >>>>>>>>>>>>>> loadModule" part. I am not sure if we need it here. We might
> >>>>>> be
> >>>>>>>>>>>>>> overthinking this a bit. It definitely makes sense for
> >>>>>> objects
> >>>>>>>> like
> >>>>>>>>>>>>>> TableSource/TableSink etc. as they are logical definitions
> >>>>>> that
> >>>>>>>>>> nearly
> >>>>>>>>>>>>>> always have to be persisted in a Catalog. I'm not sure if we
> >>>>>>>> really
> >>>>>>>>>>> need
> >>>>>>>>>>>>>> the same for a whole session. If we need a resume session
> >>>>>>>> feature,
> >>>>>>>>>> the
> >>>>>>>>>>>>>> way to go would probably be to keep the session in memory on
> >>>>>>> the
> >>>>>>>>>> server
> >>>>>>>>>>>>>> side. I fear we will never be able to serialize the whole
> >>>>>>> session
> >>>>>>>>>>>>>> entirely (temporary objects, objects derived from DataStream
> >>>>>>>> etc.)
> >>>>>>>>>>>>>> I think it is ok to use instances for objects like Catalogs
> >>>>>> or
> >>>>>>>>>> Modules
> >>>>>>>>>>>>>> and have an overlay on top of that that can create instances
> >>>>>>> from
> >>>>>>>>>>>>>> properties.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Best,
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Dawid
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> On 01/10/2019 11:28, Timo Walther wrote:
> >>>>>>>>>>>>>>> Hi Bowen,
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> thanks for your response.
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> Re 2) I also don't have a better approach for this issue.
> It
> >>>>>>> is
> >>>>>>>>>>>>>>> similar to changing the general TableConfig between two
> >>>>>>>>> statements.
> >>>>>>>>>> It
> >>>>>>>>>>>>>>> would be good to add your explanation to the design
> >>>>>> document.
> >>>>>>>>>>>>>>> Re 3) It would be interesting to know about which "core"
> >>>>>>>> functions
> >>>>>>>>>> we
> >>>>>>>>>>>>>>> are actually talking about. Also for the overriding
> built-in
> >>>>>>>>>> functions
> >>>>>>>>>>>>>>> that we discussed in the other FLIP. But I'm fine with
> >>>>>> leaving
> >>>>>>>> it
> >>>>>>>>> to
> >>>>>>>>>>>>>>> the user for now. How about we just introduce loadModule(),
> >>>>>>>>>>>>>>> unloadModule() methods instead of useModules()? This would
> >>>>>>>> ensure
> >>>>>>>>>> that
> >>>>>>>>>>>>>>> users don't forget to add the core module when adding an
> >>>>>>>>> additional
> >>>>>>>>>>>>>>> module and they need to explicitly call
> >>>>>>> "unloadModule('core')".
> >>>>>>>>>>>>>>> Re 4) Every table environment feature should also be
> >>>>>> designed
> >>>>>>>> with
> >>>>>>>>>> SQL
> >>>>>>>>>>>>>>> statements in mind to verify the concept. SQL is also more
> >>>>>>>> popular
> >>>>>>>>>>>>>>> that Java/Scala API or YAML file. I would like to add it to
> >>>>>>> 1.10
> >>>>>>>>> for
> >>>>>>>>>>>>>>> marking the feature as complete.
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> SHOW MODULES -> sounds good to me, we should add a
> >>>>>>>> listModules():
> >>>>>>>>>>>>>>> List<String> method to table environment
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> LOAD MODULE 'hive' [WITH ('prop'='myProp', ...)] --> we
> >>>>>> should
> >>>>>>>>> add a
> >>>>>>>>>>>>>>> loadModule() method to table environment
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> UNLOAD MODULE 'hive' --> we should add a unloadModule()
> >>>>>> method
> >>>>>>>> to
> >>>>>>>>>>>>>>> table environment
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> I would not introduce `USE MODULES 'x' 'y' 'z'` for
> >>>>>> simplicity
> >>>>>>>> and
> >>>>>>>>>>>>>>> concise API. Users need to load the module anyway with
> >>>>>>>> properties.
> >>>>>>>>>>>>>>> They can also load them "in order" immediately. CREATE
> TABLE
> >>>>>>> can
> >>>>>>>>>> also
> >>>>>>>>>>>>>>> not create multiple tables but only one at a time in that
> >>>>>>> order.
> >>>>>>>>>>>>>>> One thing that came to my mind, shall we use a descriptor
> >>>>>>>> approach
> >>>>>>>>>> for
> >>>>>>>>>>>>>>> loadModule()? The past has shown that passing instances
> >>>>>> causes
> >>>>>>>>>>>>>>> problems when persisting objects. That's why we also want
> to
> >>>>>>> get
> >>>>>>>>> rid
> >>>>>>>>>>>>>>> of registerTableSource. I could image that users might want
> >>>>>> to
> >>>>>>>>>> persist
> >>>>>>>>>>>>>>> a table environment's state for later use in the future.
> >>>>>> Even
> >>>>>>>>> though
> >>>>>>>>>>>>>>> this is future work, we should already keep such use cases
> >>>>>> in
> >>>>>>>> mind
> >>>>>>>>>>>>>>> when adding new API methods. What do you think?
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> Regards,
> >>>>>>>>>>>>>>> Timo
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> On 30.09.19 23:17, Bowen Li wrote:
> >>>>>>>>>>>>>>>> Hi Timo,
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> Re 1) I agree. I renamed the title to "Extend Core Table
> >>>>>>> System
> >>>>>>>>>> with
> >>>>>>>>>>>>>>>> Pluggable Modules" and all internal references
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> Re 2) First, I'll rename the API to useModules(). The
> >>>>>> design
> >>>>>>>>>> doesn't
> >>>>>>>>>>>>>>>> forbid
> >>>>>>>>>>>>>>>> users to call useModules() multi times. Objects in modules
> >>>>>>> are
> >>>>>>>>>> loaded
> >>>>>>>>>>>>>> on
> >>>>>>>>>>>>>>>> demand instead of eagerly, so there won't be
> inconsistency.
> >>>>>>>> Users
> >>>>>>>>>>>>>>>> have to
> >>>>>>>>>>>>>>>> be fully aware of the consequences of resetting modules as
> >>>>>>> that
> >>>>>>>>>> might
> >>>>>>>>>>>>>>>> cause
> >>>>>>>>>>>>>>>> that some objects can not be referenced anymore or
> >>>>>> resolution
> >>>>>>>>> order
> >>>>>>>>>>>>>>>> of some
> >>>>>>>>>>>>>>>> objects changes.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> Re 3) Yes, we'd leave that to users.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> Another approach can be to have a non-optional "Core"
> >>>>>> module
> >>>>>>>> for
> >>>>>>>>>> all
> >>>>>>>>>>>>>>>> objects that cannot be overrode like "CAST" and "AS"
> >>>>>>> functions,
> >>>>>>>>> and
> >>>>>>>>>>>>>>>> have an
> >>>>>>>>>>>>>>>> optional "ExtendedCore" module for other replaceable
> >>>>>> built-in
> >>>>>>>>>>> objects.
> >>>>>>>>>>>>>>>> "Core" should be positioned at the 1st in module list all
> >>>>>> the
> >>>>>>>>> time.
> >>>>>>>>>>>>>>>> I'm fine with either solution.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> Re 4) It may sound like a nice-to-have advanced feature
> for
> >>>>>>>> 1.10,
> >>>>>>>>>> but
> >>>>>>>>>>>>>> we
> >>>>>>>>>>>>>>>> can surely fully discuss it for the sake of feature
> >>>>>>>> completeness.
> >>>>>>>>>>>>>>>> Unlike other configs, the order of modules would matter in
> >>>>>>>> Flink,
> >>>>>>>>>> and
> >>>>>>>>>>>>>> it
> >>>>>>>>>>>>>>>> implies the LOAD/UNLOAD commands would not be equal in
> >>>>>>>> operation
> >>>>>>>>>>>>>>>> positions.
> >>>>>>>>>>>>>>>> IIUYC, LOAD MODULE 'x' would be interpreted as appending x
> >>>>>> to
> >>>>>>>> the
> >>>>>>>>>> end
> >>>>>>>>>>>>>> of
> >>>>>>>>>>>>>>>> module list, and UNLOAD MODULE 'x' would be interpreted as
> >>>>>>>>>> removing x
> >>>>>>>>>>>>>>>> from
> >>>>>>>>>>>>>>>> any position in the list?
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> I'm thinking of the following list of commands:
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> SHOW MODULES - list modules in order
> >>>>>>>>>>>>>>>> LOAD MODULE 'hive' [WITH ('prop'='myProp', ...)] - load
> and
> >>>>>>>>> append
> >>>>>>>>>>> the
> >>>>>>>>>>>>>>>> module to end of the module list
> >>>>>>>>>>>>>>>> UNLOAD MODULE 'hive' - remove the module from module list,
> >>>>>>> and
> >>>>>>>>>> other
> >>>>>>>>>>>>>>>> modules remain the same relative positions
> >>>>>>>>>>>>>>>> USE MODULES 'x' 'y' 'z' (wondering can parser take "'x'
> 'y'
> >>>>>>>>> 'z'"?),
> >>>>>>>>>>>>>>>> or USE
> >>>>>>>>>>>>>>>> MODULES 'x,y,z' - to reorder module list completely
> >>>>>>>>>>>>>>>>
> >>>>>>>>>> --
> >>>>>>>>>> Xuefu Zhang
> >>>>>>>>>>
> >>>>>>>>>> "In Honey We Trust!"
> >>>>>>>>>>
> >>>>>> --
> >>>>>> Xuefu Zhang
> >>>>>>
> >>>>>> "In Honey We Trust!"
> >>>>>>
> >>
>
>
12