How bad would it be for API designers and users if java.lang.String were 
mutable? I would say really, really bad. You could add a lot of comments to the 
API documentation, but you’d never really be sure that everyone was adhering to 
the contract.

> On Sep 6, 2016, at 1:59 PM, Ted Dunning <ted.dunn...@gmail.com> wrote:
> 
> What is so bad about declaring that variable as a List and making it an
> ImmutableList underneath?
> 
> Guard it in the programmer's mind by comments and naming. And if they don't
> believe you, it still can't be changed.
> 
> This avoids Guava leakage in the API and still gives you (nearly) all of
> the benefits of the ImmutableList type.
> 
> Kind of give a little to get a little.
> 
> 
> 
> On Wed, Sep 7, 2016 at 5:10 AM, Julian Hyde <jh...@apache.org> wrote:
> 
>> What is so bad about Guava? I have always found it to be a high quality
>> library. I hear that they have broken backwards compatibility on one or two
>> occasions, but I’ve never been affected by that personally.
>> 
>>> On Sep 6, 2016, at 12:04 PM, Andrew Purtell <apurt...@apache.org> wrote:
>>> 
>>> No argument that naming should set expectations of immutability if that's
>>> what should be conveyed, but Guava types (or Guava anything) is a means
>> to
>>> an end that can inflict significant pain on downstreamers.
>>> 
>>> On Tue, Sep 6, 2016 at 11:59 AM, Julian Hyde <jh...@apache.org> wrote:
>>> 
>>>> Calcite’s API has a large surface area. The API consists not just of
>>>> method calls, but also data objects. For example, the Project class [1]
>>>> represents a project node in a relational algebra expression. Its main
>>>> field is “public final ImmutableList<RexNode> exps”. It is very
>> important
>>>> that everyone, especially the client, understands that that list is
>>>> immutable. When you create a Project, you do not need to make a
>> defensive
>>>> copy of the list because no one is able to modify it.
>>>> 
>>>> Imagine the mayhem if java.lang.String was mutable. As an API designer
>> you
>>>> would have to spell out whether the caller or the provider is allowed to
>>>> change the string, and at what time. You would worry about thread
>> safety,
>>>> if the string has been shared with another thread. Well, I believe that
>>>> Guava immutable collections prevent the same kinds of mayhem. I would
>> call
>>>> that good API design.
>>>> 
>>>> The immutable collections and functions are in every Guava version, so
>> we
>>>> really don’t care which Guava version we use, as long as it is not
>> shaded.
>>>> 
>>>> Julian
>>>> 
>>>> [1] https://calcite.apache.org/apidocs/org/apache/calcite/
>>>> rel/core/Project.html <https://calcite.apache.org/
>>>> apidocs/org/apache/calcite/rel/core/Project.html>
>>>> 
>>>>> On Sep 3, 2016, at 6:02 PM, Andrew Purtell <andrew.purt...@gmail.com>
>>>> wrote:
>>>>> 
>>>>> I wouldn't call embedding Guava types in a public API either a service
>>>> for users nor good API design, given the pain I've personally seen it
>>>> inflict on multiple projects given Google's uncaring nature on cross
>>>> version compatibility.
>>>>> 
>>>>>> On Sep 3, 2016, at 5:35 PM, Jacques Nadeau <jacq...@apache.org>
>> wrote:
>>>>>> 
>>>>>> Do you have a sense of how often we expose these?
>>>>>> 
>>>>>> One random thought, shade Guava and continue to expose the
>> shaded.guava
>>>>>> classes in public APIs.
>>>>>> 
>>>>>> People could choose to use the unshaded or shaded.
>>>>>> 
>>>>>>> On Sat, Sep 3, 2016 at 11:26 AM, Julian Hyde <jh...@apache.org>
>> wrote:
>>>>>>> 
>>>>>>> I'm not keen on shading Guava, because I want to include some of
>>>>>>> Guava's classes in Calcite's public API: for example ImmutableList
>> and
>>>>>>> Function. Using these classes in APIs makes better APIs. They should
>>>>>>> be in the JDK, but sadly they're not, so we use Guava.
>>>>>>> 
>>>>>>> Calcite's policy has been to support a wide range of Guava versions
>>>>>>> but to drop support for really old versions. We can use features in
>>>>>>> newer versions via reflection, as long as we don't introduce a link
>>>>>>> dependency (i.e. we call via reflection) and we can provide fallback
>>>>>>> for older versions. All of this is identical to our policy for JDKs,
>>>>>>> really.
>>>>>>> 
>>>>>>> All we need is that our dependencies move off the really old versions
>>>>>>> in a timely fashion.
>>>>>>> 
>>>>>>> Julian
>>>>>>> 
>>>>>>> 
>>>>>>> On Sat, Sep 3, 2016 at 10:20 AM, Andrew Purtell
>>>>>>> <andrew.purt...@gmail.com> wrote:
>>>>>>>> Use hbase-shaded-client as Maven dep (1.1 and up)
>>>>>>>> 
>>>>>>>>> On Sep 3, 2016, at 10:12 AM, James Taylor <jamestay...@apache.org>
>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>> Does shading of protobuf on the HBase client work (or is that
>>>> dependent
>>>>>>> on
>>>>>>>>> that brave work Stack is doing)?
>>>>>>>>> 
>>>>>>>>> On Sat, Sep 3, 2016 at 10:10 AM, Andrew Purtell <
>>>>>>> andrew.purt...@gmail.com>
>>>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>>> James - When Stack is finished coprocessors will work with shaded
>>>>>>>>>> protobuf. Not yet.
>>>>>>>>>> 
>>>>>>>>>>>> On Sep 3, 2016, at 10:07 AM, James Taylor <
>> jamestay...@apache.org
>>>>> 
>>>>>>>>>>> wrote:
>>>>>>>>>>> 
>>>>>>>>>>> Also agree - shading of guava & protobuf would be super valuable.
>>>>>>> Phoenix
>>>>>>>>>>> ended up not supporting shading of protobuf because of
>> difficulties
>>>>>>>>>> getting
>>>>>>>>>>> it to work (maybe because HBase dependency?). I think we support
>>>>>>> shading
>>>>>>>>>> of
>>>>>>>>>>> Guava, though. Is that correct, Sergey?
>>>>>>>>>>> 
>>>>>>>>>>>> On Sat, Sep 3, 2016 at 10:02 AM, Jacques Nadeau <
>>>> jacq...@apache.org>
>>>>>>>>>> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>> +1 on shading guava/protobuf.
>>>>>>>>>>>> 
>>>>>>>>>>>> On Sat, Sep 3, 2016 at 9:48 AM, Andrew Purtell <
>>>>>>>>>> andrew.purt...@gmail.com>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>>> Since Calcite should become a widely used library (smile) I
>>>> think it
>>>>>>>>>>>> would
>>>>>>>>>>>>> be prudent to shade Guava and protobuf if Calcite depends on
>>>> them.
>>>>>>> Then
>>>>>>>>>>>> you
>>>>>>>>>>>>> will play very nicely indeed on the classpath no matter what
>>>>>>> versions
>>>>>>>>>> are
>>>>>>>>>>>>> required by calling code.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Jacques - Good lord. Let me see about shading HBase use of
>>>> Guava, or
>>>>>>>>>>>>> eliminating it. Unfortunately that will be no help in the short
>>>>>>> term.
>>>>>>>>>>>>> Related, our Stack is wrestling with shading protobuf already,
>>>> and
>>>>>>> is
>>>>>>>>>>>> neck
>>>>>>>>>>>>> deep in the Swamp of Classloading at the moment.
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> On Sep 3, 2016, at 9:06 AM, Jacques Nadeau <
>> jacq...@apache.org>
>>>>>>>>>> wrote:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> It isn't a real solution but in Drill we solved the HBase
>>>>>>>>>>>> incompatibility
>>>>>>>>>>>>>> issue on the server side (for tests only) by patching Guava 18
>>>> to
>>>>>>>>>> allow
>>>>>>>>>>>>> the
>>>>>>>>>>>>>> HBase Guava calls that are missing. They are really quite
>>>> trivial
>>>>>>> and
>>>>>>>>>>>>>> support Andrew's arguments that Guava is the devil...
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> https://github.com/apache/drill/blob/master/exec/java-
>>>>>>>>>>>>> exec/src/main/java/org/apache/drill/exec/util/GuavaPatcher.
>> java
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> On Sat, Sep 3, 2016 at 8:16 AM, Andrew Purtell <
>>>>>>>>>>>> andrew.purt...@gmail.com
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> While that seems very unfriendly of them, the main issue is
>>>> Guava
>>>>>>> is
>>>>>>>>>>>> the
>>>>>>>>>>>>>>> devil (and protobuf is a minor demon). Would shading be an
>>>> option?
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> On Sep 3, 2016, at 2:03 AM, CPC <acha...@gmail.com> wrote:
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Cassandra driver 3.x require min guava 16.0.1. If it detects
>>>> an
>>>>>>>>>>>> earlier
>>>>>>>>>>>>>>>> version in classpath it stops working.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> On Sep 3, 2016 04:26, "Julian Hyde" <jh...@apache.org>
>>>> wrote:
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> James & Andrew, I hear you. We’ll stay on Guava 12 if we
>> have
>>>>>>> to.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> But can we try an experiment to see if it’s possible to get
>>>> away
>>>>>>>>>>>> with
>>>>>>>>>>>>>>> 14?
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> I propose that Maryann (who is developing the branch of
>>>> Phoenix
>>>>>>>>>> that
>>>>>>>>>>>>>>> uses
>>>>>>>>>>>>>>>>> Calcite) tries running with https://github.com/apache/
>>>>>>>>>>>>> calcite/pull/277
>>>>>>>>>>>>>>> <
>>>>>>>>>>>>>>>>> https://github.com/apache/calcite/pull/277>. If we
>> discover
>>>>>>>>>>>> problems,
>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>> can try various solutions, like make the DateRangeRules
>>>>>>> disabled by
>>>>>>>>>>>>>>> default
>>>>>>>>>>>>>>>>> (these, and the Druid adapter, are the only parts of
>> Calcite
>>>>>>> that
>>>>>>>>>>>> need
>>>>>>>>>>>>>>>>> Guava 14), or even copy the Guava classes that we need. If
>>>> there
>>>>>>>>>>>>> aren’t
>>>>>>>>>>>>>>>>> problems, it means that we’ve slipped out of the shackles
>> of
>>>>>>>>>> inertia
>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>> are trying to drag us into an early grave.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Julian
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> On Sep 2, 2016, at 5:35 PM, James Taylor <
>>>>>>> jamestay...@apache.org>
>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> On the server-side, HBase depends on Guava 12 (because
>>>> Hadoop
>>>>>>>>>>>> depends
>>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>>> the same). For that reason, we've made sure Phoenix can
>> work
>>>>>>> with
>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>> version too. Phoenix may not need to depend on Calcite on
>>>> the
>>>>>>>>>>>>>>>>> server-side,
>>>>>>>>>>>>>>>>>> and Phoenix and HBase both have shading, so there may be
>>>> some
>>>>>>>>>>>> avenues
>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>> escape.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Sorry for the muddled answer.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> On Fri, Sep 2, 2016 at 5:21 PM, Andrew Purtell <
>>>>>>>>>>>> apurt...@apache.org
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Use of Guava 14 introduces at least a compile time
>> problem
>>>>>>> with
>>>>>>>>>>>>> HBase,
>>>>>>>>>>>>>>>>> upon
>>>>>>>>>>>>>>>>>>> which Phoenix depends, so I'm not sure Phoenix can move
>>>> off of
>>>>>>>>>> 13.
>>>>>>>>>>>>> I'd
>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>> happy to be proven wrong.
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> On Fri, Sep 2, 2016 at 4:35 PM, Julian Hyde <
>>>>>>> jh...@apache.org>
>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> Calcite currently supports a wide range of Guava
>> versions,
>>>>>>> from
>>>>>>>>>>>>>>> 12.0.1
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> 19.0*. For https://issues.apache.org/
>>>>>>> jira/browse/CALCITE-1334 <
>>>>>>>>>>>>>>>>>>>> https://issues.apache.org/jira/browse/CALCITE-1334> I’d
>>>>>>> like to
>>>>>>>>>>>>> use
>>>>>>>>>>>>>>>>>>>> RangeSet, which was introduced in Guava 14.
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> Would anyone have a problem if we made Calcite’s minimum
>>>>>>> Guava
>>>>>>>>>>>>>>> version
>>>>>>>>>>>>>>>>>>>> 14.0.1?
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> I see that Hive uses 14.0.1, Phoenix uses 13, Drill uses
>>>> 18.
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> Julian
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> * Except for the Druid adapter, which requires 14; see
>>>>>>>>>>>>>>>>>>>> https://issues.apache.org/jira/browse/CALCITE-1325 <
>>>>>>>>>>>>>>>>>>>> https://issues.apache.org/jira/browse/CALCITE-1325>
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>> Best regards,
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> - Andy
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Problems worthy of attack prove their worth by hitting
>>>> back. -
>>>>>>>>>>>> Piet
>>>>>>>>>>>>>>> Hein
>>>>>>>>>>>>>>>>>>> (via Tom White)
>>>>>>> 
>>>> 
>>>> 
>>> 
>>> 
>>> --
>>> Best regards,
>>> 
>>>  - Andy
>>> 
>>> Problems worthy of attack prove their worth by hitting back. - Piet Hein
>>> (via Tom White)
>> 
>> 

Reply via email to