But wouldn't your process be more complex?  What about refObjects?  Your extra 
setData() calls?  Friendly URLs?  Caching (object broker)?

We are talking about importing into FarCry, right? (maybe I missed part of the 
discussion :)

--
Jeff Coughlin

On Jan 13, 2014, at 7:09 PM, Justin Carter <[email protected]> wrote:

> Sure you can use createData() for a complex use case, but if all you're doing 
> is setting a label then SQL bulk inserts will also work fine :)
> 
> cheers,
> Justin
> 
> --
> Justin Carter
> http://www.madfellas.com/blog
> http://twitter.com/justincarter
> 
> 
> On Tue, Jan 14, 2014 at 10:41 AM, Jeff Coughlin <[email protected]> wrote:
> Justin,
> 
>> For bulk inserts we typically insert directly into the DB too for 
>> performance reasons. As Jeff says, the two main things to be aware of are 
>> setting the label and setting the friendly URL (assuming that content has a 
>> friendly URL). If you have any other calculated/derived properties then you 
>> could run the beforeSave and setDate as a post import process, but it 
>> depends on how complex your custom types are as to what business logic you 
>> need to run.
> 
> 
> You're making it more complicated than it needs to be.  There are more 
> efficient (and cleaner) ways to do it.  I have scripts that import thousands 
> (and sometimes millions) of records.  You can do it all with createData() as 
> long as you properly batch it.  See my answer to Scott below for more details.
> 
> ---
> Scott,
> 
>> So you do bursts of imports, on a scheduled task or something?
> 
> 
> Whether it's a scheduled task or not is irrelevant (unless you plan to use 
> onComplete in CF10's schedule - which is just awesome).
> 
> Whatever process you're using now to import the data, when your cfm file is 
> triggered you import, say, the first 100 items - in batches of 100 for this 
> example (*see note below).  Whatever the last item was, set that record's 
> unique identifier to a temp variable (or whatever value you want to use to 
> identify the last record).  Then call the same import file at the bottom 
> using cflocation and give it the variable for the unique ID.  Using that ID, 
> tell your script to start from the next record.  Each time the file finishes 
> (and before it calls itself again) the process is flushed from memory (which 
> is the whole point of batching).
> 
> *note: The batch size depends on how much RAM is available to the JVM. Some 
> clients I have can do batches 50k and higher batches, but it really doesn't 
> matter if you use low numbers. Even it you set it to a low number, it will 
> still import very quickly using this process.  The only difference is that 
> you might have to run a query each time at the top of the file (I suggest 
> running a manual query and limiting it to return only 100 records - or 
> whatever your batch size is).
> 
> There are a bunch of other things I'd do of course, like set a tracking 
> variable that allows me to cancel a long-running import with a click from 
> within the webtop, setting <cfsetting/> at the top of the file with a decent 
> length requestTimeout, using a condition around the cflocation to know if the 
> import process is complete and to stop (don't want a non-ending loop), etc.  
> But you get the idea.
> 
> I have one client that actually does import millions of records at a time 
> using this process and it is quite fast and efficient (well, it takes many 
> hours, but still faster than other solutions I've done in the past).  And 
> there is no need to run all your methods manually and then update each record 
> a second time using setData().  *Note:* For that particular client I find it 
> faster to import the data with no solr indexing.  Once complete I index the 
> data in batches using the same batch process.
> 
> Let me know how it goes for you.
> 
> --
> Jeff Coughlin
> 
> On Jan 13, 2014, at 6:19 PM, Justin Carter <[email protected]> wrote:
> 
>> For bulk inserts we typically insert directly into the DB too for 
>> performance reasons. As Jeff says, the two main things to be aware of are 
>> setting the label and setting the friendly URL (assuming that content has a 
>> friendly URL). If you have any other calculated/derived properties then you 
>> could run the beforeSave and setDate as a post import process, but it 
>> depends on how complex your custom types are as to what business logic you 
>> need to run.
>> 
>> Glad you got it sorted though :)
>> 
>> cheers,
>> Justin
>> 
>> --
>> Justin Carter
>> http://www.madfellas.com/blog
>> http://twitter.com/justincarter
>> 
>> 
>> On Tue, Jan 14, 2014 at 10:02 AM, Scott Mebberson <[email protected]> 
>> wrote:
>> Hey guys,
>> 
>> Yeah. We don't always import using createData or setData. When doing it on 
>> 1000s of rows (daily) it's WAYYYYY to slow.
>> 
>> On one instance, we wrote a bunch of import scripts based largely in bulk 
>> inserts within MYSQL (CSV straight to MYSQL) and then filled in the gaps 
>> that the framework usually does via createData and setData.
>> 
>> Lots of testing to get that right though!
>> 
>> My current instance is slightly different though. But it's all working sweet 
>> now, thanks.
>> 
>> cheers,
>> Scott.
>> 
>> On 14/01/2014, at 9:28 AM, Jeff Coughlin <[email protected]> wrote:
>> 
>>>> Yeah, the label property will only get set by the framework if setData() 
>>>> is called
>>> 
>>> or when using createData() - which is what you'd normally use when manually 
>>> importing data into FarCry.
>>> 
>>> ...Unless you are setting the label in beforeSave() in which case manually 
>>> calling createData() does not call beforeSave().  This is a known bug 
>>> that's just been around for years (can't find the bug number).  We just 
>>> always make sure to call beforeSave() manually before using createData().
>>> 
>>> And always make sure to call application.fc.factory.farFU.setSystemFU() to 
>>> create the friendly url as well after using createData(), as createData() 
>>> doesn't call that either if also using displaySystemFU.cfm (bug number 
>>> FC-2268).  So just to be safe, I always call the aforementioned method for 
>>> FU's after calling createData().
>>> 
>>> Good luck.
>>> 
>>> --
>>> Jeff Coughlin
>>> 
>>> On Jan 13, 2014, at 5:36 PM, Justin Carter <[email protected]> 
>>> wrote:
>>> 
>>>> Yeah, the label property will only get set by the framework if setData() 
>>>> is called, so if it was a direct SQL insert then it will bypass the 
>>>> framework :)
>>>> 
>>>> cheers,
>>>> Justin
>>>> 
>>>> --
>>>> Justin Carter
>>>> http://www.madfellas.com/blog
>>>> http://twitter.com/justincarter
>>>> 
>>>> 
>>>> On Tue, Jan 14, 2014 at 9:31 AM, Scott Mebberson 
>>>> <[email protected]> wrote:
>>>> Hey Jeff,
>>>> 
>>>> Of course. I'll give that a shot, and verify it that it doesn't happen for 
>>>> new instances. I'm working with data imported by someone else, so chances 
>>>> are they didn't script label field up when inserting the data.
>>>> 
>>>> I think everyone can ignore this post! Sorry.
>>>> 
>>>> cheers,
>>>> Scott.
>>>> 
>>>> On 14/01/2014, at 8:57 AM, Jeff Coughlin <[email protected]> wrote:
>>>> 
>>>>> I haven't seen this, but I'm still on FC 6.3 at the moment (except for 
>>>>> some testing I'm doing in 7).  Until a fix is found, one thing you can do 
>>>>> is force it to save the title to the label by creating a custom 
>>>>> beforeSave() method inside the custom type.  If anything it will at least 
>>>>> give you a temporary workaround.  But if this is a bug in FC7, then it's 
>>>>> a pretty serious one (IMO).
>>>>> 
>>>>> Example:
>>>>> 
>>>>> <cffunction name="beforeSave" access="public" output="false" 
>>>>> returntype="struct">
>>>>>   <cfargument name="stProperties" required="true" type="struct" />
>>>>>   <cfargument name="stFields" required="true" type="struct" />
>>>>>   <cfargument name="stFormPost" required="false" type="struct" /> 
>>>>> 
>>>>>   <cfset arguments.stProperties.label = arguments.stProperties.title />
>>>>> 
>>>>>   <cfreturn super.beforeSave(argumentCollection=arguments) />
>>>>> </cffunction>
>>>>> 
>>>>> If you feel comfortable sharing your CFC, go ahead and post it (maybe 
>>>>> we'll see something you're missing - sometimes it just takes a second set 
>>>>> of eyes to see something we've overlooked).  If not, you are welcome to 
>>>>> send it to just me and I'll be happy to see if something jumps out.
>>>>> 
>>>>> --
>>>>> Jeff Coughlin
>>>>> 
>>>>> On Jan 13, 2014, at 5:12 PM, Scott Mebberson <[email protected]> 
>>>>> wrote:
>>>>> 
>>>>>> Has anyone run into a problem in which labels for a custom object type 
>>>>>> aren't working on all occasions. Works for some instances of the object 
>>>>>> type, but not others. The type does have a title property, which always 
>>>>>> contains the real value.
>>>>>> 
>>>>>> I've tried the following:
>>>>>> updateApp (a few dozen times, and after each of the following)
>>>>>> added bLabel to the title cfproperty tag
>>>>>> added displayLabel.cfm to the type folder in webskins and am outputting 
>>>>>> stObj.title
>>>>>> But still, no label. The label doesn't exist in the stObj that is passed 
>>>>>> around to the various webskins.
>>>>>> 
>>>>>> Any ideas?
>>>>>> 
>>>>>> I'm running FarCry 7 (I did git pull on both core and farcrycms this 
>>>>>> morning so they're fresh!).
>>>>>> 
>>>>>> Thanks,
>>>>>> Scott.

-- 
You received this message cos you are subscribed to "farcry-dev" Google group.
To post, email: [email protected]
To unsubscribe, email: [email protected]
For more options: http://groups.google.com/group/farcry-dev
--------------------------------
Follow us on Twitter: http://twitter.com/farcry
--- 
You received this message because you are subscribed to the Google Groups 
"farcry-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to