Hi Sergey, I think INFORMATION_SCHEMA is a very interesting idea, and I hope we can support it. However, it doesn't conflict with the idea of auxiliary statements. I can see different benefits of them. The information schema provides powerful and flexible capabilities but needs to learn the complex entity relationship[1]. The auxiliary SQL statements are super handy and can resolve most problems, but they offer limited features.
I can see almost all the mature systems support both of them. I think it also makes sense to support both of them in Flink. Considering they are orthogonal and information schema requires more complex design and discussion, it deserves a separate FLIP. Sergey, are you willing to contribute this FLIP? Best, Jark [1]: https://docs.databricks.com/sql/language-manual/sql-ref-information-schema.html On Fri, 24 Feb 2023 at 22:43, Ran Tao <chucheng...@gmail.com> wrote: > Thanks John. > > It seems that most people prefer the information_schema implementation. > information_schema does have more benefits (however, the show operation is > also an option and supplement). > Otherwise, the sql syntax and keywords may be changed frequently. > Of course, it will be more complicated than the extension of the show > operation. > It is necessary to design various tables in information_schema, which may > take a period of effort. > > I will try to design the information_schema and integrate it with flink. > This may be a relatively big feature for me. I hope you guys can give > comments and opinions later. > Thank you all. > > Best Regards, > Ran Tao > > > John Roesler <vvcep...@apache.org> 于2023年2月24日周五 21:53写道: > > > Hello Ran, > > > > Thanks for the FLIP! > > > > Do you mind if we revisit the topic of doing this by adding an > Information > > schema? The SHOW approach requires modifying the parser/language for > every > > gap we identify. On the flip side, an Information schema is much easier > to > > discover and remember how to use, and the ability to run queries on it is > > quite valuable for admins. It’s also better for Flink maintainers, > because > > the information tables’ schemas can be evolved over time just like > regular > > tables, whereas every change to a SHOW statement would be a breaking > > change. > > > > I understand that it may seem like a big effort, but we’re proposing > quite > > a big extension to the space of SHOW statement, so it seems appropriate > to > > take the opportunity and migrate to a better framework rather than > > incrementally building on (and tying us even more firmly to) the existing > > approach. > > > > Thanks for your consideration, > > John > > > > On Fri, Feb 24, 2023, at 05:58, Sergey Nuyanzin wrote: > > > thanks for explanation > > > > > >>But it's not clear to me what exactly > > >> you want to display? Is it the name of the plugin? > > > > > > I was thinking about name, type (source/sink) and may be version (not > > sure > > > if it's possible right now) > > > > > > On Fri, Feb 24, 2023 at 12:46 PM Ran Tao <chucheng...@gmail.com> > wrote: > > > > > >> Hi, Sergey. thanks. first step we can support filtering for show > > operations > > >> in this FLIP try to align other engines. > > >> If we want to support describe other objects, of course we need to > > design > > >> how to get these metadatas or informations and printAsStyle. (So it > > maybe > > >> need another FLIP for more details). > > >> > > >> > Does it make sense to add support for connectors e.g. show > > >> > {sink|source|all} connectors? > > >> I think we can support it, currently flink do support some operations > > only > > >> for flink itself such as showJobs. But it's not clear to me what > exactly > > >> you want to display? Is it the name of the plugin? > > >> Just Like: > > >> Kafka > > >> Hudi > > >> Files > > >> > > >> Best Regards, > > >> Ran Tao > > >> > > >> > > >> Sergey Nuyanzin <snuyan...@gmail.com> 于2023年2月24日周五 19:11写道: > > >> > > >> > Thanks for driving the FLIP > > >> > > > >> > I have a couple of questions > > >> > Am I right that INFORMATION_SCHEMA mentioned by Timo[1] is out of > > scope > > >> of > > >> > this FLIP? > > >> > I noticed there are some support of it in > > Spark[2]/Hive[3]/Snowflake[4] > > >> and > > >> > others > > >> > > > >> > Does it make sense to add support for connectors e.g. show > > >> > {sink|source|all} connectors? > > >> > > > >> > [1] > https://lists.apache.org/thread/2g108qlfwbhb56wnoc5qj0yq29dvq1vv > > >> > [2] https://issues.apache.org/jira/browse/SPARK-16452 > > >> > [3] https://issues.apache.org/jira/browse/HIVE-1010 > > >> > [4] https://docs.snowflake.com/en/sql-reference/info-schema > > >> > > > >> > > > >> > On Fri, Feb 24, 2023 at 4:19 AM Jark Wu <imj...@gmail.com> wrote: > > >> > > > >> > > Hi Jing, > > >> > > > > >> > > > we'd better reduce the dependency chain and follow the Law of > > >> > > Demeter(LoD, clean code). > > >> > > > Adding a new method in TableEnvironment is therefore better than > > >> > calling > > >> > > an API chain > > >> > > > > >> > > I think I don't fully agree that LoD is a good practice. > Actually, I > > >> > would > > >> > > prefer to keep the API clean and concise. > > >> > > This is also the Java Collection Framework design principle [1]: > > "High > > >> > > power-to-weight ratio". Otherwise, > > >> > > it will explode the API interfaces with different combinations of > > >> > methods. > > >> > > Currently, TableEnvironment > > >> > > already provides 60+ methods. > > >> > > > > >> > > IMO, with the increasing methods of accessing and manipulating > > >> metadata, > > >> > > they can be extracted to > > >> > > a separate interface, where we can add richer methods. This work > > can be > > >> > > aligned with the > > >> > > CatalogManager interface (FLIP-295) [2]. > > >> > > > > >> > > Best, > > >> > > Jark > > >> > > > > >> > > [1]: > > >> > > > > >> > > > > >> > > > >> > > > https://stackoverflow.com/questions/7568819/why-no-tail-or-head-method-in-list-to-get-last-or-first-element > > >> > > [2]: > > https://lists.apache.org/thread/9bnjblgd9wvrl75lkm84oo654c4lqv70 > > >> > > > > >> > > > > >> > > On Fri, 24 Feb 2023 at 10:38, Aitozi <gjying1...@gmail.com> > wrote: > > >> > > > > >> > > > Hi, > > >> > > > Thanks for the nice proposal, Ran. > > >> > > > Regarding this api usage, I have some discussion with > @twalthr > > >> > before > > >> > > > as here < > > >> > > > > > https://github.com/apache/flink/pull/15137#issuecomment-1356124138> > > >> > > > Personally, I think leaking the Catalog to the user side is not > > >> > suitable, > > >> > > > since there are some read/write operations in the Catalog, the > > >> > > > TableEnvironment#getCatalog will expose all of them to the user > > side. > > >> > So > > >> > > I > > >> > > > learned to add a new api in TableEnvironment to reduce reliance > on > > >> the > > >> > > > current TableEnvironment#getCatalog. > > >> > > > > > >> > > > Thanks, > > >> > > > Aitozi > > >> > > > > > >> > > > > > >> > > > Ran Tao <chucheng...@gmail.com> 于2023年2月23日周四 23:44写道: > > >> > > > > > >> > > > > Hi, JingSong, Jing. > > >> > > > > > > >> > > > > thank for sharing your opinions. > > >> > > > > > > >> > > > > What you say makes sense, both approaches have pros and cons. > > >> > > > > > > >> > > > > If it is a modification of `TableEnvrionment`, such as > > >> > > > > listDatabases(catalog). It is actually consistent with the > other > > >> > > > overloaded > > >> > > > > methods before, > > >> > > > > and defining this method means that TableEnvrionment does > > provide > > >> > this > > >> > > > > capability (rather than relying on the functionality of > another > > >> > class). > > >> > > > > The disadvantage is that api changes may be required, and may > > >> > continue > > >> > > to > > >> > > > > be modified in the future. > > >> > > > > But from the TableEnvrionment itself, it really doesn't pay > > >> attention > > >> > > to > > >> > > > > how the underlying layer is implemented. > > >> > > > > (Although it is actually taken from the catalogManager at > > present, > > >> > this > > >> > > > is > > >> > > > > another question) > > >> > > > > > > >> > > > > Judging from the current dependencies, flink-table-api-java > > >> strongly > > >> > > > relies > > >> > > > > on flink-table-common to use various common classes and > > interfaces, > > >> > > > > especially the catalog interface. > > >> > > > > So we can extract various metadata information in the catalog > > >> through > > >> > > > > `tEnv.getCatalog`. > > >> > > > > The advantage is that it will not cause api modification, but > > this > > >> > > method > > >> > > > > of use breaks LoD. > > >> > > > > In fact, the current flink-table-api-java design is completely > > >> bound > > >> > to > > >> > > > the > > >> > > > > catalog interface. > > >> > > > > > > >> > > > > If the mandatory modification of PublicApi is constrained (may > > be > > >> > > > modified > > >> > > > > again and later), I tend to use `tEnv.getCatalog` directly, > > >> otherwise > > >> > > > > It would actually be more standard to add overloaded methods > to > > >> > > > > `TableEnvrionment`. > > >> > > > > > > >> > > > > Another question, can the later capabilities of > > TableEnvrionment be > > >> > > > > implemented through SupportXXX? > > >> > > > > In order to solve the problem that the method needs to be > added > > in > > >> > the > > >> > > > > future. This kind of usage occurs frequently in flink. > > >> > > > > > > >> > > > > Looking forward to your other considerations, > > >> > > > > and also try to wait to see if there are other relevant API > > >> designers > > >> > > or > > >> > > > > committers to provide comments. > > >> > > > > > > >> > > > > > > >> > > > > Best Regards, > > >> > > > > Ran Tao > > >> > > > > > > >> > > > > Jing Ge <j...@ververica.com.invalid> 于2023年2月23日周四 18:58写道: > > >> > > > > > > >> > > > > > Hi Jingson, > > >> > > > > > > > >> > > > > > Thanks for sharing your thoughts. Please see my reply below. > > >> > > > > > > > >> > > > > > On Thu, Feb 23, 2023 at 10:16 AM Jingsong Li < > > >> > jingsongl...@gmail.com > > >> > > > > > >> > > > > > wrote: > > >> > > > > > > > >> > > > > > > Hi Jing Ge, > > >> > > > > > > > > >> > > > > > > First, flink-table-common contains all common classes of > > Flink > > >> > > Table, > > >> > > > > > > I think it is hard to bypass its dependence. > > >> > > > > > > > > >> > > > > > > > >> > > > > > If any time when we use flink-table-api-java, we have to > cross > > >> > > through > > >> > > > > > flink-table-api-java and use flink-table-common, we should > > >> > reconsider > > >> > > > the > > >> > > > > > design of these two modules and how interfaces/classes are > > >> > classified > > >> > > > > into > > >> > > > > > those modules. > > >> > > > > > > > >> > > > > > > > >> > > > > > > > > >> > > > > > > Secondly, almost all methods in Catalog looks useful to > me, > > so > > >> if > > >> > > we > > >> > > > > > > are following LoD, we should add all methods again to > > >> > > > > > > TableEnvironment. I think it is redundant. > > >> > > > > > > > > >> > > > > > > > >> > > > > > That is the enlarged issue I mentioned previously. A simple > > >> > solution > > >> > > is > > >> > > > > to > > >> > > > > > move Catalog to the top level API. The fact is that a > catalog > > >> > package > > >> > > > > > already exists in flink-table-api-java but the Catalog > > interface > > >> is > > >> > > in > > >> > > > > > flink-table-common. I don't know the historical context of > > this > > >> > > design. > > >> > > > > > Maybe you could share some insight with us? Thanks in > advance. > > >> > Beyond > > >> > > > > that, > > >> > > > > > there should be other AOP options but need more time to > > figure it > > >> > > out. > > >> > > > > > > > >> > > > > > > > >> > > > > > > > > >> > > > > > > And, this API chain does not look deep. > > >> > > > > > > - > > >> > "tEnv.getCatalog(tEnv.getCurrentCatalog()).get().listDatabases()" > > >> > > > > > > looks a little complicated. The complex part is ahead. > > >> > > > > > > - If we have a method to get Catalog directly, can be > > simplify > > >> to > > >> > > > > > > "tEnv.catalog().listDatabase()", this is simple. > > >> > > > > > > > > >> > > > > > > > >> > > > > > Commonly, it will need more effort to always follow LoD, but > > for > > >> > the > > >> > > > top > > >> > > > > > level facade API like TableEnvironment, both the API > > developer, > > >> API > > >> > > > > > consumer and the project itself from a long-term perspective > > will > > >> > > > benefit > > >> > > > > > from sticking to LoD. Since we already have the > > getCatalog(String > > >> > > > > catalog) > > >> > > > > > method in TableEnvironment, it also makes sense to follow > your > > >> > > > > suggestion, > > >> > > > > > if we only want to limit/avoid public API changes. But > please > > be > > >> > > aware > > >> > > > > that > > >> > > > > > we will have all known long-term drawbacks because of LoD > > >> > > > > > violation, especially the cross modules violation. I just > > checked > > >> > all > > >> > > > > > usages of getCatalog(String catalog) in the master branch. > > >> > Currently > > >> > > > > there > > >> > > > > > are very limited calls. It is better to pay attention to it > > >> before > > >> > it > > >> > > > > goes > > >> > > > > > worse. Just my 2 cents. :) > > >> > > > > > > > >> > > > > > > > >> > > > > > > > > >> > > > > > > Best, > > >> > > > > > > Jingsong > > >> > > > > > > > > >> > > > > > > On Thu, Feb 23, 2023 at 4:47 PM Jing Ge > > >> > <j...@ververica.com.invalid > > >> > > > > > >> > > > > > > wrote: > > >> > > > > > > > > > >> > > > > > > > Hi Jingson, > > >> > > > > > > > > > >> > > > > > > > Thanks for the knowledge sharing. IMHO, it looks more > > like a > > >> > > design > > >> > > > > > > > guideline question than just avoiding public API change. > > >> Please > > >> > > > > correct > > >> > > > > > > me > > >> > > > > > > > if I'm wrong. > > >> > > > > > > > > > >> > > > > > > > Catalog is in flink-table-common module and > > TableEnvironment > > >> is > > >> > > in > > >> > > > > > > > flink-table-api-java. Depending on how and where those > > >> features > > >> > > > > > proposed > > >> > > > > > > in > > >> > > > > > > > this FLIP will be used, we'd better reduce the > dependency > > >> chain > > >> > > and > > >> > > > > > > follow > > >> > > > > > > > the Law of Demeter(LoD, clean code) [1]. Adding a new > > method > > >> in > > >> > > > > > > > TableEnvironment is therefore better than calling an API > > >> chain. > > >> > > It > > >> > > > is > > >> > > > > > > also > > >> > > > > > > > more user friendly for the caller, because there is no > > need > > >> to > > >> > > > > > understand > > >> > > > > > > > the internal structure of the called API. The downside > of > > >> doing > > >> > > > this > > >> > > > > is > > >> > > > > > > > that we might have another issue with the current > > >> > > TableEnvironment > > >> > > > > > > design - > > >> > > > > > > > the TableEnvironment interface got enlarged with more > > wrapper > > >> > > > > methods. > > >> > > > > > > This > > >> > > > > > > > is a different issue that could be solved with improved > > >> > > abstraction > > >> > > > > > > design > > >> > > > > > > > in the future. After considering pros and cons, if we > > want to > > >> > add > > >> > > > > those > > >> > > > > > > > features now, I would prefer following LoD than API > chain > > >> > calls. > > >> > > > > WDYT? > > >> > > > > > > > > > >> > > > > > > > Best regards, > > >> > > > > > > > Jing > > >> > > > > > > > > > >> > > > > > > > [1] > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > > https://hackernoon.com/object-oriented-tricks-2-law-of-demeter-4ecc9becad85 > > >> > > > > > > > > > >> > > > > > > > On Thu, Feb 23, 2023 at 6:26 AM Ran Tao < > > >> chucheng...@gmail.com > > >> > > > > >> > > > > wrote: > > >> > > > > > > > > > >> > > > > > > > > Hi Jingsong. thanks. i got it. > > >> > > > > > > > > In this way, there is no need to introduce new API > > changes. > > >> > > > > > > > > > > >> > > > > > > > > Best Regards, > > >> > > > > > > > > Ran Tao > > >> > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > Jingsong Li <jingsongl...@gmail.com> 于2023年2月23日周四 > > >> 12:26写道: > > >> > > > > > > > > > > >> > > > > > > > > > Hi Ran, > > >> > > > > > > > > > > > >> > > > > > > > > > I mean we can just use > > >> > > > > > > > > > > > >> > > > > > > > >> > > TableEnvironment.getCatalog(getCurrentCatalog).get().listDatabases(). > > >> > > > > > > > > > > > >> > > > > > > > > > We don't need to provide new apis just for utils. > > >> > > > > > > > > > > > >> > > > > > > > > > Best, > > >> > > > > > > > > > Jingsong > > >> > > > > > > > > > > > >> > > > > > > > > > On Thu, Feb 23, 2023 at 12:11 PM Ran Tao < > > >> > > > chucheng...@gmail.com> > > >> > > > > > > wrote: > > >> > > > > > > > > > > > > >> > > > > > > > > > > Hi Jingsong, thanks. > > >> > > > > > > > > > > > > >> > > > > > > > > > > The implementation of these statements in > > >> > > > TableEnvironmentImpl > > >> > > > > is > > >> > > > > > > > > called > > >> > > > > > > > > > > through the catalog api. > > >> > > > > > > > > > > > > >> > > > > > > > > > > but it does support some new override methods on > the > > >> > > catalog > > >> > > > > api > > >> > > > > > > side, > > >> > > > > > > > > > and > > >> > > > > > > > > > > I will update it later. Thank you. > > >> > > > > > > > > > > > > >> > > > > > > > > > > e.g. > > >> > > > > > > > > > > TableEnvironmentImpl > > >> > > > > > > > > > > @Override > > >> > > > > > > > > > > public String[] listDatabases() { > > >> > > > > > > > > > > return catalogManager > > >> > > > > > > > > > > > > >> > > > .getCatalog(catalogManager.getCurrentCatalog()) > > >> > > > > > > > > > > .get() > > >> > > > > > > > > > > .listDatabases() > > >> > > > > > > > > > > .toArray(new String[0]); > > >> > > > > > > > > > > } > > >> > > > > > > > > > > > > >> > > > > > > > > > > Best Regards, > > >> > > > > > > > > > > Ran Tao > > >> > > > > > > > > > > > > >> > > > > > > > > > > > > >> > > > > > > > > > > Jingsong Li <jingsongl...@gmail.com> > 于2023年2月23日周四 > > >> > > 11:47写道: > > >> > > > > > > > > > > > > >> > > > > > > > > > > > Thanks for the proposal. > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > +1 for the proposal. > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > I am confused about "Proposed TableEnvironment > SQL > > >> API > > >> > > > > > Changes", > > >> > > > > > > can > > >> > > > > > > > > > > > we just use catalog api for this requirement? > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > Best, > > >> > > > > > > > > > > > Jingsong > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > On Thu, Feb 23, 2023 at 10:48 AM Jacky Lau < > > >> > > > > > liuyong...@gmail.com > > >> > > > > > > > > > >> > > > > > > > > > wrote: > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > Hi Ran: > > >> > > > > > > > > > > > > Thanks for driving the FLIP. the google doc > > looks > > >> > > really > > >> > > > > > good. > > >> > > > > > > it > > >> > > > > > > > > is > > >> > > > > > > > > > > > > important to improve user interactive > > experience. > > >> +1 > > >> > to > > >> > > > > > support > > >> > > > > > > > > this > > >> > > > > > > > > > > > > feature. > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > Jing Ge <j...@ververica.com.invalid> > > 于2023年2月23日周四 > > >> > > > > 00:51写道: > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > Hi Ran, > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > Thanks for driving the FLIP. It looks > overall > > >> > good. > > >> > > > > Would > > >> > > > > > > you > > >> > > > > > > > > > like to > > >> > > > > > > > > > > > add > > >> > > > > > > > > > > > > > a description of useLike and notLike? I > guess > > >> > useLike > > >> > > > > true > > >> > > > > > > is for > > >> > > > > > > > > > > > "LIKE" > > >> > > > > > > > > > > > > > and notLike true is for "NOT LIKE" but I am > > not > > >> > sure > > >> > > > if I > > >> > > > > > > > > > understood it > > >> > > > > > > > > > > > > > correctly. Furthermore, does it make sense > to > > >> > support > > >> > > > > > "ILIKE" > > >> > > > > > > > > too? > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > Best regards, > > >> > > > > > > > > > > > > > Jing > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > On Wed, Feb 22, 2023 at 1:17 PM Ran Tao < > > >> > > > > > > chucheng...@gmail.com> > > >> > > > > > > > > > wrote: > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > Currently flink sql auxiliary statements > has > > >> > > > supported > > >> > > > > > some > > >> > > > > > > > > good > > >> > > > > > > > > > > > features > > >> > > > > > > > > > > > > > > such as catalog/databases/table support. > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > But these features are not very complete > > >> compared > > >> > > > with > > >> > > > > > > other > > >> > > > > > > > > > popular > > >> > > > > > > > > > > > > > > engines such as spark, presto, hive and > > >> > commercial > > >> > > > > > engines > > >> > > > > > > such > > >> > > > > > > > > > as > > >> > > > > > > > > > > > > > > snowflake. > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > For example, many engines support show > > >> operation > > >> > > with > > >> > > > > > > filtering > > >> > > > > > > > > > > > except > > >> > > > > > > > > > > > > > > flink, and support describe other > > object(flink > > >> > only > > >> > > > > > support > > >> > > > > > > > > > describe > > >> > > > > > > > > > > > > > > table). > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > I wonder can we add these useful features > > for > > >> > > flink? > > >> > > > > > > > > > > > > > > You can find details in this doc.[1] or > > >> FLIP.[2] > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > Also, please let me know if there is a > > mistake. > > >> > > > Looking > > >> > > > > > > forward > > >> > > > > > > > > > to > > >> > > > > > > > > > > > your > > >> > > > > > > > > > > > > > > reply. > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > [1] > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > > https://docs.google.com/document/d/1hAiOfPx14VTBTOlpyxG7FA2mB1k5M31VnKYad2XpJ1I/ > > >> > > > > > > > > > > > > > > [2] > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > > https://cwiki.apache.org/confluence/display/FLINK/FLIP-297%3A+Improve+Auxiliary+Sql+Statements > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > Best Regards, > > >> > > > > > > > > > > > > > > Ran Tao > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > > >> > -- > > >> > Best regards, > > >> > Sergey > > >> > > > >> > > > > > > > > > -- > > > Best regards, > > > Sergey > > >