hutch-xamplr 1.0.5 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. data/Rakefile +1 -0
  2. data/VERSION.yml +2 -2
  3. data/examples/random-people-shared-addresses/Makefile +2 -2
  4. data/examples/random-people-shared-addresses/batch-load-users.rb +2 -5
  5. data/examples/random-people-shared-addresses/find-mentions.rb +1 -4
  6. data/examples/random-people-shared-addresses/find-people-by-address.rb +1 -4
  7. data/examples/random-people-shared-addresses/optimise.rb +1 -4
  8. data/examples/random-people-shared-addresses/people.rb +0 -15
  9. data/examples/random-people-shared-addresses/query.rb +1 -4
  10. data/examples/random-people-shared-addresses/query2.rb +1 -4
  11. data/examples/random-people-shared-addresses/results.write.BASELINE +298 -0
  12. data/examples/random-people-shared-addresses/results.write.NEW_ATTR_ENCODING +294 -0
  13. data/examples/random-people-shared-addresses/settings.rb +3 -0
  14. data/examples/random-people/batch-load-users.rb +1 -4
  15. data/examples/random-people/optimise.rb +1 -4
  16. data/examples/random-people/people.rb +0 -3
  17. data/examples/random-people/query.rb +1 -5
  18. data/examples/random-people/query2.rb +1 -4
  19. data/examples/random-people/settings.rb +3 -0
  20. data/examples/random-people/what-to-query-on.rb +1 -3
  21. data/examples/read-testing/Makefile +10 -0
  22. data/examples/read-testing/load.rb +65 -0
  23. data/examples/read-testing/read.rb +51 -0
  24. data/examples/read-testing/results.read.BASELINE +6 -0
  25. data/examples/read-testing/results.read.FAST +5 -0
  26. data/examples/read-testing/rrr.rb +87 -0
  27. data/examples/read-testing/settings.rb +2 -0
  28. data/examples/read-testing/xampl-gen.rb +36 -0
  29. data/examples/read-testing/xml/text.xml +8 -0
  30. data/lib/xamplr.rb +10 -1
  31. data/lib/xamplr/exceptions.rb +97 -0
  32. data/lib/xamplr/from-xml-orig.rb +350 -0
  33. data/lib/xamplr/from-xml.rb +272 -183
  34. data/lib/xamplr/handwritten/example.rb +0 -58
  35. data/lib/xamplr/handwritten/hand-example.rb +0 -27
  36. data/lib/xamplr/handwritten/test-handwritten.rb +0 -37
  37. data/lib/xamplr/mixins.rb +10 -48
  38. data/lib/xamplr/persist-to-xml.rb +249 -0
  39. data/lib/xamplr/persistence.rb +44 -412
  40. data/lib/xamplr/persistence.rb.more_thread_safe +0 -13
  41. data/lib/xamplr/persistence.rb.partially_thread_safe +0 -13
  42. data/lib/xamplr/persister.rb +298 -0
  43. data/lib/xamplr/{persister → persisters}/caches.rb +0 -0
  44. data/lib/xamplr/{persister → persisters}/caching.rb +1 -1
  45. data/lib/xamplr/{persister → persisters}/filesystem.rb +4 -5
  46. data/lib/xamplr/{persister → persisters}/in-memory.rb +1 -1
  47. data/lib/xamplr/{persister → persisters}/simple.rb +0 -0
  48. data/lib/xamplr/{persister → persisters}/tokyo-cabinet.rb +53 -15
  49. data/lib/xamplr/simpleTemplate/{input-c.r4 → obsolete/input-c.r4} +0 -0
  50. data/lib/xamplr/simpleTemplate/{play.r6.txt → obsolete/play.r6.txt} +0 -0
  51. data/lib/xamplr/simpleTemplate/{play_more.r6.txt → obsolete/play_more.r6.txt} +0 -0
  52. data/lib/xamplr/simpleTemplate/{test001.r5 → obsolete/test001.r5} +0 -0
  53. data/lib/xamplr/simpleTemplate/{test002.r5 → obsolete/test002.r5} +0 -0
  54. data/lib/xamplr/simpleTemplate/{test003.r5 → obsolete/test003.r5} +0 -0
  55. data/lib/xamplr/templates/child_indexed.template +1 -1
  56. data/lib/xamplr/templates/element_classes.template +1 -1
  57. data/lib/xamplr/templates/element_data.template +0 -39
  58. data/lib/xamplr/templates/element_empty.template +0 -40
  59. data/lib/xamplr/templates/element_mixed.template +0 -41
  60. data/lib/xamplr/templates/element_simple.template +0 -40
  61. data/lib/xamplr/test-support/bench.rb +6 -26
  62. data/lib/xamplr/test-support/test.rb +1 -89
  63. data/lib/xamplr/visitor.rb +0 -778
  64. data/lib/xamplr/visitors.rb +573 -0
  65. data/lib/xamplr/xampl-generator.rb +1 -1
  66. data/lib/xamplr/xampl-hand-generated.rb +0 -85
  67. data/lib/xamplr/xampl-module.rb +36 -0
  68. data/lib/xamplr/xampl-object-internals.rb +6 -0
  69. data/lib/xamplr/xampl-object.rb +10 -341
  70. data/lib/xamplr/xampl-persisted-object.rb +122 -0
  71. data/lib/xamplr/xml-text.rb +117 -0
  72. metadata +53 -18
  73. data/lib/xamplr/persister/subversion.rb +0 -61
  74. data/lib/xamplr/rac.sh +0 -6
  75. data/lib/xamplr/rac_gen.sh +0 -1
  76. data/lib/xamplr/templates/child_indexed.template.000 +0 -87
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
 
