hotdog 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b2649bee0b66f057008d4276174d397b21ac87dd
4
- data.tar.gz: 29d8d1620fab0110ac684b0059fc42e095c8c7bc
3
+ metadata.gz: ffbad3cddd1c8a203564a0a72f76f4afcdeedb31
4
+ data.tar.gz: 0b2a720a116b8a7744cfe91e83145106f6841bb6
5
5
  SHA512:
6
- metadata.gz: c7024f0e5e985792bd9fe1105b8fab9c65291a7bea66c6cd22f0e33fb7c838873649ae8ee3dc3b889f51882c68c3641ad75da37ff857cc3fc5e898d100abbb07
7
- data.tar.gz: acf1ba39e5aecf2df6a9e2c7312c38ae3cea71a818d82dc681c68f6068a4cf5ab4f40f3ad8e33ccd69aac8b30f143faf0382ce52afb2264ae292a3cc39183965
6
+ metadata.gz: e460694b774e72633795116768078474b89e3ff5196b1fd6081102264bd29f496b0b1e7addf9742c8912eeb6ec9fb0e1d8592220db10d4fa25e27a94a4fb4a91
7
+ data.tar.gz: 898f4efe04b91dff88a420d257c839391162354e5d985599940199c6afa91b37a3efba0f3c99fc48208241e5fa4ec72edbd48cacfef078932b18066a66145739
@@ -11,7 +11,7 @@ module Hotdog
11
11
  else
12
12
  if args.any? { |host_name| glob?(host_name) }
13
13
  result = args.flat_map { |host_name|
14
- execute("SELECT id FROM hosts WHERE name GLOB ?;", [host_name]).to_a.reduce(:+) || []
14
+ execute("SELECT id FROM hosts WHERE LOWER(name) GLOB LOWER(?);", [host_name]).to_a.reduce(:+) || []
15
15
  }
16
16
  else
