Skip to content

Commit 085e23f

Browse files
committed
adds multiple query filter
1 parent 094a230 commit 085e23f

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed

func_sig_registry/registry/filters.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class SignatureFilter(filters.FilterSet):
1515
text_signature = filters.CharFilter(name='text_signature', lookup_type='icontains')
1616
bytes_signature = filters.MethodFilter()
1717
hex_signature = filters.MethodFilter()
18+
hex_signature__in = filters.MethodFilter()
1819

1920
class Meta:
2021
model = Signature
@@ -34,6 +35,10 @@ def filter_hex_signature(self, name, qs, value):
3435
else:
3536
return qs.filter(bytes_signature__hex_signature__icontains=unprefixed_value)
3637

38+
def filter_hex_signature__in(self, name, qs, values):
39+
unprefixed_values = [remove_0x_prefix(value.lower()) for value in values.split(',')]
40+
return qs.filter(bytes_signature__hex_signature__in=unprefixed_values)
41+
3742

3843
class EventSignatureFilter(filters.FilterSet):
3944
created_at = filters.AllLookupsFilter(name='created_at')

func_sig_registry/templates/documentation.html

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,17 @@ <h4>Filtering on <code>hex_signature</code></h4>
127127
<li>If the provided query is less than 4 bytes long then the results are filtered by substring match.</li>
128128
<li>If the provided query is longer than 4 bytes then the results are not filtered since it is an invalid query.</li>
129129
</ul>
130+
<h4>Filtering on multiple <code>hex_signatures</code></h4>
131+
<p>Match multiple queries using the <code>hex_signature__in</code> filter with multiple comma delimited <code>hex_signatures</code>.</p>
132+
<blockquote><code>/api/v1/signatures/?hex_signature__in=0xabcd1234,0xefgh6789</code></blockquote>
133+
<div class="alert alert-info" role="alert">
134+
<p>The <code>0x</code> prefix on the query value is optional.</p>
135+
</div>
136+
<p>
137+
<ul>
138+
<li>The provided queries must be exactly 4 bytes. Substring matches not allowed with multiple query search.</li>
139+
</ul>
140+
<p>
130141
<h2>Creating Signatures <code>/api/v1/signatures/</code> <span class="label label-primary">POST</span></h2>
131142
<p>Creates a new signature</p>
132143
<h3>Example Request</h3>
@@ -186,7 +197,7 @@ <h1>Event Signatures</h1>
186197
<li><code>text_signature</code> (string): The text representation of the event signature.</li>
187198
<li><code>bytes_signature</code> (string): The 32-byte event selector</li>
188199
<li><code>hex_signature</code> (string): The hex encoded 32-byte event selector.</li>
189-
</ul>
200+
</ul>
190201
<pre>{
191202
"id": 19,
192203
"created_at": "2020-09-13T18:45:58.559831Z",

tests/web/api/test_searching_signature_api_view.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,46 @@ def test_exact_without_0x_hex_search(api_client, factories):
3636
assert result['id'] == s2.id
3737

3838

39+
def test_multiple_exact_hex_search(api_client, factories):
40+
list_url = reverse('api:signature-list')
41+
s1, s2, s3, s4, s5 = factories.SignatureFactory.create_batch(5)
42+
43+
search_url = list_url + '?hex_signature__in={0},{1},{2}'.format(
44+
s2.bytes_signature.get_hex_display(),
45+
s4.bytes_signature.get_hex_display(),
46+
s5.bytes_signature.get_hex_display(),
47+
)
48+
response = api_client.get(search_url)
49+
50+
assert response.status_code == status.HTTP_200_OK
51+
data = response.data
52+
assert data['count'] == 3
53+
actual_results = sorted([item['id'] for item in data['results']])
54+
assert len(actual_results) == 3
55+
expected_results = sorted([s2.id, s4.id, s5.id])
56+
assert actual_results == expected_results
57+
58+
59+
def test_multiple_exact_without_0x_hex_search(api_client, factories):
60+
list_url = reverse('api:signature-list')
61+
s1, s2, s3, s4, s5 = factories.SignatureFactory.create_batch(5)
62+
63+
search_url = list_url + '?hex_signature__in={0},{1},{2}'.format(
64+
s1.bytes_signature.get_hex_display()[2:],
65+
s3.bytes_signature.get_hex_display()[2:],
66+
s4.bytes_signature.get_hex_display()[2:],
67+
)
68+
response = api_client.get(search_url)
69+
70+
assert response.status_code == status.HTTP_200_OK
71+
data = response.data
72+
assert data['count'] == 3
73+
actual_results = sorted([item['id'] for item in data['results']])
74+
assert len(actual_results) == 3
75+
expected_results = sorted([s1.id, s3.id, s4.id])
76+
assert actual_results == expected_results
77+
78+
3979
def test_substring_hex_search_with_0x(api_client, factories):
4080
list_url = reverse('api:signature-list')
4181
s1, s2, s3, s4, s5 = factories.SignatureFactory.create_batch(5)

0 commit comments

Comments
 (0)