3
2
  require 'sync'
4
3
 
@@ -91,9 +90,7 @@ module Xampl
91
90
 
92
91
  def Xampl.print_known_persisters
93
92
  puts "Known Persisters:: --------------------------"
94
- @@known_persisters.each { | n, k |
95
- puts " #{n} #{k}"
96
- }
93
+ @@known_persisters.each { | n, k | puts " #{n} #{k}" }
97
94
  puts "---------------------------------------------"
98
95
  end
99
96
 
@@ -104,14 +101,15 @@ module Xampl
104
101
  Xampl.print_known_persisters
105
102
  end
106
103
 
107
- def Xampl.drop_all_persisters
108
- puts "Drop All Persisters:: --------------------------"
109
- @@known_persisters.each { | n, k |
110
- puts " #{n} #{k}"
111
- }
112
- puts "---------------------------------------------"
113
- @@known_persisters.each { | persister | persister.close}
114
- @@known_persisters = {}
104
+ def Xampl.drop_all_persisters(verbose=false)
105
+ puts "Drop All Persisters:: --------------------------" if verbose
106
+ @@known_persisters.each do |name, persister|
107
+ puts " #{ name } #{ persister.class.name }" if verbose
108
+ next if persister == @@persister
109
+ persister.close
110
+ persister.clear_cache
111
+ end
112
+ puts "---------------------------------------------" if verbose
115
113
  GC.start
116
114
  GC.start
117
115
  GC.start
@@ -149,8 +147,10 @@ module Xampl
149
147
  rollback = true
150
148
  exception = nil
151
149
  original_automatic = @@persister.automatic
150
+
152
151
  begin
153
152
  #TODO -- impose some rules on nested transactions/enable_persisters??
153
+
154
154
  Xampl.auto_persistence(automatic)
155
155
  result = yield
156
156
  Xampl.block_future_changes(true)
@@ -297,7 +297,9 @@ module Xampl
297
297
  end
298
298
 
299
299
  def Xampl.introduce_to_persister(xampl)
300
- @@persister.introduce(xampl) if @@persister
300
+ raise NoActivePersister unless @@persister
301
+
302
+ @@persister.introduce(xampl)
301
303
  end
302
304
 
303
305
  def Xampl.count_changed
@@ -324,12 +326,14 @@ module Xampl
324
326
  end
325
327
 
326
328
  def Xampl.clear_cache
327
- @@persister.clear_cache if nil != @@persister
329
+ raise NoActivePersister unless @@persister
330
+ @@persister.clear_cache
328
331
  end
329
332
 
330
333
  def Xampl.sync
331
334
  #raise XamplException.new(:live_across_rollback) if @@persister.rolled_back