17
17
  result = args.each_slice(SQLITE_LIMIT_COMPOUND_SELECT).flat_map { |args|
@@ -549,6 +549,7 @@ module Hotdog
549
549
  @identifier = identifier
550
550
  @attribute = attribute
551
551
  @separator = separator
552
+ @fallback = nil
552
553
  end
553
554
  attr_reader :identifier
554
555
  attr_reader :attribute
@@ -610,12 +611,26 @@ module Hotdog
610
611
  if q = plan(options)
611
612
  values = environment.execute(*q).map { |row| row.first }
612
613
  if values.empty?
613
- fallback(environment, options)
614
+ if options[:did_fallback]
615
+ []
616
+ else
617
+ if not environment.fixed_string? and @fallback
618
+ # avoid optimizing @fallback to prevent infinite recursion
619
+ values = @fallback.evaluate(environment, options.merge(did_fallback: true))
620
+ if values.empty?
621
+ reload(environment, options)
622
+ else
623
+ values
624
+ end
625
+ else
626
+ reload(environment, options)
627
+ end
628
+ end
614
629
  else
615
630
  values
616
631
  end
617
632
  else
618
- return []
633
+ []
619
634
  end
620
635
  end
621
636
 
@@ -623,25 +638,26 @@ module Hotdog
623
638
  self.class == other.class and @identifier == other.identifier and @attribute == other.attribute
624
639
  end
625
640
 
626
- def fallback(environment, options={})
627
- if environment.fixed_string?
628
- []
641
+ def optimize(options={})
642
+ # fallback to glob expression
643
+ if identifier?
644
+ prefix = (identifier.start_with?("*")) ? "" : "*"
645
+ suffix = (identifier.end_with?("*")) ? "" : "*"
646
+ identifier_glob = prefix + identifier.gsub(/[-.\/_]/, "?") + suffix
629
647
  else
630
- # fallback to glob expression
631
- identifier_glob = "*#{identifier.gsub(/[-.\/_]/, "?")}*" if identifier?
632
- attribute_glob = "*#{attribute.gsub(/[-.\/_]/, "?")}*" if attribute?
633
- if (identifier? and identifier != identifier_glob) or (attribute? and attribute != attribute_glob)
634
- environment.logger.info("fallback to glob expression: %s:%s" % [identifier_glob, attribute_glob])
635
- values = TagGlobExpressionNode.new(identifier_glob, attribute_glob, separator).evaluate(environment, options)
636
- if values.empty?
637
- reload(environment, options)
638
- else
639
- values
640
- end
641
- else
642
- []
643
- end
648
+ identifier_glob = nil
649
+ end
650
+ if attribute?
651
+ prefix = (attribute.start_with?("*")) ? "" : "*"
652
+ suffix = (attribute.end_with?("*")) ? "" : "*"
653
+ attribute_glob = prefix + attribute.gsub(/[-.\/_]/, "?") + suffix
654
+ else
655
+ attribute_glob = nil
656
+ end
657
+ if (identifier? and identifier != identifier_glob) or (attribute? and attribute != attribute_glob)
658
+ @fallback = TagGlobExpressionNode.new(identifier_glob, attribute_glob, separator)
644
659
  end
660
+ self
645
661
  end
646
662
 
647
663
  def reload(environment, options={})
@@ -649,7 +665,7 @@ module Hotdog
649
665
  if 0 < ttl
650
666
  environment.logger.info("force reloading all hosts and tags.")
651
667
  environment.reload(force: true)
652
- self.class.new(identifier, attribute, separator).evaluate(environment, options.merge(ttl: ttl-1))
668
+ self.class.new(identifier, attribute, separator).optimize(options).evaluate(environment, options.merge(ttl: ttl-1))
653
669
  else
654
670
  []
655
671
  end
@@ -657,9 +673,10 @@ module Hotdog
657
673
 
658
674
  def dump(options={})
659
675
  data = {}
660
- data[:identifier] = @identifier if @identifier
661
- data[:separator] = @separator if @separator
662
- data[:attribute] = @attribute if @attribute
676
+ data[:identifier] = @identifier.to_s if @identifier
677
+ data[:separator] = @separator.to_s if @separator
678
+ data[:attribute] = @attribute.to_s if @attribute
679
+ data[:fallback ] = @fallback.dump(options) if @fallback
663
680
  data
664
681
  end
665
682
  end
@@ -671,25 +688,25 @@ module Hotdog
671
688
  case identifier
672
689
  when /\Ahost\z/i
673
690
  q = "SELECT hosts.id AS host_id FROM hosts " \
674
- "WHERE hosts.name GLOB ?;"
691
+ "WHERE LOWER(hosts.name) GLOB LOWER(?);"
675
692
  [q, [attribute]]
676
693
  else
677
694
  q = "SELECT DISTINCT hosts_tags.host_id FROM hosts_tags " \
678
695
  "INNER JOIN tags ON hosts_tags.tag_id = tags.id " \
679
- "WHERE tags.name GLOB ? AND tags.value GLOB ?;"
696
+ "WHERE LOWER(tags.name) GLOB LOWER(?) AND LOWER(tags.value) GLOB LOWER(?);"
680
697
  [q, [identifier, attribute]]
681
698
  end
682
699
  else
683
700
  if separator?
684
701
  q = "SELECT DISTINCT hosts_tags.host_id FROM hosts_tags " \
685
702
  "INNER JOIN tags ON hosts_tags.tag_id = tags.id " \
686
- "WHERE tags.name GLOB ?;"
703
+ "WHERE LOWER(tags.name) GLOB LOWER(?);"
687
704
  [q, [identifier]]
688
705
  else
689
706
  q = "SELECT DISTINCT hosts_tags.host_id FROM hosts_tags " \
690
707
  "INNER JOIN hosts ON hosts_tags.host_id = hosts.id " \
691
708
  "INNER JOIN tags ON hosts_tags.tag_id = tags.id " \
692
- "WHERE hosts.name GLOB ? OR tags.name GLOB ? OR tags.value GLOB ?;"
709
+ "WHERE LOWER(hosts.name) GLOB LOWER(?) OR LOWER(tags.name) GLOB LOWER(?) OR LOWER(tags.value) GLOB LOWER(?);"
693
710
  [q, [identifier, identifier, identifier]]
694
711
  end
695
712
  end
@@ -697,7 +714,7 @@ module Hotdog
697
714
  if attribute?
698
715
  q = "SELECT DISTINCT hosts_tags.host_id FROM hosts_tags " \
699
716
  "INNER JOIN tags ON hosts_tags.tag_id = tags.id " \
700
- "WHERE tags.value GLOB ?;"
717
+ "WHERE LOWER(tags.value) GLOB LOWER(?);"
701
718
  [q, [attribute]]
702
719
  else
703
720
  nil
@@ -707,9 +724,10 @@ module Hotdog
707
724
 
708
725
  def dump(options={})
709
726
  data = {}
710
- data[:identifier_glob] = @identifier if @identifier
711
- data[:separator] = @separator if @separator
712
- data[:attribute_glob] = @attribute if @attribute
727
+ data[:identifier_glob] = @identifier.to_s if @identifier
728
+ data[:separator] = @separator.to_s if @separator
729
+ data[:attribute_glob] = @attribute.to_s if @attribute
730
+ data[:fallback] = @fallback.dump(options) if @fallback
713
731
  data
714
732
  end
715
733
  end
@@ -761,24 +779,16 @@ module Hotdog
761
779
  end
762
780
  end
763
781
 
764
- def evaluate(environment, options={})
765
- if q = plan(options)
766
- values = environment.execute(*q).map { |row| row.first }
767
- if values.empty?
768
- reload(environment)
769
- else
770
- values
771
- end
772
- else
773
- return []
774
- end
782
+ def optimize(options={})
783
+ self # disable fallback
775
784
  end
776
785
 
777
786
  def dump(options={})
778
787
  data = {}
779
- data[:identifier_regexp] = @identifier if @identifier
780
- data[:separator] = @separator if @separator
781
- data[:attribute_regexp] = @attribute if @attribute
788
+ data[:identifier_regexp] = @identifier.to_s if @identifier
789
+ data[:separator] = @separator.to_s if @separator
790
+ data[:attribute_regexp] = @attribute.to_s if @attribute
791
+ data[:fallback] = @fallback.dump(options) if @fallback
782
792
  data
783
793
  end
784
794
  end
@@ -13,13 +13,13 @@ module Hotdog
13
13
  if tags.all? { |tag_name, tag_value| tag_value.empty? }
14
14
  result = tags.each_slice(SQLITE_LIMIT_COMPOUND_SELECT).flat_map { |tags|
15
15
  q = "SELECT value FROM tags " \
16
- "WHERE %s;" % tags.map { |tag_name, tag_value| glob?(tag_name) ? "name GLOB ?" : "name = ?" }.join(" OR ")
16
+ "WHERE %s;" % tags.map { |tag_name, tag_value| glob?(tag_name) ? "LOWER(name) GLOB LOWER(?)" : "name = ?" }.join(" OR ")
17
17
  execute(q, tags.map { |tag_name, tag_value| tag_name }).map { |value| [value] }
18
18
  }
19
19
  else
20
20
  result = tags.each_slice(SQLITE_LIMIT_COMPOUND_SELECT / 2).flat_map { |tags|
21
21
  q = "SELECT value FROM tags " \
22
- "WHERE %s;" % tags.map { |tag_name, tag_value| (glob?(tag_name) or glob?(tag_value)) ? "( name GLOB ? AND value GLOB ? )" : "( name = ? AND value = ? )" }.join(" OR ")
22
+ "WHERE %s;" % tags.map { |tag_name, tag_value| (glob?(tag_name) or glob?(tag_value)) ? "( LOWER(name) GLOB LOWER(?) AND LOWER(value) GLOB LOWER(?) )" : "( name = ? AND value = ? )" }.join(" OR ")
23
23
  execute(q, tags).map { |value| [value] }
24
24
  }
25
25
  end
@@ -1,3 +1,3 @@
1
1
  module Hotdog
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.1"
3
3
  end
@@ -13,7 +13,7 @@ describe "tag glob expression" do
13
13
  expr = Hotdog::Commands::Search::TagGlobExpressionNode.new("host", "foo*", ":")
14
14
  q = [
15
15
  "SELECT hosts.id AS host_id FROM hosts",
16
- "WHERE hosts.name GLOB ?;",
16
+ "WHERE LOWER(hosts.name) GLOB LOWER(?);",
17
17
  ]
18
18
  allow(cmd).to receive(:execute).with(q.join(" "), ["foo*"]) {
19
19
  [[1], [2], [3]]
@@ -27,7 +27,7 @@ describe "tag glob expression" do
27
27
  q = [
28
28
  "SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
29
29
  "INNER JOIN tags ON hosts_tags.tag_id = tags.id",
30
- "WHERE tags.name GLOB ? AND tags.value GLOB ?;",
30
+ "WHERE LOWER(tags.name) GLOB LOWER(?) AND LOWER(tags.value) GLOB LOWER(?);",
31
31
  ]
32
32
  allow(cmd).to receive(:execute).with(q.join(" "), ["foo*", "bar*"]) {
33
33
  [[1], [2], [3]]
@@ -41,7 +41,7 @@ describe "tag glob expression" do
41
41
  q = [
42
42
  "SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
43
43
  "INNER JOIN tags ON hosts_tags.tag_id = tags.id",
44
- "WHERE tags.name GLOB ?;",
44
+ "WHERE LOWER(tags.name) GLOB LOWER(?);",
45
45
  ]
46
46
  allow(cmd).to receive(:execute).with(q.join(" "), ["foo*"]) {
47
47
  [[1], [2], [3]]
@@ -56,7 +56,7 @@ describe "tag glob expression" do
56
56
  "SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
57
57
  "INNER JOIN hosts ON hosts_tags.host_id = hosts.id",
58
58
  "INNER JOIN tags ON hosts_tags.tag_id = tags.id",
59
- "WHERE hosts.name GLOB ? OR tags.name GLOB ? OR tags.value GLOB ?;",
59
+ "WHERE LOWER(hosts.name) GLOB LOWER(?) OR LOWER(tags.name) GLOB LOWER(?) OR LOWER(tags.value) GLOB LOWER(?);",
60
60
  ]
61
61
  allow(cmd).to receive(:execute).with(q.join(" "), ["foo*", "foo*", "foo*"]) {
62
62
  [[1], [2], [3]]
@@ -70,7 +70,7 @@ describe "tag glob expression" do
70
70
  q = [
71
71
  "SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
72
72
  "INNER JOIN tags ON hosts_tags.tag_id = tags.id",
73
- "WHERE tags.value GLOB ?;",
73
+ "WHERE LOWER(tags.value) GLOB LOWER(?);",
74
74
  ]
75
75
  allow(cmd).to receive(:execute).with(q.join(" "), ["foo*"]) {
76
76
  [[1], [2], [3]]
@@ -84,7 +84,7 @@ describe "tag glob expression" do
84
84
  q = [
85
85
  "SELECT DISTINCT hosts_tags.host_id FROM hosts_tags",
86
86
  "INNER JOIN tags ON hosts_tags.tag_id = tags.id",
87
- "WHERE tags.value GLOB ?;",
87
+ "WHERE LOWER(tags.value) GLOB LOWER(?);",
88
88
  ]
89
89
  allow(cmd).to receive(:execute).with(q.join(" "), ["foo*"]) {
90
90
  [[1], [2], [3]]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hotdog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yamashita Yuu