IRC log for #storm on 20070711

00:21.26tjsradix:
00:21.33tjssetup.py
00:21.46tjsseems to be missing :)
00:27.38jkakartjs: It is.  Apparently oubiwann has posted a patch to add something like that; it hasn't made it the list yet.
00:27.58tjscool
00:28.01oubiwannjkakar: yeah, I think it's being held by mailman
00:28.24tjsso how open is the development?
00:28.25jkakaroubiwann: Yeah, I figured new-list-configuration-fun was to blame. :)
00:28.31oubiwannheh
00:28.42jkakartjs: It's open.
00:28.57tjswill non-canonical contributers get commit access at some point?
00:29.03jkakartjs: However, you can expect a UQDS-like review cycle before anything will be accepted.
00:29.15tjsthats fair
00:29.22jkakartjs: I don't know what the plans are around that; however, it's hosted on launchpad.
00:30.16jkakartjs: You can always branch from http://bazaar.launchpad.net/~storm/storm/trunk to implement your changes.
00:30.34*** join/#storm jml (n=jml@203-113-250-169-static.TAS.netspace.net.au)
00:30.36jkakartjs: Because we're using bzr your new branch will be completely functional.
00:30.39tjsheya jml
00:30.58jkakartjs: You can push branches directly up to launchpad and they'll appear on the storm product page.
00:31.19tjscool
00:31.32jkakartjs: So, in some ways, given the tools we're using having commit access to trunk is less exciting than it is in a CVS/SVN style environment.
00:32.10jkakartjs: niemeyer is the primary author of Storm and he's a very reasonable guy.  I wouldn't anticipate problems with getting features in; they will have to go through the review process, as mentioned.
00:32.11jmlWelcome to the joy of Launchpad / Bazaar
00:32.17tjsthe zope3 storm glue radix was talking about
00:32.22jkakarjml: It's *SO* awesome.
00:32.25tjswill that be part of the storm package?
00:32.32tjsor another thing?
00:32.45jkakartjs: It's very small.  I'll send a message just now to our manager about it.
00:32.45jmljkakar: :)
00:32.50jkakartjs: Likely another thing.
00:32.57tjsjkakar: that would be fantastic
00:32.59jmljkakar: noticed any improvements using bzr+ssh for storm?
00:33.07jkakarjkakar: With LP?
00:33.49jmljkakar: yeah
00:33.49jml(I assume you weren't talking to yourself)
00:33.56jkakarjml: I've generally noticed that since 0.17 came out bzr+ssh works reliably.  In the past I found myself falling back to sftp for certain operations (like 'bzr update').
00:34.23jkakarjml: I tend not to talk to myself, so yeah... ;)
00:36.56*** join/#storm bogdano (n=bogdano@201-15-250-176.ctame704.dsl.brasiltelecom.net.br)
00:38.45jkakartjs: I've just sent a message mentioning that there have been requests for the Zope integration code to be opened.  We'll see what happens now. :)
00:39.02tjsjkakar: thanks :)
00:39.07jkakartjs: np.
00:49.24tjsriddle me this
00:49.37tjsI create a class, and an in-mem db
00:49.47tjsI dont create a table
00:50.10tjsI can add an object from this class to a store, I can flush the store, with no complaint about a missing table
00:51.28tjsI can store.commit() without complaint also
00:53.55jmltjs: c'mon, that's just the sort of riddle that should send you diving into the source, documentation pants at the ready.
00:54.13jkakartjs: Ouch. :)
00:54.20tjsjml: aye, I started diving about a minute ago ;)
00:55.10tjswhy the localst.py indirection ?
00:55.16tjslocals.py
01:05.44tjsradix: when are you going to be in AU next?
01:06.13tjsthey should run one of those canonical get-togethers in Melbourne so we can catch up again :)
01:23.03*** join/#storm johan (n=jdahlin@201-42-94-52.dsl.telesp.net.br)
01:27.37tjsis the list archive restricted to showing posts after the date you sign up?
01:27.49tjsor is the mailing list totally new?
01:44.28radixtjs: there were only a few posts before we opened the list
01:48.36*** join/#storm jkakar (n=jkakar@c-24-21-131-142.hsd1.mn.comcast.net)
01:51.45*** join/#storm creiht (n=cthier@cpe-67-11-141-184.satx.res.rr.com)
01:54.56tjswoot
01:55.17tjsI have a semi working upgraders registry for storm classes
01:56.05tjsusing __storm_loaded__
02:08.54radixhooray :)
02:10.04tjsradix: is it possible to create complex SQL() expressions for optimising expensive queries, and have the results munged into objects?
02:10.59tjsor partial objects with lazy-lookup of attributes missing from the result set?
02:22.36radixwait, oubiwann's patch didn't make it to the list?
02:22.41radixI guess I didn't notice since he Cc'd me
02:25.16radixtjs: there's generally no need to use SQL() for optimizing queries
02:25.38radixtjs: the find() syntax is isomorphic with actual SQL
02:25.58radixthe only time you really need to fall back to strings of SQL is when there's some piece of syntax which Storm does not yet support
02:26.57radixand as for partial objects, Storm doesn't support that but that's unlikely to be a win. We *do* lazy-load References and ReferenceSets, which is the really useful thing.
02:27.49radixoh, it appears oubiwann only sent the patch to me.
02:27.52radixnot the list
02:31.26*** join/#storm jml_ (n=jml@ppp121-44-217-216.lns1.hba1.internode.on.net)
02:32.14oubiwannradix: doh! what was I thinking? I mean you're special and all... but I really did mean to send that to the list
02:33.12*** join/#storm jkakar (n=jkakar@c-24-21-131-142.hsd1.or.comcast.net)
02:34.37oubiwannradix: ah, I hit "reply
02:34.50oubiwannand the list isn't set up to reply to list, just individual
02:35.05oubiwannjust sent it again
02:35.50radixoubiwann: :)
02:35.56oubiwannin fact, it looks like most of my sends to the list didn't make it
02:36.07oubiwannthough barry warsaw and I had a nice exchange :-)
02:36.10radixoubiwann: oops :)
02:36.13oubiwannhehe
02:36.24radixoubiwann: what do you think about falling back to distutils when setuptools is unavailable?
02:36.30oubiwannare you a list admin? can I talk you into changing the reply behavior?
02:36.37radixno, I'm not
02:36.42oubiwannradix: sure, I think that's fine
02:37.12oubiwannradix: you mean ditch ez_setup and do a try block, right?
02:37.14radixin other words, not using ez_setup and instead just trying to import setup from setuptools, and if it fails, import setup from distutils
02:37.18radixyes
02:37.30oubiwannsure,  I'll do that right now
02:37.40radixpartially because I hate setuptools and also because I've actually seen situations where people are unable to install software because a web site is down or something
02:37.59oubiwannheh
02:38.19oubiwannwell, setuptools may be a pita sometimes, but it's all we've got for now
02:38.31oubiwannI've been learning to live with it and even like it now
02:39.05radixI'm doing already with distutils :P
02:39.21radixI can understand e.g. windows and mac people wanting eggs, so I'm happy to let it in
02:39.28radixs/already/alright/
02:40.54radixit's probably silly, don't envy too much :)
02:40.58oubiwannheh
02:41.32oubiwannI'm getting ready to head out to an Indian reservation for sundance, so I guess I've got plenty of adventure ahead of me :-)
02:42.45radixman, now _that_ is cool :)
02:42.59oubiwann:-)
02:43.55radixI guess that's what you're heading out of town for a week for
02:44.12radixman, busy life
02:45.54oubiwannheh
02:45.55oubiwannyup
02:46.03oubiwannit's been one truly nutty summer
02:46.16oubiwannI'm so looking forward to fall, just so the madness will end
02:46.28oubiwannI just send the new bzr diff
02:46.50oubiwannthat's my last act for a while -- see you in a week
02:47.32jmloubiwann: ciao
02:47.48oubiwannjml: cya man
02:47.58oubiwannjml: also "hi!" it's been a while!
02:48.24jml:)
05:36.37*** join/#storm niemeyer (i=niemeyer@conference/europython/x-72046f6e682c575e)
06:01.13*** join/#storm tjs (n=tjs@203.206.162.25)
06:17.06*** join/#storm dialtone (i=dialtone@conference/europython/x-d4141e9e671411ee)
06:20.09*** join/#storm niemeyer (i=niemeyer@conference/europython/x-e7d477d09362975d)
08:17.19*** join/#storm dialtone (i=dialtone@conference/europython/x-c102e842de8d79ae)
08:23.00*** join/#storm dialtone (i=dialtone@conference/europython/x-011dedfc079b874f)
08:34.23*** join/#storm apoirier (n=kvirc@LAubervilliers-151-11-27-221.w193-251.abo.wanadoo.fr)
09:53.54*** join/#storm dialtone (i=dialtone@conference/europython/x-2c9f378676205afc)
11:13.08*** join/#storm statik (n=emurphy@canonical/launchpad/statik)
12:12.17*** join/#storm bac (n=bac@canonical/launchpad/bac)
13:11.54*** join/#storm jmjones (n=jmjones@adsl-074-184-006-221.sip.asm.bellsouth.net)
14:11.32*** part/#storm jmjones (n=jmjones@adsl-074-184-006-221.sip.asm.bellsouth.net)
14:11.59*** join/#storm jmjones (n=jmjones@adsl-074-184-006-221.sip.asm.bellsouth.net)
14:12.16*** join/#storm bigdo1 (n=scmikes@49-66-14-216-arpa.cust.cinci.current.net)
14:15.29statikdid the tutorial get added to the source tree yet?
14:16.59dialtonemy god... bazaar is the worst thing in the world... please make it fast :(
14:17.38dialtone(I know it's not exactly the right channel)
14:17.59statikdialtone: which version are you using? Are you talking about the speed when branching storm from launchpad?
14:19.23dialtoneI just downloaded latest stable
14:19.34dialtoneand I'm trying to branch zoocampr
14:19.47dialtoneI started branching more than an hour ago
14:19.54dialtoneand it has yet to finish :(
14:21.06dialtonefinally
14:21.10statikdialtone: I don't know about a zoocampr project, are you branching over the smart server?
14:21.15dialtonefrom 16.13 to 17.20 just for the branch
14:21.29dialtoneI'm just running:
14:21.37dialtonebzr branch http://repo.spacepants.org/zookeepr/mainline zookeepr
14:21.56dialtoneI doubt the server can be considered that smart
14:22.30statikI know there have been some very recent developments with the bazaar smartserver that make initial branching over the network MUCH faster
14:23.07dialtoneMUCH would be even better
14:23.17statikanyhow, if you are involved with spacepants.org, the folks on #bzr can probably help you set up the smartserver
14:24.07dialtonewell, it's just that I needed to checkout this project, but if it always takes over an hour to checkout 400 revisions...
14:24.48statikdialtone: once you have the initial copy, you can always branch from that, and it should be pretty quick. set up a shared-repo, and it will be lightning fast
14:25.13dialtoneyes sure but the problem is still there
14:30.33statikradix: take pity on me and teach me how to connect storm to multiple databases. the tests all seem to use a single DB
14:31.18*** join/#storm bigdo2 (n=scmikes@49-66-14-216-arpa.cust.cinci.current.net)
14:33.50radixstatik: just create two Store objects :)
14:34.08radix(pointing at two different database objects, of course)
14:34.40radixstatik: btw tests/tutorial.txt is the same as the one at http://storm.canonical.com/Tutorial
14:34.58radixoh, I guess you knew that and were specifically looking for it in the source
14:35.22statikradix: thanks! i was looking for something more complicated and missed the obvious
14:35.49statikis there any built in support for "sharding" data between multiple DBs, or do you do that manually at the app level?
14:36.23radixstatik: we do it at the app level
14:38.04statikradix: I see. are you just keeping different tables in different stores, or do you have any giant tables which you partition across different stores?
14:38.29radixstatik: our app does have the same kinds of objects in different databases
14:38.40radixstatik: there's also cases where certain kinds of objects are in their own special database
14:39.02radixstatik: basically you have to figure out what the point of scaling is
14:39.20radixstatik: per-user, per-organization, per-something-else
14:40.46radixif you decide to scale per-user, for example, you'll add some sort of identifier to the 'user' table to say which database all its related objects are in, and then any time you want to look up an object related to that user, you find the store for the database it's in and load the object
14:42.06statikcool, that confirms what I was imagining. there you have to decide ahead of time how the data will be partitioned. I want to do arbitrary partitioning based on real world business relationships which will change over time (and the code should not have to change), so I guess I'll need to build a separate layer to do the mapping between stores. I've heard people advocate using memcached for doing partition mapping lookup stuff, but haven't ever
14:42.07statikused it myself
14:43.26radixhmm
14:43.30radixthat's interesting
14:43.39radixstatik: but isn't your scaling point then "business relationship"? :)
14:44.03dialtoneradix: apparently gustavo is going to have a sprint here, but unfortunately I won't be able to partecipate
14:44.11dialtonepush for async integration pleeeeease
14:44.20radixdialtone: I really don't know what that means
14:44.26radixdialtone: it's not as simple as it sounds :)
14:45.13statikradix:  I made a slight simplification. I'm not partitioning to scale, I'm partitioning for data privacy reasons, so I want to allow arbitrary movement of objects between different stores
14:45.22radixstatik: huh, interesting
14:45.37radixstatik: so yeah, I was just wondering about moving objects
14:45.42statikradix: this is why I was interested in using UUID as PK
14:45.51radixstatik: ah yes!
14:46.08radixWe'll have to check to make sure that moving an object from one store to another is easy with storm
14:46.41radixI *imagine* it's as simple as store1.remove(obj); store2.add(obj)
14:46.56*** join/#storm michelp (n=michelp@69-30-72-119.dq1sf.easystreet.com)
14:47.00statikradix: awesome. this is something I hope to be able to play with soon, I'll let you know how it goes
14:47.08*** join/#storm niemeyer (i=niemeyer@conference/europython/x-5005b7d636bc926c)
14:47.10radixstatik: cool, good luck
14:47.48statikradix: thanks! figuring out how to do the move transactionally will be interesting
14:48.07radixohh yeah, cross-store transactions
14:48.10radixalways a fun thing
14:48.13*** join/#storm bigdo1 (n=scmikes@49-66-14-216-arpa.cust.cinci.current.net)
14:48.41niemeyerHey everyone
14:49.00jmjoneshi someone :-)
14:49.18statikhey there niemeyer
14:49.22radixjbot: logs
14:49.22jbot[logs] apt/ibot/infobot/jbot/purl all log daily to http://ibot.rikers.org/<channelname>/ where channelname is html encoded ie: %23debian | lines that start with a space are not shown | some channels have stats at http://ibot.rikers.org/stats/<channelname>.html.gz
14:50.02radixjmjones: Hi :_)
14:50.21*** mode/#storm [+o radix] by ChanServ
14:50.25*** mode/#storm [-o jbot] by radix
14:50.27*** mode/#storm [-o radix] by radix
14:50.35radixnow it's less scary
14:50.38jmjones/who radix
14:50.49radixjmjones: maybe "/whois" :-)
14:50.54jmjonessorry - trying to figure out how i know radix
14:51.07jmjonesyeah - better - hi radix
14:51.24jmjonestrying to see if you were on #python
14:51.50radixunlikely, probably #twisted :)
14:51.57jmjonesyeah - that's what i was just thinking
14:54.51niemeyerradix is famous.. I've seen his name at least twice at EuroPython
14:55.10jmjonesniemeyer: you're no slouch yourself...
14:55.13radixoh crap, they've found out about me
14:55.44jmjonesyour name (and storm) has been popping up a lot lately it seems
14:56.48radixniemeyer: so who mentioned me, some Twisted guys?
14:58.07niemeyerjmjones: I just go to conferences to show up.. radix is the guy who actually codes
14:58.31radixsnrk ;P
14:58.55niemeyerradix: Storm's talk, and Michael Hudson just mentioned it again
14:59.02niemeyerradix: With twisted context
14:59.03jmjones:-)  i would ask how i get a gig like that, but i think i like coding more.  conferences are fun, though.
14:59.13radixniemeyer: did I tell you that like ten minutes after I posted my blog post about storm, someone sent me a private email asking to give a talk on storm at the cambridge python meetup?
14:59.34niemeyerWoah! That's very cool!
15:00.23radixyeah, I'll proabbly some of your slides :)
15:00.42niemeyerDudes! I've got a conf call in half an hour (not about Storm).. I have to find a phone..
15:01.02radixjust ask one of your thousands of adoring fans :)
15:01.18niemeyerI'll try to post a mail about the development process late today, and push a branch for review
15:01.53radixniemeyer: SPEAKING of which, you did not put oubiwann's patch through the full review process! :)
15:02.03niemeyerradix: Ah, that was [trivial] :-)
15:02.13radixhehe, fair enough :)
15:02.27niemeyerBut I did forget to tag it.. :-(
15:02.32niemeyerAnyway.. back later!
15:02.34radixlater
15:05.01*** join/#storm bigdo1 (n=scmikes@49-66-14-216-arpa.cust.cinci.current.net)
15:15.09*** join/#storm dialtone (i=dialtone@conference/europython/x-7e5352c51952b54a)
15:19.40*** join/#storm niemeyer (i=niemeyer@conference/europython/x-51eca801b294175b)
15:57.12*** join/#storm creiht (n=cthier@64.39.1.11)
16:05.17*** join/#storm michelp (n=michelp@72.11.116.6)
16:07.07*** join/#storm rbriski (i=rbriski@nat/yahoo/x-6b58e66343fcdced)
16:11.38*** join/#storm jkakar (n=jkakar@72.11.116.6)
16:13.21*** join/#storm jkakar (n=jkakar@72.11.116.6)
16:23.31*** join/#storm bogdano (n=bogdano@201-15-250-176.ctame704.dsl.brasiltelecom.net.br)
17:08.08*** join/#storm bigdo1 (n=scmikes@49-66-14-216-arpa.cust.cinci.current.net)
17:44.03*** join/#storm michelp (n=michelp@72.11.116.6)
18:02.58*** join/#storm rafael (n=rafael@moinmoin/fan/rafael)
18:03.08rafaelhoi
18:06.03*** join/#storm bigdo2 (n=scmikes@49-66-14-216-arpa.cust.cinci.current.net)
18:06.19radixrafael: Good Afternoon
18:08.19rafaeli'm just working through the tutorial - its sooooo great (i didn't unsterstand sqlalchemy), but why is the argument called "noresult" and not "result" ?
18:11.02radixrafael: you mean why is it "noresult=True" and not "result=False"?
18:11.11rafaelradix: yes
18:11.18radixrafael: shrug. does it really matter? :)
18:12.22rafaelnot really *g* but i got a bit confused about it
18:12.30radixrafael: it should be a pretty rare thing to use
18:14.43radixrafael: anyway, I'm glad you like it
18:15.00rafaelits very simple i think
18:16.37rafaelif i can persuade my friend of it, our new project runs with it
18:16.50rafaelhe is a fan from dejavu.. i don't know it
18:17.10radixgood luck :) we're happy to help with any questions you have
18:18.02*** part/#storm jdahlin (n=jdahlin@200-171-140-32.dsl.telesp.net.br)
18:19.09rafaelthe whole launchpad system uses it, right?
18:20.53radixrafael: launchpad doesn't yet use it in production, but it will soon.
18:21.23rafaelcool, so then it probably will get more features..
18:21.38radixrafael: well, it's already gotten many of the features.
18:21.43radixrafael: the SQLObject emulation layer, especially
18:22.02rafaelSQLObject emulation layer? whats that?
18:22.13radixstorm.sqlobject
18:22.40radixIt's a layer on top of Storm which allows you to replace SQLObject.
18:22.47radixit emulates the SQLObject API with Storm underneath.
18:25.53rafaelwhats a sql object *manager*?
18:25.54radixrafael: oh. it's one of the most popular Python ORMs.
18:26.24rafaelsomething like SQLAlchemy?
18:26.27radixyes.
18:26.35radixbut it's very simple.
18:26.51rafaelah, and with storm you can use SQLObject behind the scenes?
18:27.03radixrafael: that's probably not the right way to put it
18:27.31radixrafael: Storm allows you to use Storm behind the scenes with code that was written for SQLObject
18:27.41radixrafael: the point of it is to make it easy to port your legacy SQLObject-using code to Storm.
18:28.00radixrafael: Launchpad used to use SQLobject, but it is switching to Storm. We couldn't rewrite all of it at once, so we wrote the emulation layer.
18:29.44rafaelso its something like a sqlobject2storm formatter?
18:29.56radixsure :)
18:30.06radixit doesn't rewrite your code, it just exposes the same API as SQLObject.
18:30.37rafael?
18:31.25jkakarOh man.  It would be SO awesome if it could rewrite code.
18:31.46jkakarIt would have to generate tests and do the red/green refactoring, of course. ;)
18:31.51radixheh
18:38.13rafaelradix: what do you mean with "it doesn't rewrite your code, it just exposes the same API as SQLObject." ?
18:38.51radixrafael: Do you know what I mean by "API"?
18:39.05rafaelyep
18:39.20radixrafael: ok, so SQLObject has an API. It's made up of a class named "SQLObject" with a bunch of methods and attributes and stuff.
18:39.50radixrafael: you're meant to subclass it in your app to make objects which are bound to rows in the database, etc.
18:40.34radixrafael: Storm provides the *same* API, at a module named "storm.sqlobject", so that if you previously wrote code that uses SQLObject, you can do some minor changes to your code to make it use Storm instead of SQLObject.
18:41.32rafaelah, i understand. nice thing
18:41.37radixThis is to allow you to start incrementally using Storm without rewriting all of your code to use native Storm APIs
18:42.05radixNobody should use the storm.sqlobject module unless they're porting an application which previously used SQLobject.
18:42.12rafaelso you can use storm but rewrite it in storm later
18:42.14rafael?
18:42.32radixright. You can change bits of your app to use the native Storm APIs, one at a time.
18:42.56rafaelnice :) but there isn't so much documentation at the moment..
18:43.07radixno, unfortunately. There is the tutorial and a smattering of docstrings.
18:43.15radixWe've recently become more stringent about docstrings, so that should be improving.
18:43.51radixhopefully eventually we'll be posting an API reference to the web site based on the docstrings.
18:47.56rafaelwith epydoc?
18:48.02radixprobably pydoctor.
18:49.19rafaelReST support?
18:50.39radixhm. I think it just supports epytext and plain text right now
18:50.47radixwe've been using epytext mostly
18:51.58rafaeli think rest is nicer because its more readable if you read the source
18:56.23rafaelhow can i see what tables exist in a database? i'm executing code from the tutorial but i get "<class 'pysqlite2.dbapi2.OperationalError'>: no such table: employee"
19:05.48radixrafael: storm doesn't give you an API for that; use whatever mechanism you use to see what tables you have for your given database
19:06.03radixin postgres it's \dt
19:06.06radix(at a psql prompt)
19:08.14statikrafael: for sqlite it's sqlite3, which gives you a prompt that you can use to open your DB file
19:08.39statikI think the command is .tables or something
19:09.40rafaelbut i'm using the memory database
19:14.56statikyeah, sqlite3 can use a memory db too, but I don't know that you can connect to an in memory DB that is running in another process (where you are using storm). Sounds like the easiest thing might be to just put it in a file so you can inspect the DB and figure out what is going on
19:17.29radixyou may be able to do something like store.execute(".tables")?
19:20.22creihtradix: So will there be a storm.sqlalchemy compatibility layer?
19:21.19radixcreiht: unlikely. SQLAlchemy would be significantly harder to emulate and we don't have any need to do it, since we don't have any software which uses it
19:21.30radixbut patches are accepted :)
19:21.30creihtahh
19:23.12rafaelsorry guys, i must get off now. see you tomorrow and thank you very much for your help
19:23.22radixyou're welcome. see you later.
19:25.06creihtSo if I am a sqlalchemy user then, what would be the compelling reason to switch to storm?
19:25.56radixcreiht: Well, we found some terrible bugs in sqlalchemy, and trying to fix them was extremely problematic (the code was very spaghetti-ish)
19:26.24creihtradix: What version was that at?
19:26.26radixcreiht: just feature-wise, storm is much less complex conceptually
19:26.37radixcreiht: pre-2 and 2+
19:26.44radix(or do I mean pre-0.2 and 0.2+? I can't remember)
19:27.02radixwe specifically waited for the "big rewrite release" but still had big problems after it was released, some of them the same
19:27.11creihtSo are the bugs still in .3?
19:27.29radixI don't know. we switched before then.
19:27.37niemeyerradix: Yeah, I think it was 0.1.X and 0.2.X
19:27.41radixOk
19:27.45niemeyerOh, hello, btw
19:27.47creihtAre there ticket numbers that I could look it up?
19:28.37creihtTo see if the bugs have been addressed?
19:28.38radixnot that I have on file any more
19:28.45creihtbummer
19:29.10radixwe went through several rounds of bugfixes with sqlalchemy, actually getting patches applied
19:29.46creihtSo if I understand SQLA conceptually, what technically does storm have to offer (or will inthe future) that I can't get with SQLA?
19:29.50radixafter finding more really bad bugs, we decided it was time to stop. The nastiest I remember (never actually finding the cause) was an SQL re-ordering bug that would randomly cause objects to become corrupt
19:30.19radixcreiht: Not counting anything about bugs, the main feature is that Storm's conceptual model is very straight-forward
19:30.39radixcreiht: Storm does exactly what's necessary with transactions and object caching
19:30.49creihtSo you are saying there is less of a learning curve?
19:30.49radixwithout adding lots of extra concepts
19:31.02radixcreiht: I guess so. It's not just learning curve, it's also long-term maintenance
19:31.22radixcreiht: We continuously bashed our head against the strangeness of "Sessions" in SQLAlchemy
19:31.41creihtWhat types of strangeness?
19:31.42radixcreiht: but anyone who understands how SQL databases work really just want simple transaction management, since the database already implements it well for you.
19:31.49radixcreiht: Well, the strangeness of their existence :)
19:32.05creihtok
19:33.24creihtI'm not seeing much of a compelling argument
19:33.37radixcreiht: Well, the only reason we implemented Storm was to have something that worked.
19:33.55radixcreiht: SQLAlchemy didn't, and it was extremely hard to fix, so Storm was born.
19:34.07creihtradix: Understood
19:34.50niemeyercreiht: I've described some high-level differences here: http://permalink.gmane.org/gmane.comp.python.storm/15
19:34.50radixProbably people will start using Storm because it's easier to understand while maintaining many of the important high-level ORM features (object caching / identity management, etc) without unnecessary complexit.
19:34.59radixniemeyer: thanks :)
19:35.11creihtI'm just trying to figure out if there is a reason for me to look at storm over what I have been doing in SQLA
19:35.16niemeyercreiht: We could list specific-features as well, such as lazy expressions and whatnot..
19:35.45creihtradix: And are you aware of Elixir?
19:35.54niemeyercreiht: But to be honest, if you're using SQLAlchemy in a project and are happy with it, there's no reason to change..
19:36.14radixcreiht: nope.
19:36.17niemeyercreiht: and I consider that to be true for any software comparison
19:37.06creihtElixir is an Active Record type plugin for SQLA... You could consider it conceptually easier :)
19:37.19radixcreiht: I'm aware of it now.
19:37.27niemeyercreiht: I consider conceptually an elephant :-)
19:37.31radixcreiht: mmh, except that there's still all of SQLALchemy underneath it :)
19:37.49radixso maybe it provides a simpler API, but I'm still really wary of all that code underneath it.
19:37.56creihtI see
19:38.05niemeyercreiht: There's a considerable layer, and then yet another layer to make the API bearable..
19:38.07creihtThe code that you saw over a major revision ago
19:38.13creihtgiven that .4 is about to be released
19:38.54radixcreiht: yeah.
19:39.16creihtThanks for the input though
19:39.21radixyou're welcome.
19:39.49niemeyercreiht: Have you looked at the tutorial?
19:39.57creihtniemeyer: Yes
19:39.58radixI hope you'll try out storm for any other projects that aren't using SQLAlchemy, so we'll have another more modern comparison to make.
19:40.31niemeyercreiht: and you're used to SQLAlchemy, right?
19:40.37creihtniemeyer: Yes
19:40.42niemeyercreiht: So how does it feel?
19:40.49creihtNot in any large projects yet
19:41.05creihtMostly proof of concepts for work
19:41.11niemeyerI see
19:41.43creihtBut mapping large enough and very crazy schemas to be comfortable with it
19:41.44niemeyercreiht: and how do you think it compares, from the high-level overview of SQLAlchemy you've had, and the superficial look at the tutorial?
19:42.28creihtWell the initial "superficial" look leaves me with:
19:43.01creiht1.  I'm not real fond of having to create the tables with SQL
19:44.17creiht2.  (This is more of a personal opinion)  Using class attributes for table meta data (I think this comes from our internally written ORM from a long time ago)
19:44.51creiht3.  Setting up your classes doesn't seem to take as much code with Storm
19:45.04radixcreiht: #2 left off whether you think it's good or bad :)
19:45.09creihtbad
19:45.10creiht:)
19:45.11creihtsorry
19:45.13radixok
19:45.18creihtAnd that is more opinion than anything else
19:45.20radixcreiht: by "table metadata", you mean ...?
19:45.25radix__storm_table__ or something?
19:45.26creihttable name
19:45.29creihtyeah
19:45.32radixhow would you prefer that to be specified?
19:45.44creihtradix: Well you would not like how I like it :)
19:46.02creihtI actually like how SQLA maps the meta data
19:46.22radixI can't remember how it does. Implicitly based on the class name?
19:47.07niemeyerradix: You define the whole table with all fields, and then say mapper(...) on the class
19:47.17niemeyerradix: and it magically changes your class entirely :-)
19:47.44creihtyeah... what niemeyer said
19:47.45radixoh *right*
19:47.45radixit's all flooding back
19:50.24radixcreiht: so yeah, the fact that we do #2 is one of the reasons why #3 is true
19:50.33creihtradix: indeed
19:51.25niemeyerIt's also part of the overall design.. we don't hack the class up in any way
19:52.04niemeyerIt doesn't even require a base class or metaclass..
19:52.20creihtniemeyer: Neither does SQLA
19:52.34jkakarIt's interesting that a number of people are mentioning SQL-based table creation as a problem.  I find the opposite to be true; it's so much simpler than complicated schema-definition systems.
19:52.43radixso yeah, speaking of which
19:52.51niemeyercreiht: Well.. what does mapper() do?
19:53.00creihtWell I meant to the base class part :)
19:53.25creihtjkakar: It is more a matter of preference
19:53.36creihtWhich is fine with me
19:54.10jkakarcreiht: Agreed.  I just didn't expect it to be something people would be unhappy/uncomfortable with.
19:54.39niemeyercreiht: Indeed.. most of it is
19:54.54creihtjkakar: The reason that I don't like having to create the tables as well is that it seems like a lot of duplication fo work
19:55.05creihtI only say this from experience with our current in house ORM
19:55.16niemeyercreiht: So it's an easy choice.. that's a core design decision that won't change really
19:55.28creihtI have do define the class that is going to map to a table, and also create the SQL and hope that both match appropriately
19:55.35creihthehe
19:55.48statikniemeyer: it's probably worth adding a FAQ item pointing to the first chapter of the _Refactoring Databases_ book so people can learn about why they should use DDL scripts
19:56.40creihtBut either way, SQLA doesn't force you to generate your tables if you don't want to :)
19:56.40niemeyerstatik: Indeed
19:56.51niemeyerstatik: There's an interesting article about it as well, specifically talking about python: http://spyced.blogspot.com/2006/02/why-schema-definition-belongs-in.html
19:57.03creihtThe other problem we had is when you work on a large team, not everyone is a SQL expert :)
19:57.08niemeyercreiht: Introspection?
19:57.31creihtniemeyer: Well that wasn't what I was specifically talking about
19:57.33niemeyercreiht: In large teams in the real world, there are DBAs which are responsible for the schema
19:57.46niemeyercreiht: You're not *allowed* to use such a tool, in most organizations
19:58.00niemeyercreiht: But that doesn't make a point here, in any case..
19:58.05creihtniemeyer: That sounds nice in theory, but sometimes (unfortunately) that is not how it works in the real world
19:58.10creihtat least in my case
19:58.36niemeyercreiht: Really?  I'm interested on it from a learning perspective then
19:58.40creihtBut again... I wasn't wanting to camp on this
19:58.48creihtIt is a rather small thing in the larger picture
19:58.49radixwell, I don't see a problem in adding some optional schema generation code to Storm
19:58.59niemeyercreiht: Do you work on a large team which doesn't do schema management and instead use Python wrappers?
19:59.07creihtCurrently
19:59.14creihtWe have a medium sized team
19:59.22creihtAnd we have DBAs
19:59.30niemeyerradix: It would require adding database-specific typing
19:59.33creihtBut we have too much work for them to design all the schemas
19:59.36radixniemeyer: indeed
19:59.38niemeyerradix: SmallInt() etc
19:59.57creihtSo the DBA's review the schemas
20:00.34niemeyercreiht: In Python?
20:00.41creihtno it is all done in SQL
20:00.45creihtat the moment
20:00.50niemeyercreiht: Heh
20:01.19radixcreiht: how do you manage upgrades, btw?
20:01.28creihtsigh
20:01.49creihtSo we are going way too far down a rabbit hole
20:01.54radixer... for the record, that was honestly not a pointed question
20:02.00creihtoh I know
20:02.21creihtAnd I'm not trying to say schema generation is always the perfect solution
20:02.23radixI'm thinking about schema generation, and often that kind has certain implications on upgrading
20:02.31creihtindeed
20:02.40creihtYou still have to write SQL for upgrages
20:02.45radixdepending on what kind of upgrade system you want, anyway
20:02.56radixwell, maybe :)
20:03.10creihtanyways... In the grand scheme of things
20:03.12radixAxiom, for example, does not require you to write SQL for upgrades, but has a very high-level upgrade system
20:03.16creihtIt's a very little point
20:03.27radixalright, cool
20:03.39creihtIt just makes getting started a lot easier
20:03.42radixbut I really am curious if you have any suggestions, because you're not the first person to mention schema generation in the context of Storm
20:03.56creihtI think what I just said is the biggie
20:04.03creihtIt makes getting started much easier
20:04.15creihtEspecially for those who are not quite as SQL savvy
20:04.26creihtAnd those who want to just write a small blog app
20:05.50radixright.
20:06.03creihtAll I know from experience... Is that I dread having to create new tables in our current system because I have to both create a class that maps the table, and the table in SQL and hope that they both match correctly
20:07.52jkakarWon't your tests blow up if the schema/class definition don't match up?
20:07.55radixYeah. I haven't really found it very dreadful in my app, but I do note the duplication.
20:08.07radixmaybe I don't dread it so much because I do TDD :)
20:08.34niemeyerjkakar: Not necessarily
20:08.41niemeyerjkakar: It depends on the conflict
20:08.43creihtRight... and while we don't quite do TDD, the unit tests do find the problems
20:09.03creihtBut the pain is going back to try to find where I mispelled one of the columns or something like that
20:09.07jkakarniemeyer: Yeah, I can imagine that.
20:09.09niemeyerjkakar: If you've got e.g. a text field with length 50 and your code says 25, nothing will ever blow up
20:09.26jkakarniemeyer: Right.
20:10.02creihtIt's just a lot simpler when you know the tables you generated will match the code you created
20:10.11creihtAnd it does come with tradeoffs
20:10.20creihtBut for some people (like me) that is preferable
20:10.25niemeyercreiht: Hmm
20:10.54creihtanyways
20:10.55creiht:)
20:11.00niemeyercreiht: In projects we use Storm on the code always match the table
20:11.05niemeyercreiht: Because there's no duplication
20:11.53creihtniemeyer: Well for me it eventually does, after I figure out what SQL mistakes I had made in generating the table (or in a lot of the cases, typos)
20:12.17creihtlike I said
20:12.28creihtI didn't mean to go so far down the rabbit hole :)
20:12.43niemeyercreiht: Me neither to be honest
20:12.55niemeyercreiht: But it's good to have your feedback, thanks
20:13.52creihtniemeyer: On the other side of things... It would be interesting to hear your opinion on what the SQLA code looks like now that .3 has been out (which was another major revolution in the code) and .4 will be out soon
20:16.53creihtniemeyer: So to more important topics
20:17.24creihtHow do you control lazy loading of colums in storm?
20:17.34creihtSay you have forign keys to objects
20:17.42creihtSome you want to load on the initial load of the data
20:17.46creihtand some you don't
20:17.46niemeyercreiht: I appreciate your interest on my review, but I confess that I don't have a lot of time or motivation for it
20:17.54creihtniemeyer: Understood
20:18.29niemeyercreiht: When we reported these issues originally.. no one really paid much attention
20:18.39niemeyercreiht: (at least not when we reported them)
20:18.48creihtniemeyer: I understand your motivations
20:18.56creihtI just don't see that type of things happening todya
20:19.07creihtSo you have to understand where I am coming from as well
20:19.18niemeyercreiht: So, about lazy expressions
20:19.21creihtyes
20:19.23creiht:)
20:19.47niemeyercreiht: People said the same thing before we started Storm.. but.. anyway.. :-)
20:20.01niemeyercreiht: Lazy values are subclasses of a specific type
20:20.23niemeyercreiht: Or, the type of a lazy expression is a subclass of a given type
20:20.32creihtniemeyer: I couldn't find reference to that type of thing in the tutorial
20:20.38niemeyercreiht: and these lazy values emit an event when they need resolving
20:20.46creihtahh ok
20:20.52niemeyercreiht: The tutorial is pretty short on most topics
20:20.58creihtyeah
20:21.11niemeyercreiht: There's a lot to be said about each of these covered entries, and there's a lot missing as well
20:21.28niemeyercreiht: It was just a quick hack to not release it without any kind of documentation
20:21.33creihtSo if I define a field as lazy loaded
20:21.37creihtunderstood
20:22.08creihtIs there a way to override that (say for performance reasons) to have it pull that information in one query
20:22.20niemeyercreiht: Which information?
20:22.30niemeyercreiht: I mean, can you give me a bit more context?
20:22.32creihtSay I have a many to one relationship
20:22.37niemeyerOk
20:22.45creihtWhere an object could reference a whole lot of other objects
20:22.56creihtAnd say 90% of the time, I don't need that extra information
20:23.14creihtSo I set that field as lazy load
20:23.16niemeyercreiht: References don't use lazy evaluation
20:23.24niemeyercreiht: Ah, I see
20:23.46niemeyercreiht: So you want the foreign key *column* (e.g. the remote id), to be lazy loaded as well?
20:24.07creihthrmm... maybe I'm not explaining it right
20:24.16creihtA more concrete example:
20:24.21creiht(though a bit contrived)
20:24.44creihthrmm
20:24.49creihtSay I have an address table
20:24.50radixniemeyer: you should probably clarify what you mean by "References don't use lazy evaluation"...
20:25.08creihtradix: good point :)
20:25.27niemeyerI think I'll wait for the example.. I seem to be in another page entirely
20:25.35creihthehe
20:25.36creihtok
20:25.46radixReferences don't use the thing called "Lazy loading" in Storm, but they don't get loaded until you access the attribute explicitly
20:26.09radixcertainly, continue
20:26.11creihtThat would seem to be lazy loading :)
20:26.33niemeyercreiht: It is..
20:26.42creihtanyways
20:26.43creiht:)
20:26.47niemeyercreiht: But it's not what we call lazy expressions
20:26.52creihtok
20:26.58radixsorry that's what I meant to say
20:27.10creihtThat makes more sense
20:28.07creihtokay so this is a bit contrived
20:28.15creihtBut hopefully you will follow
20:28.38creihtSay you have an address table that store addresses of customers
20:29.00creihtactully that will be too contived :)
20:29.02creihthrmm
20:29.15creihtahhh
20:29.16creihtok
20:29.22creihtSo say you are desiging a game
20:29.29creihtand MMORPG
20:29.42niemeyerWow.. :)
20:29.43niemeyerOk
20:29.46creihthehe
20:29.50creihtI wanted to change it up a bit
20:29.53creihthave some fun :)
20:30.02creihtAnd you have an item table
20:30.18creihtthat is basically a table of all the available items
20:30.43niemeyerOk
20:31.06creihtThat table has basically a many to one relationship with the player table
20:31.16creihtwell more likely a many to many
20:31.21creihtBut this makes it simpler
20:31.23creihtanyways
20:31.42creihtso this "item" class could have a players attribute
20:31.56creihtthat would be list of all the player objects that have that item
20:32.14creihtYou would want that to be lazy loaded
20:32.30creihtSo that if you did a load of the item, by default you wouldn't want to load all of the player objects as well
20:32.40creihtfollow me so far?
20:32.44niemeyerYep!
20:32.52niemeyerThat's how it works
20:33.01creihtSo say in a certain instance
20:33.08creiht(the 10% case)
20:33.12creihtfor performance reasons
20:33.15creihtWhen you load the item
20:33.28creihtYou would like for it to pull all the player objects in as well
20:33.33niemeyerRight
20:33.38creihtSo basically running one query instead of two
20:33.43niemeyerWe use tuple loading in these cases
20:33.57creihtoh
20:34.11creihtI must have missed that sorry... which section am I looking for?
20:35.02niemeyerMan.. how lame
20:35.07niemeyerYou haven't missed it.. I did
20:35.11creihthehe
20:35.23niemeyercreiht: Wait a moment.. I'll add a section
20:35.28creihthehe
20:35.29creihtok
20:43.44niemeyercreiht: Done
20:44.03niemeyer"Many objects with one query"
20:44.28creiht"Internal Server Error"
20:44.44creihtahh now it loaded
20:45.16creihtahhh
20:45.17creihtI see
20:46.25creihthrmm
20:46.28radixprobably some leftover slashdotting effects
20:49.17creihtWell thanks for the time... I should get some work done now :)
20:50.05niemeyercreiht: My pleasure
20:50.36creihtI just wish you guys could have gotten along better... :)
20:52.09niemeyercreiht: In which sense?
20:52.35creihtWell whatever happened... It was enough for you to start you project
20:52.56creihtThere are always 2 sides to a story
20:53.03niemeyercreiht: Ah, I see.. you mean Storm and SQLAlchemy developers
20:53.06creihtAnd I'm not trying to get in the middle of it :)
20:53.07creihtyes
20:53.28niemeyercreiht: Well, we tried at least
20:53.31creihtBut in the end I hope it is good for both, as competition is always a good thing
20:53.51niemeyercreiht: Then there was a point where had to make a choice, and looking back it was the right choice
20:54.27niemeyercreiht: I said that not just because of Storm being released now, but because we moved on our real objective with less issues
20:54.32niemeyers/said/say/
20:54.47radixhah!!
20:54.48niemeyerjbot: Wow.. thanks :-)
20:54.50creihthehe
20:54.53creihtnice bot :)
20:55.15radixI want my IRC client to do that automatically, with a little colored animation... :)
20:55.35creihtradix: If you wrote your own it wouldn't be difficult :)
20:55.42niemeyerradix: xchat + xchat-python = profit!
20:55.47radixcreiht: I'm sick of writing my own software :)
20:55.48creihts/:)/;)
20:56.05creihtthe bot doesn't like me :(
20:56.19radixcreiht: maybe it requires a trailing slash
20:56.21niemeyer<PROTECTED>
20:56.21niemeyer<PROTECTED>
20:56.21niemeyer<PROTECTED>
20:56.21niemeyer<PROTECTED>
20:56.21niemeyer<PROTECTED>
20:56.23niemeyer<PROTECTED>
20:56.23niemeyer<PROTECTED>
20:56.27niemeyerThat's an xchat-python plugin..
20:56.29radixZOMG
20:56.32niemeyer(yes, I was bothered)
20:56.41creihts/:)/;)/
20:57.19radixs/ZOMG/zOh My God/
20:57.27radixcreiht: you lost last-line context that time :)
20:57.32creihtyeah I know
20:57.38creihtrealized that just after I hit enter
20:58.47niemeyerOk.. I better do something as well
21:13.58*** join/#storm dialtone (i=dialtone@conference/europython/x-e34f9d883e0245ae)
22:27.40niemeyerGood night everyone
22:28.19tjsmorning
22:29.10niemeyertjs: Morning! :-)
22:29.16niemeyerSee you in a bit :-)
22:29.20tjs:)
22:29.24tjssleep well
22:29.35niemeyerThanks!
22:34.04tjsradix: any word on that glue stuff? I'm just starting hacking up an IInitIds implementation that will bridge the gap between ZODB objects with UIDs and storm objects (which will in our app also have UIDs)
22:34.44tjsbut I can't really start using it in our app without thread local store access
22:34.58tjsI'm avoiding writing that myself atm, no point reinventing the wheel
22:43.08radixtjs: don't forget the transaction-glue, which is also part of zstorm
22:43.11radixtjs: but no, no word on it yet
22:44.05radixtjs: we have sent the request to the Boss Man, though
22:46.17tjszstorm
22:46.20tjsI love it
22:46.41tjssounds very uber-xmen
22:48.24tjsradix: lots of marvel comic related jokes in this project?
22:48.36radixnone intentionally :P
22:49.38tjs:)
22:56.19*** join/#storm brosner (n=brian@63.150.173.39)
23:05.48brosneri am creating a model called Account which has been referenced by the model Transaction.  i am wondering if i can create a method in the Account method to get the balance of the account then map it a property using property().  i just found out about storm and am playing with it.  i didn't see an information on the storm site.  not sure if this possible or just how to go about it.  seems like i would need a store object passed into the balance method somehow.
23:09.32tjsbrosner: that was not really clear
23:09.38jkakarbrosner: Is the relationship between Account and Transaction 1-to-1?
23:10.02brosneran account has many transactions
23:10.04jkakarbrosner: You can use a Reference to make, for example, Account.transaction be a "property" that yields the referenced Transaction.
23:10.16jkakarbrosner: Ah, in that case you want a ReferenceSet.
23:10.46brosnerjkakar: ah and define that in the Account model
23:10.56jkakarbrosner: Yep.
23:11.25brosnerjkakar: perfect then i can call that to iterate over the transactions belonging to that account?
23:11.44jkakarbrosner: Exactly.
23:12.30brosnergreat, and the use of property() in a model won't mess up anything since there isn't much introspection on models right?
23:12.39tjsif you just want a sum of values from all transactions related to an account, couldnt you use an expression value (see tutorial) and not wake all those objects?
23:13.19jkakarbrosner: Right.
23:13.33jkakartjs: Yeah, that's an even better way to do it.
23:13.34jkakarIn fact.
23:13.53brosnertjs: haven't looked into that yet, but i know i have two subclasses of a Transaction: Expense and Deposit
23:14.01tjsconsidering (by the sounds of it) there could be a large number of transactions
23:14.08brosnernot sure if that would effect this expression value which i have not looked into
23:14.11tjsthat would also give you the property() like api you want
23:14.28brosnerall i want with the property() is to do account.balance
23:14.29tjsI doubt you want to implement set anyway, as it makes little sense
23:14.35brosnerright
23:14.46tjsyeh so look at the storm tute
23:14.50tjsat Expression Values
23:15.05tjsin your class you would go:
23:15.23jkakarSure, you might want to run a general query instead of doing the iteration.
23:15.44tjsbalance = SQL("SELECT SUM(..
23:16.01tjsits been a while since I've done sql ;)
23:17.08jkakarYou likely want to use the Sum expression, not raw SQL.
23:17.21tjsaye
23:17.59brosneryeah i will have to look at the object since i have the Expense and Deposit subclasses to determine how it affects the balance
23:18.02jkakarsomething like 'result = store.execute(Select(Sum(Transaction.balance), Transaction.account_id == Account.id)'
23:18.13tjsjkakar: you can use the python sql expression syntax and assign that to an attribute?
23:18.14jkakarbrosner: That could be trickier. :)
23:18.59jkakartjs: I'm not sure I entirely understand the question.  store.execute() returns a ResultSet.
23:19.08jkakartjs: You could do this too:
23:19.18jkakarquery = Select(...)
23:19.23jkakarresult = store.execute(query)
23:19.28brosnerwell i need to run all thanks for your jump start.  i will be back around though.  btw is this logged anywhere on the internet?
23:19.29jkakarIs that what you're asking about?
23:19.34jkakarbrosner: Cool!
23:20.05tjsaah!
23:20.23jkakar:)
23:20.25tjsI think I misunderstand the expression values section
23:20.34jkakarAny suggestions for improving the tutorial?
23:21.02tjswell, I guess I was looking for more black magic rather than the obvious
23:21.06jkakarHehehe
23:21.15tjsbut the Expression values section to me said:
23:21.27jkakartjs: In practice, we've used store.execute() very rarely, and rarely had to use the expression building possibilities of Storm.
23:21.47jkakartjs: Most of the time we do Store.find(SomeObj, SomeObj's where clause).
23:21.47tjsassigning SQL() statements to an attribute, meant whenever you accessed that attribute, it would run the sql and return the value
23:22.22tjsyeh
23:22.32jkakartjs: Ah, I see.  I'm not actually sure how that behaves; whether it evaluates the value once (ie: runs the query once) or many times.
23:22.54jkakartjs: I'd be surprised if it was the later; I suspect it just gets the value and assigns it.
23:23.25tjsits the difference between: ruy.name = SQL("") or ruy.name = property(lambda: SQL(""))
23:23.33tjsyeh
23:23.36jkakarRight.
23:25.18tjsthe fact that its assigning it to a member is confusing, I thought there was something special being shown, perhaps the example could just be:
23:25.30tjs>>> SQL("SELECT..")
23:25.40tjsu"Ruy Ritcher"
23:25.53jkakartjs: Yeah, that might be easier.
23:29.33jkakartjs: I've just captured our conversation and mailed to niemeyer; I don't understand the expression system well enough to meaningfully update the tutorial but hopefully our conversation will give some hints to niemeyer.
23:40.41tjssure
23:43.43*** join/#storm pbugni (n=pbugni@c-67-171-37-114.hsd1.wa.comcast.net)
23:45.01*** part/#storm pbugni (n=pbugni@c-67-171-37-114.hsd1.wa.comcast.net)
23:46.35*** join/#storm b52laptop (n=b52lapto@41.249.250.195)
23:51.56tjsradix: it mentions in a few places that one of the intentions of storm was using multiple databases?
23:52.12tjsradix: does the reference mechanism support cross-store references?
23:55.15*** part/#storm b52laptop (n=b52lapto@41.249.250.195)
23:56.47radixtjs: no, it doesn't
23:59.00tjsok

Generated by irclog2html.pl Modified by Tim Riker to work with infobot.