332
- @@persister.sync if nil != @@persister
335
+ raise NoActivePersister unless @@persister
336
+ @@persister.sync
333
337
  end
334
338
 
335
339
  def Xampl.version(stream)
@@ -337,9 +341,7 @@ module Xampl
337
341
  end
338
342
 
339
343
  def Xampl.sync_all
340
- @@known_persisters.each{ | name, persister |
341
- persister.sync
342
- }
344
+ @@known_persisters.each{ | name, persister | persister.sync }
343
345
  end
344
346
 
345
347
  def Xampl.close_all_persisters
@@ -349,52 +351,34 @@ module Xampl
349
351
  end
350
352
 
351
353
  def Xampl.rollback(persister=@@persister)
352
- raise NoActivePersister unless persister
354
+ raise NoActivePersister unless @@persister
353
355
  persister.rollback_cleanup
354
356
  end
355
357
 
356
358
  def Xampl.rollback_all
357
- @@known_persisters.values.each{ | persister |
358
- persister.rollback
359
- }
359
+ @@known_persisters.values.each { | persister | persister.rollback }
360
360
  end
361
361
 
362
362
  def Xampl.lazy_load(xampl)
363
+ raise NoActivePersister.new unless @@persister
364
+
363
365
  pid = xampl.get_the_index
364
- if xampl and pid and @@persister then
365
- @@persister.lazy_load(xampl, xampl.class, pid) if xampl and pid and @@persister
366
+ if xampl and pid then
367
+ @@persister.lazy_load(xampl, xampl.class, pid)
366
368
  xampl.load_needed = false
367
369
  else
368
- puts "XAMPL.LAZY_LOAD -- REFUSED"
370
+ raise "XAMPL.LAZY_LOAD -- REFUSED"
369
371
  end
370
372
  end
371
373
 
372
374
  def Xampl.lookup(klass, pid)
373
- @@persister.lookup(klass, pid) if nil != persister
374
- end
375
-
376
- def Xampl.lookup_lazy(klass, pid)
377
- # TODO -- Make this work
378
- puts "LOOKUP LAZY(#{klass.name}, #{pid})"
379
-
380
- xampl = Xampl.find_known(klass, pid)
381
-
382
- puts "LOOKUP LAZY(#{klass.name}, #{pid}) -- EXISTING: #{xampl}"
383
- return xampl if xampl
384
-
385
- #xampl = @@persister.lookup(klass, pid) if nil != persister
386
- if nil != persister then
387
- xampl = klass.new(pid) if nil != persister
388
- xampl.load_needed = true
389
- end
390
-
391
- puts "LOOKUP LAZY(#{klass.name}, #{pid}) -- LAZY LOADER: #{xampl}"
392
-
393
- return xampl
375
+ raise NoActivePersister unless @@persister
376
+ @@persister.lookup(klass, pid)
394
377
  end
395
378
 
396
379
  def Xampl.find_known(klass, pid)
397
- xampl, ignore = @@persister.find_known(klass, pid) if nil != persister
380
+ raise NoActivePersister unless @@persister
381
+ xampl, ignore = @@persister.find_known(klass, pid)
398
382
  return xampl
399
383
  end
400
384
 
@@ -499,387 +483,35 @@ module Xampl
499
483
  end
500
484
 
501
485
  def Xampl.optimise(opts={})
502
- @@persister.optimise(opts) if @@persister
486
+ raise NoActivePersister unless @@persister
487
+
488
+ @@persister.optimise(opts)
503
489
  end
504
490
 
505
491
  def Xampl.query(hint=false)
506
- @@persister.query(hint) { | q | yield q } if @@persister
492
+ raise NoActivePersister unless @@persister
493
+ @@persister.query(hint) { | q | yield q }
507
494
  end
508
495
 
509
496
  def Xampl.find_xampl(hint=false)
510
- @@persister.find_xampl(hint) { | q | yield q } if @@persister
497
+ raise NoActivePersister unless @@persister
498
+ @@persister.find_xampl(hint) { | q | yield q }
511
499
  end
512
500
 
513
501
  def Xampl.find_meta(hint=false)
