@@ -74,6 +74,48 @@ func TestAddAttribute(t *testing.T) {
7474	assert .Equal (t , []int32 {0 }, mapp .AttributeIndices ().AsRaw ())
7575}
7676
77+ func  TestPutAttribute (t  * testing.T ) {
78+ 	table  :=  NewAttributeTableSlice ()
79+ 	indices  :=  NewProfile ()
80+ 
81+ 	// Put a first attribute. 
82+ 	require .NoError (t , PutAttribute (table , indices , "hello" , pcommon .NewValueStr ("world" )))
83+ 	assert .Equal (t , 1 , table .Len ())
84+ 	assert .Equal (t , []int32 {0 }, indices .AttributeIndices ().AsRaw ())
85+ 
86+ 	// Put an attribute, same key, same value. 
87+ 	// This should be a no-op. 
88+ 	require .NoError (t , PutAttribute (table , indices , "hello" , pcommon .NewValueStr ("world" )))
89+ 	assert .Equal (t , 1 , table .Len ())
90+ 	assert .Equal (t , []int32 {0 }, indices .AttributeIndices ().AsRaw ())
91+ 
92+ 	// Put an attribute, same key, different value. 
93+ 	// This updates the index and adds to the table. 
94+ 	fmt .Printf ("test\n " )
95+ 	require .NoError (t , PutAttribute (table , indices , "hello" , pcommon .NewValueStr ("world2" )))
96+ 	assert .Equal (t , 2 , table .Len ())
97+ 	assert .Equal (t , []int32 {1 }, indices .AttributeIndices ().AsRaw ())
98+ 
99+ 	// Put an attribute that already exists in the table. 
100+ 	// This updates the index and does not add to the table. 
101+ 	require .NoError (t , PutAttribute (table , indices , "hello" , pcommon .NewValueStr ("world" )))
102+ 	assert .Equal (t , 2 , table .Len ())
103+ 	assert .Equal (t , []int32 {0 }, indices .AttributeIndices ().AsRaw ())
104+ 
105+ 	// Put a new attribute. 
106+ 	// This adds an index and adds to the table. 
107+ 	require .NoError (t , PutAttribute (table , indices , "good" , pcommon .NewValueStr ("day" )))
108+ 	assert .Equal (t , 3 , table .Len ())
109+ 	assert .Equal (t , []int32 {0 , 2 }, indices .AttributeIndices ().AsRaw ())
110+ 
111+ 	// Add multiple distinct attributes. 
112+ 	for  i  :=  range  100  {
113+ 		require .NoError (t , PutAttribute (table , indices , fmt .Sprintf ("key_%d" , i ), pcommon .NewValueStr ("day" )))
114+ 		assert .Equal (t , i + 4 , table .Len ())
115+ 		assert .Equal (t , i + 3 , indices .AttributeIndices ().Len ())
116+ 	}
117+ }
118+ 
77119func  BenchmarkFromAttributeIndices (b  * testing.B ) {
78120	table  :=  NewAttributeTableSlice ()
79121
@@ -162,3 +204,72 @@ func BenchmarkAddAttribute(b *testing.B) {
162204		})
163205	}
164206}
207+ 
208+ func  BenchmarkPutAttribute (b  * testing.B ) {
209+ 	for  _ , bb  :=  range  []struct  {
210+ 		name   string 
211+ 		key    string 
212+ 		value  pcommon.Value 
213+ 
214+ 		runBefore  func (* testing.B , AttributeTableSlice , attributable )
215+ 	}{
216+ 		{
217+ 			name :  "with a new string attribute" ,
218+ 			key :   "attribute" ,
219+ 			value : pcommon .NewValueStr ("test" ),
220+ 		},
221+ 		{
222+ 			name :  "with an existing attribute" ,
223+ 			key :   "attribute" ,
224+ 			value : pcommon .NewValueStr ("test" ),
225+ 
226+ 			runBefore : func (_  * testing.B , table  AttributeTableSlice , _  attributable ) {
227+ 				entry  :=  table .AppendEmpty ()
228+ 				entry .SetKey ("attribute" )
229+ 				entry .Value ().SetStr ("test" )
230+ 			},
231+ 		},
232+ 		{
233+ 			name :  "with a duplicate attribute" ,
234+ 			key :   "attribute" ,
235+ 			value : pcommon .NewValueStr ("test" ),
236+ 
237+ 			runBefore : func (_  * testing.B , table  AttributeTableSlice , obj  attributable ) {
238+ 				require .NoError (b , PutAttribute (table , obj , "attribute" , pcommon .NewValueStr ("test" )))
239+ 			},
240+ 		},
241+ 		{
242+ 			name :  "with a hundred attributes to loop through" ,
243+ 			key :   "attribute" ,
244+ 			value : pcommon .NewValueStr ("test" ),
245+ 
246+ 			runBefore : func (_  * testing.B , table  AttributeTableSlice , _  attributable ) {
247+ 				for  i  :=  range  100  {
248+ 					entry  :=  table .AppendEmpty ()
249+ 					entry .SetKey (fmt .Sprintf ("attr_%d" , i ))
250+ 					entry .Value ().SetStr ("test" )
251+ 				}
252+ 
253+ 				entry  :=  table .AppendEmpty ()
254+ 				entry .SetKey ("attribute" )
255+ 				entry .Value ().SetStr ("test" )
256+ 			},
257+ 		},
258+ 	} {
259+ 		b .Run (bb .name , func (b  * testing.B ) {
260+ 			table  :=  NewAttributeTableSlice ()
261+ 			obj  :=  NewLocation ()
262+ 
263+ 			if  bb .runBefore  !=  nil  {
264+ 				bb .runBefore (b , table , obj )
265+ 			}
266+ 
267+ 			b .ResetTimer ()
268+ 			b .ReportAllocs ()
269+ 
270+ 			for  n  :=  0 ; n  <  b .N ; n ++  {
271+ 				_  =  PutAttribute (table , obj , bb .key , bb .value )
272+ 			}
273+ 		})
274+ 	}
275+ }
0 commit comments