Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id D07EA200CDF for ; Thu, 17 Aug 2017 19:58:04 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id CD12416B66F; Thu, 17 Aug 2017 17:58:04 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id C462416B668 for ; Thu, 17 Aug 2017 19:58:03 +0200 (CEST) Received: (qmail 93774 invoked by uid 500); 17 Aug 2017 17:58:02 -0000 Mailing-List: contact dev-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "Commons Developers List" Delivered-To: mailing list dev@commons.apache.org Received: (qmail 93752 invoked by uid 99); 17 Aug 2017 17:58:01 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 17 Aug 2017 17:58:01 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id 3D0A3C1399; Thu, 17 Aug 2017 17:58:01 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -0.4 X-Spam-Level: X-Spam-Status: No, score=-0.4 tagged_above=-999 required=6.31 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_MESSAGE=2, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-2.8, RCVD_IN_SORBS_SPAM=0.5, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=disabled Authentication-Results: spamd1-us-west.apache.org (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com Received: from mx1-lw-us.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id cYI5gelbsppf; Thu, 17 Aug 2017 17:57:59 +0000 (UTC) Received: from mail-io0-f176.google.com (mail-io0-f176.google.com [209.85.223.176]) by mx1-lw-us.apache.org (ASF Mail Server at mx1-lw-us.apache.org) with ESMTPS id F3CC45F257; Thu, 17 Aug 2017 17:57:58 +0000 (UTC) Received: by mail-io0-f176.google.com with SMTP id g35so25564732ioi.3; Thu, 17 Aug 2017 10:57:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=4MyFHa1E0sSRZbxY8h9+EYALr1dZe0NlbrfaBpffSkU=; b=V9lqt69p03rSDdxqJYghglXR6ngcO6XYpglw3P16U1ao/ulH30DFHETRJWjiVUQyvx QbCuQblJnhz++R6f508X6Tik8tyGmV2EQ96+/h5hNTYQQJPySoB9+I7hVxe1uklemgVc ZRvDrkgqq3n23PnmR0poKuB5LtStbmae2cgiA46X3P75CzZg4TmOoRjDQu/ifayN1t0O RCS/KkhysVNtJHEleY5NE4j+oHLaiSGqC2buaxGoj13qav6spx63tGj9lRkM2KHh3otU +JRBOUh3+5S+lVLRm4MIXpd6ddInT1L0Metzt1iam3b9B1QfEBDYJQBbgHe/+wHzYJp7 s17Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=4MyFHa1E0sSRZbxY8h9+EYALr1dZe0NlbrfaBpffSkU=; b=A/O8Ifgr4Wll7nhFjCOsJdLLx04jWevdvsDrtONcbrzpHWt7xgUHxAKOeSCQrNfP6o 6Cp05mArkFAJT39prpTWybO22nUoJPTBcBqGSTDvMIEX1jCUcM7n1ylQ3kH/2quHAnSz UstvnhqqpJ9/QJ8IfQbhg/X+2/1H1h2da+LyxgLwz7W4IB2YYh3MlrCW3Zhy1+2OQBKx Ji2CAuUzHyJONXJP8G33eHbiE4h49zFS9iVAEKMCmWUVXCNwZX7X5iZpADGSuQu+C7b6 iIP26edZsQGh9q9Ao1Ko9dp5UQ4EQrW1vAgZKUpZQcYk+bJtlxNGqaCV6R6vYgAXziHT LPZA== X-Gm-Message-State: AHYfb5g4JGliKEinH3pbwYHuM9xC3KfJoAIRvyvwcznjHHzbfy0gJygy wZmVJZGJwqr4LP9GUDMb0DCB7iH2MUA3 X-Received: by 10.107.52.84 with SMTP id b81mr5380021ioa.186.1502992678010; Thu, 17 Aug 2017 10:57:58 -0700 (PDT) MIME-Version: 1.0 Received: by 10.2.92.19 with HTTP; Thu, 17 Aug 2017 10:57:57 -0700 (PDT) Received: by 10.2.92.19 with HTTP; Thu, 17 Aug 2017 10:57:57 -0700 (PDT) In-Reply-To: References: <0f45296071845faf757344a56b7e2ef0@scarlet.be> <6d3f648f999cd9ff726040b5ce84dc64@scarlet.be> <372b12c62d332dbbd71f1889d79855a1@scarlet.be> <6d54922767856921282813460cbfc106@scarlet.be> From: Gary Gregory Date: Thu, 17 Aug 2017 11:57:57 -0600 Message-ID: Subject: Re: [CSV] CSVMutableRecord To: Commons Users List Cc: Commons Developers List Content-Type: multipart/alternative; boundary="001a11441148ac45820556f6c021" archived-at: Thu, 17 Aug 2017 17:58:05 -0000 --001a11441148ac45820556f6c021 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Not yet ;-) On Aug 17, 2017 11:34, "nitin mahendru" wrote: > Hi All, > > Any consensus on this ? > > -Nitin > > > > > On Tue, Aug 15, 2017 at 4:43 PM Gary Gregory > wrote: > > > On Tue, Aug 15, 2017 at 5:32 PM, Gilles > > wrote: > > > > > On Tue, 15 Aug 2017 22:52:32 +0000, nitin mahendru wrote: > > > > > >> On Tue, 15 Aug 2017 12:02:20 -0600, Gary Gregory wrote: > > >> > > >>> On Tue, Aug 15, 2017 at 10:38 AM, nitin mahendru > > >>> > >>> > > >>>> wrote: > > >>>> > > >>> > > >>> How about having a state in the class itself which says that it's > > >>>> mutable > > >>>> or not. > > >>>> If we call a setter on an immutable then it throws an exception. > > >>>> By default the records are immutable and you need to make them > > >>>> mutable > > >>>> using a new API. > > >>>> > > >>> > > >> A code example would be useful... > > >> > > >> > > >> > > >> > > >> Below is the pull request I added. > > >> https://github.com/apache/commons-csv/pull/21 > > >> > > > > > > As I indicated in the previous message, this is functionally > > > breaking. [I'm diverting this discussion over to the "dev" > > > mailing list.] > > > > > > > Saying that making record mutable is "breaking" is a bit unfair when we > do > > NOT document the mutability of the class in the first place. > > > > Gary > > > > > > > > > > The following should be an interesting read: > > > http://markmail.org/message/6ytvmxvy2ndsfp7h > > > > > > > > > Regards, > > > Gilles > > > > > > > > > > > > > > >> On Tue, Aug 15, 2017 at 11:17 AM Gilles > > > >> wrote: > > >> > > >> On Tue, 15 Aug 2017 12:02:20 -0600, Gary Gregory wrote: > > >>> > On Tue, Aug 15, 2017 at 10:38 AM, nitin mahendru > > >>> > > >>> >> wrote: > > >>> > > > >>> >> How about having a state in the class itself which says that it'= s > > >>> >> mutable > > >>> >> or not. > > >>> >> If we call a setter on an immutable then it throws an exception. > > >>> >> By default the records are immutable and you need to make them > > >>> >> mutable > > >>> >> using a new API. > > >>> > > >>> A code example would be useful... > > >>> > > >>> >> pros: Saves memory, Keeps the immutability benefits > > >>> > > >>> What kind of usage are you considering that a single transient > > >>> record matters (as compared to the ~300 MB of the JVM itself...)? > > >>> > > >>> >> cons: people using "mutable" records need to be careful.(While > > >>> >> threading > > >>> >> maybe) > > >>> >> > > >>> > > > >>> > Interesting idea! > > >>> > > > >>> > But I think I like the idea of a subclass better if we are going = to > > >>> > split > > >>> > the behavior b/w mutable and immutable. > > >>> > > >>> Once you have a subclass that is able to modify the state of > > >>> its parent, it's a mutable object. Period. > > >>> There is no such thing as a "split". > > >>> > > >>> > > > >>> > For my money and the KISS principle, I would just add the put > method > > >>> > in > > >>> > CSVRecord. > > >>> > > >>> Then, any use that assumes immutability will be broken. > > >>> > > >>> > > >>> Gilles > > >>> > > >>> > > >>> > Gary > > >>> > > > >>> >> > > >>> >> -Nitin > > >>> >> > > >>> >> > > >>> >> > > >>> >> > > >>> >> On Tue, Aug 15, 2017 at 9:01 AM Gilles > > >>> >> > > >>> >> wrote: > > >>> >> > > >>> >> > On Tue, 15 Aug 2017 09:49:04 -0600, Gary Gregory wrote: > > >>> >> > > That looks odd to me. What comes up for me is the use case > where > > >>> >> I > > >>> >> > > want to > > >>> >> > > ETL a file of 10,000,000 records and update, say, one column= . > If > > >>> >> am > > >>> >> > > forced > > >>> >> > > to create a brand new record for every record read, that wou= ld > > >>> >> be a > > >>> >> > > shame. > > >>> >> > > > >>> >> > Why? > > >>> >> > > > >>> >> > > If I had a mutable record, I could just keep on updating it > and > > >>> >> using > > >>> >> > > it to > > >>> >> > > write each row. Read record, update it, write record. No ext= ra > > >>> >> memory > > >>> >> > > needed. > > >>> >> > > > >>> >> > How is the size of 1 additional record going to matter compare= d > to > > >>> >> the > > >>> >> > size of the whole program? > > >>> >> > > > >>> >> > > Either we can make the current record mutable (what's the > harm?) > > >>> >> or > > >>> >> > > we can > > >>> >> > > make the parser serve out mutable records based on a config > > >>> >> setting. > > >>> >> > > This > > >>> >> > > could be a subclass of CSVRecord with the extra method I > > >>> >> proposed. > > >>> >> > > > >>> >> > The harm is that you loose all the promises of immutability. > > >>> >> > > > >>> >> > Regards, > > >>> >> > Gilles > > >>> >> > > > >>> >> > > > > >>> >> > > Thoughts? > > >>> >> > > > > >>> >> > > Gary > > >>> >> > > > > >>> >> > > On Tue, Aug 15, 2017 at 8:33 AM, Gilles > > >>> >> > > > > >>> >> > > wrote: > > >>> >> > > > > >>> >> > >> On Tue, 15 Aug 2017 08:01:53 -0600, Gary Gregory wrote: > > >>> >> > >> > > >>> >> > >>> How does that work when you want to change more than one > > >>> >> value? > > >>> >> > >>> > > >>> >> > >> > > >>> >> > >> How about a "vararg" argument: > > >>> >> > >> > > >>> >> > >> /** > > >>> >> > >> * @param orig Original to be copied. > > >>> >> > >> * @param replace Fields to be replaced. > > >>> >> > >> */ > > >>> >> > >> public static CSVRecord createRecord(CSVRecord orig, > > >>> >> > >> Pair > ... > > >>> >> > >> replace) { > > >>> >> > >> // ... > > >>> >> > >> } > > >>> >> > >> > > >>> >> > >> > > >>> >> > >> Gilles > > >>> >> > >> > > >>> >> > >> > > >>> >> > >> > > >>> >> > >>> Gary > > >>> >> > >>> > > >>> >> > >>> On Aug 15, 2017 00:17, "Benedikt Ritter" < > britter@apache.org> > > >>> >> > >>> wrote: > > >>> >> > >>> > > >>> >> > >>> Hi, > > >>> >> > >>>> > > >>> >> > >>>> I very much like that CSVRecord is unmodifiable. So I=E2= =80=99d > > >>> >> suggest an > > >>> >> > >>>> API, > > >>> >> > >>>> that creates a new record instead of mutating the existin= g > > >>> >> one: > > >>> >> > >>>> > > >>> >> > >>>> CSVRecord newRecord =3D myRecord.put(1, =E2=80=9Evalue") > > >>> >> > >>>> > > >>> >> > >>>> I=E2=80=99m not sure about =E2=80=9Eput=E2=80=9C as a met= hod name since it clashes > > >>> >> with > > >>> >> > >>>> java.util.Map#put, which is mutation based... > > >>> >> > >>>> > > >>> >> > >>>> Regards, > > >>> >> > >>>> Benedikt > > >>> >> > >>>> > > >>> >> > >>>> > Am 15.08.2017 um 02:54 schrieb Gary Gregory > > >>> >> > >>>> : > > >>> >> > >>>> > > > >>> >> > >>>> > Feel free to provide a PR on GitHub :-) > > >>> >> > >>>> > > > >>> >> > >>>> > Gary > > >>> >> > >>>> > > > >>> >> > >>>> > On Aug 14, 2017 15:29, "Gary Gregory" > > >>> >> > > >>> >> > >>>> wrote: > > >>> >> > >>>> > > > >>> >> > >>>> >> I think we've kept the design as YAGNI as possible... > :-) > > >>> >> > >>>> >> > > >>> >> > >>>> >> Gary > > >>> >> > >>>> >> > > >>> >> > >>>> >> On Mon, Aug 14, 2017 at 3:25 PM, nitin mahendru < > > >>> >> > >>>> >> nitin.mahendru88@gmail.com> wrote: > > >>> >> > >>>> >> > > >>> >> > >>>> >>> Yeah that also is OK. I though there is a reason to > keep > > >>> >> the > > >>> >> > >>>> CSVRecord > > >>> >> > >>>> >>> without setters. But maybe not! > > >>> >> > >>>> >>> > > >>> >> > >>>> >>> Nitin > > >>> >> > >>>> >>> > > >>> >> > >>>> >>> > > >>> >> > >>>> >>> > > >>> >> > >>>> >>> > > >>> >> > >>>> >>> On Mon, Aug 14, 2017 at 2:22 PM Gary Gregory > > >>> >> > >>>> > >>> >> > >>>> > > > >>> >> > >>>> >>> wrote: > > >>> >> > >>>> >>> > > >>> >> > >>>> >>>> Hi All: > > >>> >> > >>>> >>>> > > >>> >> > >>>> >>>> Should we consider adding put(int,Object) and > > >>> >> put(String, > > >>> >> > >>>> Object) to > > >>> >> > >>>> the > > >>> >> > >>>> >>>> current CSVRecord class? > > >>> >> > >>>> >>>> > > >>> >> > >>>> >>>> Gary > > >>> >> > >>>> >>>> > > >>> >> > >>>> >>>> On Mon, Aug 14, 2017 at 2:54 PM, nitin mahendru < > > >>> >> > >>>> >>>> nitin.mahendru88@gmail.com> > > >>> >> > >>>> >>>> wrote: > > >>> >> > >>>> >>>> > > >>> >> > >>>> >>>>> Hi Everyone, > > >>> >> > >>>> >>>>> > > >>> >> > >>>> >>>>> I recently pushed a change(pull request 20) to get > the > > >>> >> line > > >>> >> > >>>> ending > > >>> >> > >>>> >>> from > > >>> >> > >>>> >>>> the > > >>> >> > >>>> >>>>> parser. > > >>> >> > >>>> >>>>> > > >>> >> > >>>> >>>>> Now I want to push another change which I feel will > > >>> >> also be > > >>> >> > >>>> useful > > >>> >> > >>>> for > > >>> >> > >>>> >>>> the > > >>> >> > >>>> >>>>> community. I want to add a CSVRecordMutable class > which > > >>> >> had > > >>> >> > >>>> a > > >>> >> > >>>> >>> constructor > > >>> >> > >>>> >>>>> which accepts a CSVRecord object. So when we have a > > >>> >> > >>>> CSVRecordMutable > > >>> >> > >>>> >>>> object > > >>> >> > >>>> >>>>> from it then we can edit individual columns using i= t. > > >>> >> > >>>> >>>>> > > >>> >> > >>>> >>>>> I would be using this to write back my edited CSV > file. > > >>> >> My > > >>> >> > >>>> use case > > >>> >> > >>>> >>> is to > > >>> >> > >>>> >>>>> read a csv, mangle some columns, write back a new > csv. > > >>> >> > >>>> >>>>> > > >>> >> > >>>> >>>>> I could have directly raised a pull request but I > just > > >>> >> > >>>> wanted to > > >>> >> > >>>> float > > >>> >> > >>>> >>>> the > > >>> >> > >>>> >>>>> idea before and see the reaction. > > >>> >> > >>>> >>>>> > > >>> >> > >>>> >>>>> Thanks > > >>> >> > >>>> >>>>> > > >>> >> > >>>> >>>>> Nitin > > >>> >> > >>>> >>>>> > > >>> >> > >>>> >>>> > > >>> >> > >>>> >>> > > >>> >> > >>>> >> > > >>> >> > >>>> >> > > >>> >> > >>>> > > >>> >> > >>>> > > >>> >> > >>>> > > >>> >> > >> > > >>> > > >>> > > >>> > > >>> ------------------------------------------------------------ > --------- > > >>> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org > > >>> For additional commands, e-mail: user-help@commons.apache.org > > >>> > > >>> > > >>> > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: user-unsubscribe@commons.apache.org > > > For additional commands, e-mail: user-help@commons.apache.org > > > > > > > > > --001a11441148ac45820556f6c021--