There is already AOP happening on every XyzService.saveXyz call. So we're
actually already paying the significant overhead. I think that
reflection+iterating over properties only on saveXyz methods is vanishingly
small additional overhead to the fact that every service call is AOPd.

-Darius

On Thu, Sep 22, 2011 at 12:51 PM, Burke Mamlin <[email protected]>wrote:

> On Thu, Sep 22, 2011 at 3:03 PM, Darius Jazayeri 
> <[email protected]>wrote:
>
>> So, does that mean you're fine with automagically changing empty String
>> properties of OpenmrsObjects to null before saving to the database?
>
>
> Yes.  I love magic (I'm no muggle!)… as long as it's not going to add
> several milliseconds or more to every API call.  If doing it automagically
> involves AOP or some other hook that is going to add (or contribute to) a
> measurable performance hit, I would rather find a way to manage it
> explicitly (via hibernate configuration, a custom hibernate type, and/or
> code reviews).
>
> -Burke
>
>
>> -Darius
>>
>> On Thu, Sep 22, 2011 at 11:43 AM, Burke Mamlin 
>> <[email protected]>wrote:
>>
>>> On Thu, Sep 22, 2011 at 9:18 AM, Darius Jazayeri <
>>> [email protected]> wrote:
>>>
>>>> I still think that we *should* be automagic.
>>>>
>>>> I cannot think of a single use case where you want "" and null to be
>>>> distinguishable. And Ben, your worry that "I fear there might be places
>>>> where a column is not nullable but the user doesn't want a value there"
>>>> is exactly why I *don't* want to allow "". If the field is required,
>>>> the whole point is that you are not supposed to be able to store an empty
>>>> value.
>>>>
>>>> Burke, Roger, others, can anyone give me an example of a real use case
>>>> in OpenMRS where we want null and "" to be semantically different in a
>>>> database column?
>>>>
>>>
>>> The only case of "" and null being semantically different would be cases
>>> where an empty string is a valid response and distinguishing "answered with
>>> blank" vs. not answered becomes important.  I can't think of a case where an
>>> "empty" response would be important to capture.
>>>
>>> -Burke
>>>
>>>
>>>>
>>>> -Darius
>>>>
>>>> On Thu, Sep 22, 2011 at 5:50 AM, Friedman, Roger (CDC/CGH/DGHA) (CTR) <
>>>> [email protected]> wrote:
>>>>
>>>>>  Yes I think this is true.****
>>>>>
>>>>> ** **
>>>>>
>>>>> However, I think I agree with Darius that in the context of attributes,
>>>>> attempting to create a string-valued property with a null value should
>>>>> result in no new property being created.  This could/should be extended to
>>>>> the empty string if the distinction between the two is difficult to 
>>>>> maintain
>>>>> when moving from the gui to the api.  This could also be extended to 
>>>>> saying
>>>>> that attempting to update a property value to null would be handled the 
>>>>> same
>>>>> as voiding the property.****
>>>>>
>>>>> ** **
>>>>>
>>>>> *From:* [email protected] [mailto:[email protected]] *On Behalf Of *Ben
>>>>> Wolfe
>>>>> *Sent:* Thursday, September 22, 2011 7:54 AM
>>>>>
>>>>> *To:* [email protected]
>>>>> *Subject:* Re: [OPENMRS-DEV] Empty string fields vs null fields****
>>>>>
>>>>>  ** **
>>>>>
>>>>> So our take-away here is to not do automagic but instead tell api users
>>>>> to put trimming/nulling into either their save methods or their setters?
>>>>>
>>>>> Ben****
>>>>>
>>>>> On Mon, Sep 12, 2011 at 5:24 PM, Darius Jazayeri <
>>>>> [email protected]> wrote:****
>>>>>
>>>>> Actually we've been treating the fact that when you save a patient, you
>>>>> get a bunch of person attributes with value=empty-string as a bug. (And 
>>>>> it's
>>>>> a bug that occurs precisely because of this null != empty string behavior.
>>>>> I.e. >95% of the time the significance of that difference is that someone
>>>>> forgets to treat a submitted empty string as null in a controller.)***
>>>>> *
>>>>>
>>>>> ** **
>>>>>
>>>>> -Darius****
>>>>>
>>>>> ** **
>>>>>
>>>>> On Mon, Sep 12, 2011 at 5:56 AM, Friedman, Roger (CDC/CGH/DGHA) (CTR) <
>>>>> [email protected]> wrote:****
>>>>>
>>>>> One reason to keep the empty string rather than null is collating
>>>>> order; null typically appears last, empty string first.
>>>>>
>>>>> Re what Ben says about person_attribute, I believe it is conventional
>>>>> throughout OpenMRS not to make a record to store a null value (attributes,
>>>>> obs, IDs), so if some required data is missing from an otherwise complete
>>>>> set of data elements (the patient forgot his national ID card, the vaccine
>>>>> manufacturer is missing from the mass campaign report, the patient forgot
>>>>> his ID card from another facility), the empty string is needed as a
>>>>> placeholder until that information becomes available.
>>>>>
>>>>> All of which is to agree with Burke that there are sometimes semantic
>>>>> reasons to distinguish empty string from null.
>>>>>
>>>>> I would put this in the API in the setters, along with
>>>>> trimming/padding.****
>>>>>
>>>>>
>>>>> -----Original Message-----
>>>>> From: [email protected] [mailto:[email protected]] On Behalf Of Ben Wolfe
>>>>> Sent: Monday, September 12, 2011 3:19 AM
>>>>> To: [email protected]
>>>>> Subject: Re: [OPENMRS-DEV] Empty string fields vs null fields
>>>>>
>>>>> If it was a runtime property switch that means that users/admins are
>>>>> the ones making the decision.  But it is not them but the developer
>>>>> that should be deciding how to treat empty strings.
>>>>>
>>>>> I like the automatic solution, but I fear there might be places where
>>>>> a column is not nullable but the user doesn't want a value there.
>>>>> That would end up with us (or module developer) forcing a space into
>>>>> the value to get around it, and that would definitely make things
>>>>> worse.  (I think person_attribute.value is like that now)
>>>>>
>>>>> So my vote would be to make it automagic by default but with the
>>>>> annotation to remove that magic.
>>>>>
>>>>> And -1000 for switching to Oracle.  Oh wait, Oracle already owns MySQL.
>>>>> Crap.
>>>>>
>>>>> Ben
>>>>>
>>>>> On Sat, Sep 10, 2011 at 12:06 AM, Saptarshi Purkayastha
>>>>> <[email protected]> wrote:
>>>>> > +1 for it to be done through the API, without automagic, but probably
>>>>> a
>>>>> > runtime-property to allow selecting automatic "" or null conversion
>>>>> > -0 for switching to Oracle
>>>>> > -1 for the annotation in code
>>>>> > ---
>>>>> > Regards,
>>>>> > Saptarshi PURKAYASTHA
>>>>> >
>>>>> > My Tech Blog:  http://sunnytalkstech.blogspot.com
>>>>> > You Live by CHOICE, Not by CHANCE
>>>>> >
>>>>> >
>>>>> > On 10 September 2011 02:00, Burke Mamlin <[email protected]>
>>>>> wrote:
>>>>> >>
>>>>> >> I believe this should be done at the API level, in order to benefit
>>>>> other
>>>>> >> applications that use the API.  I don't think it should be done
>>>>> >> automagically (e.g., with an OpenmrsObjectSaveHandler) for two
>>>>> reasons: (1)
>>>>> >> there may be cases were an empty string and null are semantically
>>>>> different
>>>>> >> and (2) aspect-oriented changes like this are not without a cost
>>>>> (they can
>>>>> >> add up to real performance hits).
>>>>> >> How about an annotation on the property like
>>>>> >> @BlankValue(persist=NULL|BLANK)? . or maybe we should just switch to
>>>>> Oracle.
>>>>> >> ;-)
>>>>> >> -Burke
>>>>> >> On Fri, Sep 9, 2011 at 3:52 PM, Darius Jazayeri <
>>>>> [email protected]>
>>>>> >> wrote:
>>>>> >>>
>>>>> >>> Hi All,
>>>>> >>> The way that our webapp, our API, and the DB interact, we
>>>>> frequently run
>>>>> >>> into the case where we store empty strings in the database for
>>>>> values, when
>>>>> >>> they really should be null.
>>>>> >>> For example if you save a Concept Source and leave the HL7 Code
>>>>> field
>>>>> >>> blank, you save a row with concept_source.hl7_code = '' rather than
>>>>> null.
>>>>> >>> (Because the webapp submits an empty input, and we use spring MVC
>>>>> to bind
>>>>> >>> that to a bean property.)
>>>>> >>> Two tickets that I looked at today are related to this (and there
>>>>> are
>>>>> >>> certainly others):
>>>>> >>> https://tickets.openmrs.org/browse/TRUNK-2516
>>>>> >>> https://tickets.openmrs.org/browse/TRUNK-2004
>>>>> >>> We should try to fix this problem in a general way. At first
>>>>> thought I
>>>>> >>> can't come up with a case where we really want to save the empty
>>>>> string in a
>>>>> >>> database field rather than null. So some possible solutions are:
>>>>> >>>
>>>>> >>> (at the web level) use a custom PropertyEditor for the String class
>>>>> in
>>>>> >>> all our Spring controllers, so that if you submit "" and bind that
>>>>> to a
>>>>> >>> String property, it sets it to null.
>>>>> >>> (at the API level) in OpenmrsObjectSaveHandler iterate over all
>>>>> String
>>>>> >>> properties and if any of them are "" then set them to null.
>>>>> >>>
>>>>> >>> (The first would allow API consumers to explicitly set empty string
>>>>> >>> properties on objects, while the second wouldn't.)
>>>>> >>> Any thoughts on this?
>>>>> >
>>>>>
>>>>>
>>> ------------------------------
>>> Click here to 
>>> unsubscribe<[email protected]?body=SIGNOFF%20openmrs-devel-l>from 
>>> OpenMRS Developers' mailing list
>>>
>>
>> ------------------------------
>> Click here to 
>> unsubscribe<[email protected]?body=SIGNOFF%20openmrs-devel-l>from 
>> OpenMRS Developers' mailing list
>>
>
> ------------------------------
> Click here to 
> unsubscribe<[email protected]?body=SIGNOFF%20openmrs-devel-l>from 
> OpenMRS Developers' mailing list
>

_________________________________________

To unsubscribe from OpenMRS Developers' mailing list, send an e-mail to 
[email protected] with "SIGNOFF openmrs-devel-l" in the  body (not 
the subject) of your e-mail.

[mailto:[email protected]?body=SIGNOFF%20openmrs-devel-l]

Reply via email to