514
- @@persister.find_meta(hint) { | q | yield q } if @@persister
502
+ raise NoActivePersister unless @@persister
503
+ @@persister.find_meta(hint) { | q | yield q }
515
504
  end
516
505
 
517
506
  def Xampl.find_pids(hint=false)
518
- @@persister.find_pids(hint) { | q | yield q } if @@persister
507
+ raise NoActivePersister unless @@persister
508
+ @@persister.find_pids(hint) { | q | yield q }
519
509
  end
520
510
 
521
511
  def Xampl.find_mentions_of(xampl)
522
- @@persister.find_mentions_of(xampl) if @@persister
523
- end
524
-
525
- class Persister
526
- attr_accessor :name,
527
- :automatic,
528
- :block_changes,
529
- :read_count, :total_read_count,
530
- :write_count, :total_write_count,
531
- :total_sync_count, :total_rollback_count,
532
- :cache_hits, :total_cache_hits,
533
- :last_write_count,
534
- :rolled_back
535
- attr_reader :syncing, :format
536
-
537
- def initialize(name=nil, format=nil)
538
- @name = name
539
- @format = format
540
- @automatic = false
541
- @changed = {}
542
- @cache_hits = 0
543
- @total_cache_hits = 0
544
- @read_count = 0
545
- @total_read_count = 0
546
- @write_count = 0
547
- @total_write_count = 0
548
- @last_write_count = 0
549
- @total_sync_count = 0
550
- @total_rollback_count = 0
551
- @rolled_back = false
552
- @syncing = false
553
-
554
- @busy_count = 0
555
- end
556
-
557
- def optimise(opts)
558
- end
559
-
560
- def close
561
- self.sync
562
- end
563
-
564
- def busy(yes)
565
- if yes then
566
- @busy_count += 1
567
- elsif 0 < @busy_count then
568
- @busy_count -= 1
569
- end
570
- end
571
-
572
- def is_busy
573
- return 0 < @busy_count
574
- end
575
-
576
- def introduce(xampl)
577
- if xampl.introduce_persister(self) then
578
- cache(xampl)
579
- end
580
- has_changed(xampl) if xampl.is_changed
581
- end
582
-
583
- def has_changed(xampl)
584
- #raise XamplException.new(:live_across_rollback) if @rolled_back
585
- # puts "!!!! has_changed #{xampl} #{xampl.get_the_index} -- persist required: #{xampl.persist_required}"
586
- if xampl.persist_required && xampl.is_changed then
587
- unless self == xampl.persister
588
- raise MixedPersisters.new(xampl.persister, self)
589
- end
590
- @changed[xampl] = xampl
591
- # puts "!!!! change recorded ==> #{@changed.size}/#{count_changed} #{@changed.object_id} !!!!"
592
- # @changed.each{ | thing, ignore |
593
- # puts " changed: #{thing}, index: #{thing.get_the_index}, changed: #{thing.is_changed}"
594
- # }
595
- end
596
- end
597
-
598
- def has_not_changed(xampl)
599
- # puts "!!!! has_not_changed #{xampl} #{xampl.get_the_index} -- in @changed: #{nil != @changed[xampl]}"
600
- @changed.delete(xampl) if xampl
601
- end
602
-
603
- def count_changed
604
- # @changed.each{ | thing, ignore |
605
- # puts "changed: #{thing}, index: #{thing.get_the_index}"
606
- # }
607
- return @changed.size
608
- end
609
-
610
- def cache(xampl)
611
- raise XamplException.new(:unimplemented)
612
- end
613
-
614
- def uncache(xampl)
615
- raise XamplException.new(:unimplemented)
616
- end
617
-
618
- def clear_cache
619
- raise XamplException.new(:unimplemented)
620
- end
621
-
622
- def Persister.replace(old_xampl, new_xampl)
623
- pid = old_xampl.get_the_index
624
- if old_xampl.persister != @@persister then
625
- raise MixedPersisters.new(@@persister, old_xampl.persister)
626
- end
627
- if new_xampl.persister != @@persister then
628
- raise MixedPersisters.new(@@persister, new_xampl.persister)
629
- end
630
-
631
- new_xampl.note_replacing(old_xampl)
632
-
633
- unless old_xampl.load_needed then
634
- Xampl.log.warn("Replacing live xampl: #{old_xampl} pid: #{pid}")
635
- @@persister.uncache(old_xampl)
636
- old_xampl.invalidate
637
- end
638
- new_xampl.pid = nil
639
- new_xampl.pid = pid
640
- @@persister.introduce(new_xampl)
641
- end
642
-
643
- def represent(xampl, mentions=[])
644
- #puts "REPRESENT #{xampl} load needed: #{xampl.load_needed}"
645
- # return nil if xampl.load_needed
646
- case xampl.default_persister_format || @format
647
- when nil, :xml_format then
648
- return xampl.persist("", mentions)
649
- when :ruby_format then
650
- return xampl.to_ruby(mentions)
651
- when :yaml_format then
652
- return xampl.as_yaml
653
- end
654
- end
655
-
656
- def realise(representation, target=nil)
657
- # Normally we'd expect to see the representation in the @format format, but
658
- # that isn't necessarily the case. Try to work out what the format might be...
659
-
660
- if representation =~ /^</ then
661
- return XamplObject.realise_from_xml_string(representation, target)
662
- elsif representation =~ /^-/ then
663
- return XamplObject.from_yaml(representation, target)
664
- else
665
- XamplObject.from_ruby(representation, target)
666
- end
667
-
668
- # case @format
669
- # when nil, :xml_format then
670
- # return XamplObject.realise_from_xml_string(representation, target)
671
- # when :ruby_format then
672
- # XamplObject.from_ruby(representation, target)
673
- # when :yaml_format then
674
- # return XamplObject.from_yaml(representation, target)
675
- # end
676
- end
677
-
678
- def version(stream)
679
- raise XamplException.new(:unimplemented)
680
- # catch(:refuse_to_version) do
681
- # end
682
- end
683
-
684
- def write(xampl)
685
- raise XamplException.new(:unimplemented)
686
- end
687
-
688
- def read(klass, pid, target=nil)
689
- raise XamplException.new(:unimplemented)
690
- end
691
-
692
- def lookup(klass, pid)
693
- #raise XamplException.new(:live_across_rollback) if @rolled_back
694
- #puts "#{File.basename(__FILE__)} #{__LINE__} LOOKUP:: klass: #{klass} pid: #{pid}"
695
-
696
- begin
697
- busy(true)
698
- xampl = read(klass, pid)
699
- ensure
700
- busy(false)
701
- end
702
-
703
- #puts "#{File.basename(__FILE__)} #{__LINE__} ---> #{ xampl }"
704
-
705
- return xampl
706
- end
707
-
708
- def find_known(klass, pid)
709
- #raise XamplException.new(:live_across_rollback) if @rolled_back
710
-
711
- xampl = read_from_cache(klass, pid, nil)
712
-
713
- return xampl
714
- end
715
-
716
- def lazy_load(target, klass, pid)
717
- # puts "#{File.basename(__FILE__)} #{__LINE__} LAZY_LOAD:: klass: #{klass} pid: #{pid} target: #{target}"
718
-
719
- xampl = read(klass, pid, target)
720
-
721
- # puts " LAZY_LOAD --> #{xampl}"
722
-
723
- return xampl
724
- end
725
-
726
- def put_changed(msg="")
727
- puts "Changed::#{msg}:"
728
- @changed.each { | xampl, ignore | puts " #{xampl.tag} #{xampl.get_the_index}" }
729
- end
730
-
731
- def do_sync_write
732
- unchanged_in_changed_list = 0
733
- @changed.each { | xampl, ignore |
734
- unchanged_in_changed_list += 1 unless xampl.is_changed
735
- unless xampl.kind_of?(InvalidXampl) then
736
- write(xampl)
737
- end
738
- }
739
- end
740
-
741
- def sync
742
- #raise XamplException.new(:live_across_rollback) if @rolled_back
743
- begin
744
- #puts "SYNC"
745
- #puts "SYNC"
746
- #puts "SYNC changed: #{@changed.size}" if 0 < @changed.size
747
- #@changed.each do | key, value |
748
- ##puts " #{key.class.name}"
749
- ##puts "key: #{key.class.name}, value: #{value.class.name}"
750
- #puts key.to_xml
751
- #end
752
- #puts "SYNC"
753
- #puts "SYNC"
754
-
755
- #if 0 < @changed.size then
756
- #puts "SYNC changed: #{@changed.size}"
757
- ##caller(0).each do | trace |
758
- ## next if /xamplr/ =~ trace
759
- ## puts " #{trace}"
760
- ## break if /actionpack/ =~ trace
761
- ##end
762
- #end
763
- busy(true)
764
- @syncing = true
765
-
766
- do_sync_write
767
-
768
- @changed = {}
769
-
770
- @total_read_count = @total_read_count + @read_count
771
- @total_write_count = @total_write_count + @write_count
772
- @total_cache_hits = @total_cache_hits + @cache_hits
773
- @total_sync_count = @total_sync_count + 1
774
-
775
- @read_count = 0
776
- @last_write_count = @write_count
777
- @write_count = 0
778
-
779
- self.sync_done()
780
-
781
- return @last_write_count
782
- ensure
783
- busy(false)
784
- @syncing = false
785
- end
786
- end
787
-
788
- def sync_done
789
- raise XamplException.new(:unimplemented)
790
- end
791
-
792
- def rollback
793
- begin
794
- busy(true)
795
-
796
- return Xampl.rollback(self)
797
- ensure
798
- busy(false)
799
- end
800
- end
801
-
802
- def rollback_cleanup
803
- @changed = {}
804
- end
805
-
806
- def print_stats
807
- printf("SYNC:: TOTAL cache_hits: %d, reads: %d, writes: %d\n",
808
- @total_cache_hits, @total_read_count, @total_write_count)
809
- printf(" cache_hits: %d, reads: %d, last writes: %d\n",
810
- @cache_hits, @read_count, @last_write_count)
811
- printf(" syncs: %d\n", @total_sync_count)
812
- printf(" changed count: %d (%d)\n", count_changed, @changed.size)
813
- @changed.each{ | thing, ignore |
814
- if thing.is_changed then
815
- puts " changed: #{thing}, index: #{thing.get_the_index}"
816
- else
817
- puts " UNCHANGED: #{thing}, index: #{thing.get_the_index} <<<<<<<<<<<<<<<<<<< BAD!"
818
- end
819
- }
820
- end
821
- end
822
-
823
- class NoActivePersister < Exception
824
- def message
825
- "No Persister is active"
826
- end
827
- end
828
-
829
- class BlockedChange < Exception
830
- attr_reader :xampl
831
-
832
- def initialize(xampl=nil)
833
- @xampl = xampl
834
- end
835
-
836
- def message
837
- "attempt to change #{@xampl}, pid: #{@xampl.get_the_index}, oid: #{@xampl.object_id} when changes are blocked"
838
- end
839
- end
840
-
841
- class UnmanagedChange < Exception
842
- attr_reader :xampl
843
-
844
- def initialize(xampl=nil)
845
- @xampl = xampl
846
- end
847
-
848
- def message
849
- "attempt to change #{@xampl}, pid: #{@xampl.get_the_index}, oid: #{@xampl.object_id} outside of its persister's management"
850
- end
851
- end
852
-
853
- class IncompatiblePersisterRequest < Exception
854
- attr_reader :msg
855
-
856
- def initialize(persister, feature_name, requested_feature_value, actual_feature_value)
857
- @msg = "persister #{persister.name}:: requested feature: #{feature_name} #{requested_feature_value}, actual: #{actual_feature_value}"
858
- end
859
-
860
- def message
861
- @msg
862
- end
512
+ raise NoActivePersister unless @@persister
513
+ @@persister.find_mentions_of(xampl)
863
514
  end
864
515
 
865
- class MixedPersisters < Exception
866
- attr_reader :msg
867
-
868
- def initialize(active, local)
869
- @msg = "mixed persisters:: active #{active.name}, local: #{local.name}"
870
- end
871
-
872
- def message
873
- @msg
874
- end
875
- end
876
-
877
- require "xamplr/persister/simple"
878
- require "xamplr/persister/in-memory"
879
- require "xamplr/persister/filesystem"
880
-
881
- if require 'tokyocabinet' then
882
- require "xamplr/persister/tokyo-cabinet"
883
- end
884
516
  end
885
517