Hi, everyone,

Looks like our new design is similar to Timo’s suggestion, and considering that 
there has
no response from other devs for a long time, I want to start the vote on 
Thursday.  


Best,
Yu Zelin

> 2022年12月13日 16:23,yu zelin <yuzelin....@gmail.com> 写道:
> 
> Hi, Timo,
> 
> Thanks for your suggestion. Recently I have discussed with @Godfrey He, 
> @Shengkai Fang 
> and @Jark Wu about the `RowFormat` (Thanks for all your suggestions). We 
> finally came to 
> a consensus which is similar to your suggestion. The details are as follows:
> 
> 1. Add a REST query parameter ‘RowFormat’ = JSON/PLAIN_TEXT to tell the REST 
> Endpoint
> how to deserialize the RowData int ResultSet.
> 
>     JSON format means the RowData will be serialized to JSON format, which 
> contains original 
>     LogicalType information, so it can be deserialized back to RowData.
> 
>     PLAIN_TEXT format means the RowData will be serialized to SQL-compliant, 
> plain strings. 
>     The SQL Client can print the strings directly.
> 
> The example URI for fetching results is:
> > /v2/sessions/:session_handle/operations/:operation_handle/result/:token?rowFormat=PLAIN_TEXT
> 
> 2. Introduce two response bodies for fetching results in two formats.
> 
> For more details, please take a look at the FLIP 
> [https://cwiki.apache.org/confluence/x/T48ODg]. 
> I have updated it with an example of query response bodies in two format in 
> section:
> Public Interface -> REST Endpoint Modification.
> 
>> 2022年12月12日 18:09,Timo Walther <twal...@apache.org> 写道:
>> 
>> Hi everyone,
>> 
>> sorry to jump into this discussion so late.
>> 
>> > So we decided to revert the RowFormat related changes and let the client 
>> > to resolve the print format.
>> 
>> Could you elaborate a bit on this topic in the FLIP? I still believe that we 
>> need 2 types of output formats.
>> 
>> Format A: for the SQL Client CLI and other interactive notebooks that just 
>> uses SQL CAST(... AS STRING) semantics executed on the server side
>> 
>> Format B: for JDBC SDK or other machine-readable downstream libraries
>> 
>> Take a TIMESTAMP WITH LOCAL TIME ZONE as an example. The string 
>> representation depends on a session configuration option. Clients might not 
>> be aware of this session option, so the formatting must happen on the server 
>> side.
>> 
>> However, when the downstream consumer is a library, maybe the library would 
>> like to get the raw millis/nanos since epoch.
>> 
>> Also nested rows and collections might be better encoded with format B for 
>> libraries but interactive sessions are happy if nested types are already 
>> formatted server-side, so not every client needs custom code for the 
>> formatting.
>> 
>> Regards,
>> Timo
>> 
>> 
>> 
>> On 06.12.22 15:13, godfrey he wrote:
>>> Hi, zeklin
>>>> The CLI will use default print style for the non-query result.
>>> Please make sure the print results of EXPLAIN/DESC/SHOW CREATE TABLE
>>> commands are clear.
>>>> We think it’s better to add the root cause to the ErrorResponseBody.
>>> LGTM
>>> Best,
>>> Godfrey
>>> yu zelin <yuzelin....@gmail.com> 于2022年12月6日周二 17:51写道:
>>>> 
>>>> Hi, Godfrey
>>>> 
>>>> Thanks for your feedback. Below is my thoughts about your questions.
>>>> 
>>>> 1. About RowFormat.
>>>> I agree to your opinion. So we decided to revert the RowFormat related 
>>>> changes
>>>> and let the client to resolve the print format.
>>>> 
>>>> 2. About ContentType
>>>> I agree that the definition of the ContentType is not clear. But how to 
>>>> define the
>>>> statement type is another big question. So, we decided to only tell the 
>>>> query result
>>>> and non-query result apart. The CLI will use default print style for the 
>>>> non-query
>>>> result.
>>>> 
>>>> 3. About ErrorHandling
>>>> I think reuse the current ErrorResponseBody is good, but parse the root 
>>>> cause
>>>> from the exception stack strings is quite hacking. We think it’s better to 
>>>> add the
>>>> root cause to the ErrorResponseBody.
>>>> 
>>>> 4. About Runtime REST API Modifications
>>>> I agree, too. This part is moved to the ‘Future Work’.
>>>> 
>>>> Best,
>>>> Yu Zelin
>>>> 
>>>> 
>>>>> 2022年12月5日 18:33,godfrey he <godfre...@gmail.com> 写道:
>>>>> 
>>>>> Hi Zelin,
>>>>> 
>>>>> Thanks for driving this discussion.
>>>>> 
>>>>> I have a few comments,
>>>>> 
>>>>>> Add RowFormat to ResultSet to indicate the format of rows.
>>>>> We should not require SqlGateway server to meet the display
>>>>> requirements of a CliClient.
>>>>> Because different CliClients may have different display style. The
>>>>> server just need to response the data,
>>>>> and the CliClient prints the result as needed. So RowFormat is not needed.
>>>>> 
>>>>>> Add ContentType to ResultSet to indicate what kind of data the result 
>>>>>> contains.
>>>>> from my first sight, the values of ContentType are intersected, such
>>>>> as: A select query will return QUERY_RESULT,
>>>>> but it also has JOB_ID. OTHER is too ambiguous, I don't know which
>>>>> kind of query will return OTHER.
>>>>> I recommend returning the concrete type for each statement, such as
>>>>> "CREATE TABLE" for "create table xx (...) with ()",
>>>>> "SELECT" for "select * from xxx". The statement type can be maintained
>>>>> in `Operation`s.
>>>>> 
>>>>>> Error Handling
>>>>> I think current design of error handling mechanism can meet the
>>>>> requirement of CliClient, we can get the root cause from
>>>>> the stack (see ErrorResponseBody#errors). If it becomes a common
>>>>> requirement (for many clients) in the future,
>>>>> we can introduce this interface.
>>>>> 
>>>>>> Runtime REST API Modification for Local Client Migration
>>>>> I think this part is over-engineered, this part belongs to optimization.
>>>>> The client does not require very high performance, the current design
>>>>> can already meet our needs.
>>>>> If we find performance problems in the future, do such optimizations.
>>>>> 
>>>>> Best,
>>>>> Godfrey
>>>>> 
>>>>> yu zelin <yuzelin....@gmail.com> 于2022年12月5日周一 11:11写道:
>>>>>> 
>>>>>> Hi, Shammon
>>>>>> 
>>>>>> Thanks for your feedback. I think it’s good to support jdbc-sdk. However,
>>>>>> it's not supported in the gateway side yet. In my opinion, this FLIP is 
>>>>>> more
>>>>>> concerned with the SQL Client. How about put “supporting jdbc-sdk” in
>>>>>> ‘Future Work’? We can discuss how to implement it in another thread.
>>>>>> 
>>>>>> Best,
>>>>>> Yu Zelin
>>>>>>> 2022年12月2日 18:12,Shammon FY <zjur...@gmail.com> 写道:
>>>>>>> 
>>>>>>> Hi zelin
>>>>>>> 
>>>>>>> Thanks for driving this discussion.
>>>>>>> 
>>>>>>> I notice that the sql-client will interact with sql-gateway by `REST
>>>>>>> Client` in the `Executor` in the FLIP, how about introducing jdbc-sdk 
>>>>>>> for
>>>>>>> sql-gateway?
>>>>>>> 
>>>>>>> Then the sql-client can connect the gateway with jdbc-sdk, on the other
>>>>>>> hand, the other applications and tools such as jmeter can use the 
>>>>>>> jdbc-sdk
>>>>>>> to connect sql-gateway too.
>>>>>>> 
>>>>>>> Best,
>>>>>>> Shammon
>>>>>>> 
>>>>>>> 
>>>>>>> On Fri, Dec 2, 2022 at 4:10 PM yu zelin <yuzelin....@gmail.com> wrote:
>>>>>>> 
>>>>>>>> Hi Jim,
>>>>>>>> 
>>>>>>>> Thanks for your feedback!
>>>>>>>> 
>>>>>>>>> Should this configuration be mentioned in the FLIP?
>>>>>>>> 
>>>>>>>> Sure.
>>>>>>>> 
>>>>>>>>> some way for the server to be able to limit the number of requests it
>>>>>>>> receives.
>>>>>>>> I’m sorry that this FLIP is dedicated in implementing the Remote mode, 
>>>>>>>> so
>>>>>>>> we
>>>>>>>> didn't consider much about this. I think the option is enough 
>>>>>>>> currently.
>>>>>>>> I will add
>>>>>>>> the improvement suggestions to the ‘Future Work’.
>>>>>>>> 
>>>>>>>>> I wonder if two other options are possible
>>>>>>>> 
>>>>>>>> To forward the raw format to gateway and then to client is possible. 
>>>>>>>> The
>>>>>>>> raw
>>>>>>>> results from sink is in ‘CollectResultIterator#bufferedResult’. First, 
>>>>>>>> we
>>>>>>>> can find
>>>>>>>> a way to get this result without wrapping it. Second, constructing a
>>>>>>>> ‘InternalTypeInfo’.
>>>>>>>> We can construct it using the schema information (data’s logical type).
>>>>>>>> After
>>>>>>>> construction, we can get the ’TypeSerializer’ to deserialize the raw
>>>>>>>> result.
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> 2022年12月1日 04:54,Jim Hughes <jhug...@confluent.io.INVALID> 写道:
>>>>>>>>> 
>>>>>>>>> Hi Yu,
>>>>>>>>> 
>>>>>>>>> Thanks for moving my comments to this thread!  Also, thank you for
>>>>>>>>> answering my questions; it is helping me understand the SQL Gateway
>>>>>>>>> better.
>>>>>>>>> 
>>>>>>>>> 5.
>>>>>>>>>> Our idea is to introduce a new session option (like
>>>>>>>>> 'sql-client.result.fetch-interval') to control
>>>>>>>>> the fetching requests sending frequency. What do you think?
>>>>>>>>> 
>>>>>>>>> Should this configuration be mentioned in the FLIP?
>>>>>>>>> 
>>>>>>>>> One slight concern I have with having 
>>>>>>>>> 'sql-client.result.fetch-interval'
>>>>>>>> as
>>>>>>>>> a session configuration is that users could set it low and cause the
>>>>>>>> client
>>>>>>>>> to send a large volume of requests to the SQL gateway.
>>>>>>>>> 
>>>>>>>>> Generally, I'd like to see some way for the server to be able to limit
>>>>>>>> the
>>>>>>>>> number of requests it receives.  If that really needs to be done by a
>>>>>>>> proxy
>>>>>>>>> in front of the SQL gateway, that is fine as well.  (To be clear, I 
>>>>>>>>> don't
>>>>>>>>> think my concern here should be blocking in any way.)
>>>>>>>>> 
>>>>>>>>> 7.
>>>>>>>>>> What is the serialization lifecycle for results?
>>>>>>>>> 
>>>>>>>>> I wonder if two other options are possible:
>>>>>>>>> 3) Could the Gateway just forward the result byte array?  (Or does the
>>>>>>>>> Gateway need to deserialize the response in order to understand it for
>>>>>>>> some
>>>>>>>>> reason?)
>>>>>>>>> 4) Could the JobManager prepare the results in JSON?  (Or similarly 
>>>>>>>>> could
>>>>>>>>> the Client read the format which the JobManager sends?)
>>>>>>>>> 
>>>>>>>>> Thanks again!
>>>>>>>>> 
>>>>>>>>> Cheers,
>>>>>>>>> 
>>>>>>>>> Jim
>>>>>>>>> 
>>>>>>>>> On Wed, Nov 30, 2022 at 9:40 AM yu zelin <yuzelin....@gmail.com> 
>>>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>>> Hi, all
>>>>>>>>>> 
>>>>>>>>>> Thanks Jim’s questions below. Here I’d like to reply to them.
>>>>>>>>>> 
>>>>>>>>>>> 1. For the Client Parser, is it going to work with the extended 
>>>>>>>>>>> syntax
>>>>>>>>>>> from the Flink Table Store?
>>>>>>>>>>> 
>>>>>>>>>>> 2. Relatedly, what will happen if an older Client tries to handle
>>>>>>>>>> syntax
>>>>>>>>>>> that a newer service supports?  (Suppose I use a 1.17 client with a
>>>>>>>>>> 1.18
>>>>>>>>>>> Gateway/system which has a new keyword.  Is there anything we should
>>>>>>>> be
>>>>>>>>>>> designing for upfront?)
>>>>>>>>>>> 
>>>>>>>>>>> 3. How will client and server version mismatches be handled?  Will a
>>>>>>>>>>> single gateway be able to support multiple endpoint versions?
>>>>>>>>>>> 4. How are commands which change a session handled?  Are those sent
>>>>>>>> via
>>>>>>>>>>> an ExecuteStatementRequest?
>>>>>>>>>>> 
>>>>>>>>>>> 5. The remote POC uses polling for getting back status and getting
>>>>>>>> back
>>>>>>>>>>> results.  Would it be possible to switch to web sockets or some 
>>>>>>>>>>> other
>>>>>>>>>>> mechanism to avoid polling?  If polling is used for both, the 
>>>>>>>>>>> polling
>>>>>>>>>>> frequency should be different between local and remote 
>>>>>>>>>>> configurations.
>>>>>>>>>>> 
>>>>>>>>>>> 6. What does this sentence mean?  "The reason why we didn't get the
>>>>>>>> sql
>>>>>>>>>>> type in client side is because it's hard for the lightweight
>>>>>>>>>> client-level
>>>>>>>>>>> parser to recognize some sql type  sql, such as query with CTE.  "
>>>>>>>>>>> 
>>>>>>>>>>> 7. What is the serialization lifecycle for results?  It makes sense 
>>>>>>>>>>> to
>>>>>>>>>>> have some control over whether the gateway returns results as SQL or
>>>>>>>>>> JSON.
>>>>>>>>>>> I'd love to see a way to avoid needing to serialize and deserialize
>>>>>>>>>> results
>>>>>>>>>>> on the SQL Gateway if possible.  I'm still new enough to the project
>>>>>>>>>> that
>>>>>>>>>>> I'm not sure if that's readily possible.  Maybe the SQL Gateway's
>>>>>>>>>> return
>>>>>>>>>>> type can be sent as part of the request so that the JobManager can
>>>>>>>> send
>>>>>>>>>>> back results in an advantageous format?
>>>>>>>>>>> 
>>>>>>>>>>> 8. Does ErrorType need to be marked as @PublicEvolving?
>>>>>>>>>>> 
>>>>>>>>>>> I'm excited for the SQL client to support gateway mode!  Given the
>>>>>>>> change
>>>>>>>>>>> in design, do you think it'll still be part of the Flink 1.17 
>>>>>>>>>>> release?
>>>>>>>>>> 
>>>>>>>>>> 1.  ClientParser can work with new (and unknown) SQL syntax. It is
>>>>>>>> because
>>>>>>>>>> if the
>>>>>>>>>> sql type is not recognized, the sql will be submitted to the gateway
>>>>>>>>>> directly.
>>>>>>>>>> 
>>>>>>>>>> For more information: Actually, the proposed ClientParser only do two
>>>>>>>>>> things:
>>>>>>>>>> (1) Tell client commands (help, clear, etc) and sqls apart.
>>>>>>>>>> (2) parses several sql types (e.g. SHOW CREATE statement, we can 
>>>>>>>>>> print
>>>>>>>> raw
>>>>>>>>>> string
>>>>>>>>>> for the SHOW CREATE result instead of table). Here the recognization 
>>>>>>>>>> of
>>>>>>>>>> sql types
>>>>>>>>>> mostly affects the print style, and unrecognized sql also can be
>>>>>>>> submitted
>>>>>>>>>> to cluster.
>>>>>>>>>> So the Client with new ClientParser can work compatible with new 
>>>>>>>>>> syntax.
>>>>>>>>>> 
>>>>>>>>>> 2. First, I'd like to explain that the gateway APIs and supported 
>>>>>>>>>> syntax
>>>>>>>>>> is two things.
>>>>>>>>>> For example, ‘configureSession' and 'completeStatement' are APIs. As
>>>>>>>>>> mentioned
>>>>>>>>>> in #1, the sql statements which syntax is unknown will be submitted 
>>>>>>>>>> to
>>>>>>>> the
>>>>>>>>>> gateway,
>>>>>>>>>> and whether they can be executed normally depends on whether the
>>>>>>>> execution
>>>>>>>>>> environment supports the syntax.
>>>>>>>>>> 
>>>>>>>>>>> Is there anything we should be designing for upfront?
>>>>>>>>>> 
>>>>>>>>>> The 'SqlGatewayRestAPIVersion’ has been introduced. But it is for sql
>>>>>>>>>> gateway APIs.
>>>>>>>>>> 
>>>>>>>>>> 3.
>>>>>>>>>>> How will client and server version mismatches be handled?
>>>>>>>>>> 
>>>>>>>>>> A lower version client can work compatible with a higher version 
>>>>>>>>>> gateway
>>>>>>>>>> because the
>>>>>>>>>> old interfaces won’t be deleted. When a higher version client 
>>>>>>>>>> connects
>>>>>>>> to
>>>>>>>>>> a lower version
>>>>>>>>>> gateway, the client should notify the users if they try to use
>>>>>>>> unsupported
>>>>>>>>>> features. For
>>>>>>>>>> example, the client start option ‘-i’  means using initialization 
>>>>>>>>>> file
>>>>>>>> to
>>>>>>>>>> initialize the session.
>>>>>>>>>> We plan to use the gateway’s ‘configureSession’ to implement it. But
>>>>>>>> this
>>>>>>>>>> API is not
>>>>>>>>>> implemented in 1.16 Gateway (SqlGatewayRestAPIVersion = V1), so if 
>>>>>>>>>> the
>>>>>>>>>> user try to
>>>>>>>>>> use ‘-i’ option to start the client with the 1.16 gateway, the client
>>>>>>>>>> should tell the user that
>>>>>>>>>> Can’t execute ‘-i’ option with gateway which version is lower than 
>>>>>>>>>> V2.
>>>>>>>>>> 
>>>>>>>>>>> Will a single gateway be able to support multiple endpoint versions?
>>>>>>>>>> 
>>>>>>>>>> Currently, the gateway only starts a highest version endpoint and the
>>>>>>>>>> higher version endpoint
>>>>>>>>>> is compatible with the lower version endpoint’s protocol.
>>>>>>>>>> 
>>>>>>>>>> 4. Yes. Mostly, we use ’SET’ and ‘RESET’ statements to change the
>>>>>>>> session
>>>>>>>>>> configuration.
>>>>>>>>>> Notice: the client can’t change the session (I mean, close current
>>>>>>>> session
>>>>>>>>>> and open another
>>>>>>>>>> one). I’m not sure if you have need to change the session itself?
>>>>>>>>>> 
>>>>>>>>>> 5.
>>>>>>>>>>> Would it be possible to switch to web sockets or some other 
>>>>>>>>>>> mechanism
>>>>>>>>>> to avoid polling?
>>>>>>>>>> 
>>>>>>>>>> Your suggestion is very good, but this flip is for supporting the 
>>>>>>>>>> remote
>>>>>>>>>> client. How about taking
>>>>>>>>>> it as a future work?
>>>>>>>>>> 
>>>>>>>>>>> If polling is used for both, the polling frequency should be 
>>>>>>>>>>> different
>>>>>>>>>> between local and remote
>>>>>>>>>> configurations.
>>>>>>>>>> 
>>>>>>>>>> Our idea is to introduce a new session option (like
>>>>>>>>>> 'sql-client.result.fetch-interval') to control
>>>>>>>>>> the fetching requests sending frequency. What do you think?
>>>>>>>>>> 
>>>>>>>>>> For more information: we are inclined to keep the polling behavior in
>>>>>>>> this
>>>>>>>>>> version. For streaming
>>>>>>>>>> query, fetching results synchronously may occupy resources of the
>>>>>>>> gateway
>>>>>>>>>> in a long period.
>>>>>>>>>> For example, if the job doesn’t return results for a long time 
>>>>>>>>>> because
>>>>>>>> the
>>>>>>>>>> window has not been
>>>>>>>>>> triggered, the synchronously fetching will keep occupying the
>>>>>>>> connection.
>>>>>>>>>> In asynchronous
>>>>>>>>>> situation, the gateway can return a NOT_READY_RESULT quickly and 
>>>>>>>>>> release
>>>>>>>>>> the resources
>>>>>>>>>> for other clients to use. I think we can make some improvements for 
>>>>>>>>>> the
>>>>>>>>>> whole flow path in the
>>>>>>>>>> future.
>>>>>>>>>> 
>>>>>>>>>> 6. Sorry for that there is mistakes in this sentence. Let me make it
>>>>>>>> clear.
>>>>>>>>>> 
>>>>>>>>>> We proposed to add 'ContentType' to indicates the result is for what
>>>>>>>> kind
>>>>>>>>>> of sql. In this sentence,
>>>>>>>>>> I want to explain why we add 'ContentType' since the ClientParser can
>>>>>>>>>> recognize the sql type too.
>>>>>>>>>> It is because the proposed ClientParser can't recognize complex 
>>>>>>>>>> syntax.
>>>>>>>>>> For example, it can’t
>>>>>>>>>> recognize query with CTE. So the result should carry content type
>>>>>>>>>> information to help the client to
>>>>>>>>>> know the sql type. For example, the 'ContentType.QUERY_RESULT' 
>>>>>>>>>> indicates
>>>>>>>>>> the result is for a
>>>>>>>>>> query statement.
>>>>>>>>>> 
>>>>>>>>>> 7.
>>>>>>>>>>> What is the serialization lifecycle for results?
>>>>>>>>>> 
>>>>>>>>>> 1) Sink to JobManager        : RowData -> Byte[ ] (serialize)
>>>>>>>>>> 2) JobManager to Gateway : Byte[ ] -> RowData (deserialize)
>>>>>>>>>> 3) Gateway sending            : RowData -> Byte[ ] (serialized to 
>>>>>>>>>> JSON
>>>>>>>>>> format)
>>>>>>>>>> 4) Client receiving               : Byte[ ] -> RowData (deserialize)
>>>>>>>>>> 
>>>>>>>>>>> Maybe the SQL Gateway's return type can be sent as part of the 
>>>>>>>>>>> request
>>>>>>>>>> so that the
>>>>>>>>>> JobManager can send  back results in an advantageous format?
>>>>>>>>>> 
>>>>>>>>>> Yes. I think it's an improvement for the Client and Gateway. We have
>>>>>>>> some
>>>>>>>>>> ideas. For example,
>>>>>>>>>> 
>>>>>>>>>> 1) We can move the Gateway into the JobManager and reduce the Ser/De
>>>>>>>> costs
>>>>>>>>>> from JM to Gateway.
>>>>>>>>>> 2) Or the Gateway can collect the data from the sink function 
>>>>>>>>>> directly
>>>>>>>>>> instead of JobManager.
>>>>>>>>>> 
>>>>>>>>>> But I think we can leave this as a future work and discuss in another
>>>>>>>>>> thread.
>>>>>>>>>> 
>>>>>>>>>> 8. Yes.
>>>>>>>>>> 
>>>>>>>>>>> Do you think it'll still be part of the Flink 1.17 release?
>>>>>>>>>> Yes. We will try our best to finish the work.
>>>>>>>>>> 
>>>>>>>>>> Feel free to talk to me if I’m wrong or you have any other questions.
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>>> 2022年11月25日 11:48,yu zelin <yuzelin....@gmail.com> 写道:
>>>>>>>>>>> 
>>>>>>>>>>> Hi, all
>>>>>>>>>>> 
>>>>>>>>>>> I want to initiate a discussion on the FLIP-275: Support Remote SQL
>>>>>>>>>> Client Based on SQL Gateway[1].
>>>>>>>>>>> The motivation of this FLIP is that the current SQL Client allows 
>>>>>>>>>>> only
>>>>>>>>>> local connection which can not satisfy
>>>>>>>>>>> the common need of connecting to a remote cluster.
>>>>>>>>>>> 
>>>>>>>>>>> Since the FLIP-91[2] has introduced SQL Gateway, we proposed to
>>>>>>>>>> implement the Remote SQL Client
>>>>>>>>>>> based on SQL Gateway. In our design, we proposed two main changes:
>>>>>>>>>>> 
>>>>>>>>>>> 1. New remote mode client which performs connection to the remote
>>>>>>>>>> gateway through REST API.
>>>>>>>>>>> 2. Migration of the current local mode client. We proposed to 
>>>>>>>>>>> refactor
>>>>>>>>>> the local client based on SQL Gateway
>>>>>>>>>>> to unify the interface for two modes.
>>>>>>>>>>> 
>>>>>>>>>>> Looking forward to your suggestions.
>>>>>>>>>>> 
>>>>>>>>>>> Best,
>>>>>>>>>>> Yu Zelin
>>>>>>>>>>> 
>>>>>>>>>>> [1] https://cwiki.apache.org/confluence/x/T48ODg
>>>>>>>>>>> [2] https://cwiki.apache.org/confluence/x/rIyMC
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> 
> 

Reply via email to