Guest User

Untitled

a guest
Jul 15th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.08 KB | None | 0 0
  1. require 'spec_helper'
  2. require 'benchmark'
  3.  
  4. describe 'performance tracking for accessing sitewide information' do
  5. include Mongo
  6. describe 'sitewide privacy settings maintained in an user info attribute collection' do
  7.  
  8. before(:all) do
  9. db = Connection.new.db('user-acl-specs')
  10. @users = db.collection('users')
  11. @count_of_test_users = 10000
  12. @created_users = @users.find().next_document
  13. @users.create_index([["attributes.visible_sitewide", Mongo::ASCENDING], ["attributes.field_value", Mongo::ASCENDING]])
  14. # puts @users.find({"$or" => [
  15. # {"attributes" => {"$elemMatch" => {"field_value" => "nick1", "visible_sitewide" => true}}},
  16. # {"nickname" => "nick1"}
  17. # ]}).explain()
  18.  
  19. # build_test_users(db)
  20. end
  21.  
  22. # it "do nothing" do
  23. # end
  24.  
  25.  
  26. it "search where user info and acl are stored in a collection in the user model" do
  27. @nicknames = ["nick1", "nick2", "nick3", "nick4", "nick5", "nick6", "nick7", "nick8", "nick9", "nick10"]
  28.  
  29. Benchmark.bmbm do |label|
  30. label.report('finding a user where the search term is the exact email') do
  31. (1..10).each do
  32. @nicknames.each do |a_nickname|
  33. search_string = "#{a_nickname}@email.com"
  34. # search_string = #{@available_attributes[index][:nickname]}@email.com
  35. @users.find('attributes' => {'$elemMatch' => {'field_name' => 'email', 'field_value' => "#{search_string}", 'visible_sitewide' => true}}).next_document
  36. end
  37. end
  38. end
  39.  
  40. label.report('finding a user where the search term is partial email') do
  41.  
  42. (1..10).each do
  43. @nicknames.each do |a_nickname|
  44. @users.find('attributes' => {'$elemMatch' => {'field_name' => 'email', 'field_value' => /#{a_nickname}/i, 'visible_sitewide' => true}}).next_document
  45. end
  46. end
  47. end
  48.  
  49. label.report('using a search term that searches across email, first name, last name & nickname visible sitewide') do
  50. (1..10).each do
  51. @nicknames.each do |a_nickname|
  52. @users.find({"$or" => [
  53. {"attributes" => {"$elemMatch" => {"field_name" => "email", "field_value" => /#{a_nickname}/i, "visible_sitewide" => true}}},
  54. {"attributes" => {"$elemMatch" => {"field_name" => "first_name", "field_value" => /#{a_nickname}/i, "visible_sitewide" => true}}},
  55. {"attributes" => {"$elemMatch" => {"field_name" => "last_name", "field_value" => /#{a_nickname}/i, "visible_sitewide" => true}}},
  56. {"nickname" => /#{a_nickname}/i}
  57. ]}).next_document
  58. end
  59. end
  60. end
  61.  
  62. label.report('using a search term that searches all fields visible sitewide') do
  63. 10.times do
  64. @nicknames.each do |a_nickname|
  65. @users.find({"$or" => [
  66. {"attributes" => {"$elemMatch" => {"field_value" => a_nickname, "visible_sitewide" => true}}},
  67. {"nickname" => a_nickname}, {'attributes.connections_visible_to' =>- 0}
  68. ]}).next_document
  69. end
  70. end
  71. end
  72.  
  73. label.report('using a search term that searches across email, first name, last name & nickname visible sitewide and user specific access') do
  74. # (1..10).each do
  75. @nicknames.each do |a_nickname|
  76. @users.find({"$or" => [
  77. {"attributes" => {"$elemMatch" => {"field_name" => "email", "field_value" => /#{a_nickname}/i, "visible_sitewide" => true}}},
  78. {"attributes" => {"$elemMatch" => {"field_name" => "first_name", "field_value" => /#{a_nickname}/i, "visible_sitewide" => true}}},
  79. {"attributes" => {"$elemMatch" => {"field_name" => "last_name", "field_value" => /#{a_nickname}/i, "visible_sitewide" => true}}},
  80. {"attributes" => {"$elemMatch" => {"field_name" => "email", "field_value" => /#{a_nickname}/i, "connections_visible_to" => {"$in" => [random_user_id]}}}},
  81. {"attributes" => {"$elemMatch" => {"field_name" => "first_name", "field_value" => /#{a_nickname}/i, "connections_visible_to" => {"$in" => [random_user_id]}}}},
  82. {"attributes" => {"$elemMatch" => {"field_name" => "last_name", "field_value" => /#{a_nickname}/i, "connections_visible_to" => {"$in" => [random_user_id]}}}},
  83. {"nickname" => /#{a_nickname}/i}
  84. ]}).next_document
  85. end
  86. # end
  87. end
  88.  
  89. label.report('using a search term that searches across all fields visible sitewide and user specific access') do
  90. (1..10).each do
  91. @nicknames.each do |a_nickname|
  92. @users.find({"$or" => [
  93. {"attributes" => {"$elemMatch" => {"field_value" => /#{a_nickname}/i, "connections_visible_to" => {"$in" => [random_user_id]}}}},
  94. {"nickname" => /#{a_nickname}/i}
  95. ]}).next_document
  96. end
  97. end
  98. end
  99.  
  100. label.report('load a user with all its field') do
  101. (1..5).each do |index|
  102. @users.find_one(:nickname => "nick#{index}")
  103. end
  104. end
  105.  
  106. end
  107. end
  108.  
  109. # after(:all) do
  110. # @users.drop
  111. # end
  112.  
  113. end
  114.  
  115. def build_test_users(db)
  116. @users.drop
  117. @users.create_index([["attributes.field_name", Mongo::ASCENDING]])
  118. @users.create_index([["attributes.visible_sitewide", Mongo::ASCENDING], []])
  119. @users.create_index([["attributes.connections_visible_to", Mongo::ASCENDING]])
  120. @connection_groups = db.collection('connection_groups')
  121. @connection_groups.drop
  122. @count_of_test_users = 10000
  123.  
  124. @available_attributes = []
  125. (1..@count_of_test_users).each do |i|
  126. attributes_for_user = {
  127. :nickname => "nick#{i}"
  128. }
  129.  
  130. @users.save attributes_for_user
  131.  
  132. @available_attributes << attributes_for_user
  133. end
  134.  
  135. @created_users = []
  136. @users.find().each do |row|
  137. @created_users << row
  138. end
  139. update_fields_for_all_users
  140. end
  141.  
  142. def update_fields_for_all_users
  143. @created_users.each do |a_user|
  144. # This approach has the connection groups in a separate collection which will be used to identify which fields a member gets access to when he/she is added to an existing connection group.
  145. connections = create_connections(a_user)
  146.  
  147. @users.update({:nickname => a_user['nickname']},
  148. {"$set" => {:attributes =>[
  149. {:field_name => "first_name", :field_value => a_user['nickname'], :visible_sitewide => random_boolean_value, :connections_visible_to => random_user_ids(50)},
  150. {:field_name => "middle_initial", :field_value => middle_initial, :visible_sitewide => random_boolean_value, :connections_visible_to => random_user_ids(50)},
  151. {:field_name => "last_name", :field_value => last_name, :visible_sitewide => random_boolean_value, :connections_visible_to => random_user_ids(50)},
  152. {:field_name => "dob_day", :field_value => dob_day, :visible_sitewide => random_boolean_value, :connections_visible_to => random_user_ids(50)},
  153. {:field_name => "dob_month", :field_value => dob_month, :visible_sitewide => random_boolean_value, :connections_visible_to => random_user_ids(50)},
  154. {:field_name => "dob_year", :field_value => dob_year, :visible_sitewide => random_boolean_value, :connections_visible_to => random_user_ids(50)},
  155. {:field_name => "gender", :field_value => gender, :visible_sitewide => random_boolean_value, :connections_visible_to => random_user_ids(50)},
  156. {:field_name => "email", :field_value => email_value(a_user['nickname']), :visible_sitewide => true, :connections_visible_to => random_user_ids(50)}
  157. ]}}
  158. )
  159. end
  160. end
  161.  
  162. def create_connections(a_user)
  163. user_connections = []
  164. user_connections << create_connection_group(a_user['_id'], "Doctors", 10)
  165. user_connections << create_connection_group(a_user['_id'], "Family", 20)
  166. user_connections << create_connection_group(a_user['_id'], "Friends", 30)
  167. end
  168.  
  169. def create_connection_group(group_owner_id, group_name, group_member_count=1)
  170. {
  171. :group_owner_id => group_owner_id,
  172. :group_name => group_name,
  173. :group_members => random_user_ids(group_member_count),
  174. :visible_fields => ["first_name", "last_name", "email"]
  175. }
  176. end
  177.  
  178. def random_user_ids(count)
  179. (1..count).collect do
  180. @created_users.rand['_id']
  181. end
  182. end
  183.  
  184. def dob_day
  185. Random.new.rand(1..31)
  186. end
  187.  
  188. def dob_month
  189. Random.new.rand(1..12)
  190. end
  191.  
  192. def dob_year
  193. Random.new.rand(1950..2000)
  194. end
  195.  
  196. def zip_code
  197. Random.new.rand(10000..90000)
  198. end
  199.  
  200. def last_name
  201. random_string(Random.new.rand(1..25))
  202. end
  203.  
  204. def middle_initial
  205. random_string(1)
  206. end
  207.  
  208. def email_value(nickname)
  209. "#{nickname}@email.com"
  210. end
  211.  
  212. def gender
  213. random_boolean_value ? 'female' : 'male'
  214. end
  215.  
  216. def random_boolean_value
  217. Random.new.rand(1..2) == 1 ? true : false
  218. end
  219.  
  220. def random_string(length=20)
  221. (0...length).map { ('a'..'z').to_a[rand(26)] }.join
  222. end
  223.  
  224. def random_user_id
  225. @users.find_one(:nickname => "nick#{random_user_offset}")['_id']
  226. end
  227.  
  228. def random_user_offset
  229. Random.new.rand(1..@count_of_test_users)
  230. end
  231. end
Add Comment
Please, Sign In to add comment