Skip to content

Commit 6905597

Browse files
committed
Enable testdata generater to have nested referrals
1 parent dc55668 commit 6905597

File tree

1 file changed

+83
-20
lines changed

1 file changed

+83
-20
lines changed

tools/generate_testdata.py

+83-20
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@
4242
if type not in [AttrType._NAMED, AttrType._ARRAY]
4343
}
4444

45+
# Constants for reference hierarchy
46+
REFERENCE_DEPTH = 3
47+
ENTRIES_PER_LEVEL = 2
48+
49+
50+
class ReferenceLevel:
51+
def __init__(self, entity: Entity, entries: list[Entry]):
52+
self.entity = entity
53+
self.entries = entries
54+
4555

4656
def _random_string(length=10) -> str:
4757
letters = string.ascii_letters
@@ -126,31 +136,76 @@ def _generate_entry(
126136
)
127137

128138

139+
def generate_reference_hierarchy(user: User, suffix: str) -> list[ReferenceLevel]:
140+
levels: list[ReferenceLevel] = []
141+
142+
# First, create entities and entries for all levels
143+
for level in range(1, REFERENCE_DEPTH + 1):
144+
entity = Entity.objects.create(
145+
name=f"Referred_Entity_L{level}_{suffix}",
146+
is_active=True,
147+
created_user=user,
148+
)
149+
150+
# Add string attribute to the entity
151+
string_attr = EntityAttr.objects.create(
152+
parent_entity=entity,
153+
name="Attr_string",
154+
type=AttrType.STRING,
155+
is_active=True,
156+
created_user=user,
157+
)
158+
159+
entries = [
160+
Entry.objects.create(
161+
schema=entity,
162+
name=f"Referred_Entry_L{level}_{suffix}_{i}",
163+
is_active=True,
164+
created_user=user,
165+
)
166+
for i in range(ENTRIES_PER_LEVEL)
167+
]
168+
169+
# Set string attribute value for each entry
170+
for entry in entries:
171+
string_entry_attr = entry.add_attribute_from_base(string_attr, user)
172+
string_entry_attr.add_value(user, f"string_value_{_random_string()}")
173+
174+
levels.append(ReferenceLevel(entity, entries))
175+
176+
# Set up reference relationships from upper to lower levels (L1->L2->L3->...)
177+
# The lowest level has no reference
178+
for level in range(REFERENCE_DEPTH - 1):
179+
current_level = levels[level]
180+
next_level = levels[level + 1]
181+
182+
# Add reference attribute to the current level's entity
183+
attr = EntityAttr.objects.create(
184+
parent_entity=current_level.entity,
185+
name=f"ref_L{level + 2}",
186+
type=AttrType.OBJECT,
187+
is_active=True,
188+
created_user=user,
189+
)
190+
attr.referral.add(next_level.entity)
191+
192+
# Set random reference to next level's entry for each current level entry
193+
for entry in current_level.entries:
194+
entry_attr = entry.add_attribute_from_base(attr, user)
195+
entry_attr.add_value(user, random.choice(next_level.entries))
196+
197+
return levels
198+
199+
129200
def generate_testdata(num_entities: int, num_entries: int, suffix: str):
130201
user = User.objects.first()
131202
if not user:
132203
user = User.objects.create(username="testuser", email="testuser@example.com")
133204
user.set_password("password")
134205
user.save()
135206

136-
ref_entity = Entity.objects.create(
137-
name=f"Referred_Entity_{suffix}", is_active=True, created_user=user
138-
)
139-
ref_entries = [
140-
Entry.objects.create(
141-
schema=ref_entity,
142-
name=f"Referred_Entry_{suffix}_{i}",
143-
is_active=True,
144-
created_user=user,
145-
)
146-
for i in range(2)
147-
]
148-
ref_groups = [
149-
Group.objects.create(name=f"Referred_Group_{suffix}_{i}", is_active=True) for i in range(2)
150-
]
151-
ref_roles = [
152-
Role.objects.create(name=f"Referred_Role_{suffix}_{i}", is_active=True) for i in range(2)
153-
]
207+
# Generate reference hierarchy instead of single reference entity
208+
reference_levels = generate_reference_hierarchy(user, suffix)
154209

155210
entities: list[Entity] = []
156211
for i in range(num_entities):
@@ -173,7 +228,15 @@ def generate_testdata(num_entities: int, num_entries: int, suffix: str):
173228
AttrType.NAMED_OBJECT,
174229
AttrType.ARRAY_NAMED_OBJECT,
175230
]:
176-
entity_attr.referral.add(ref_entity)
231+
# Reference L1 entity for root entities
232+
entity_attr.referral.add(reference_levels[0].entity)
233+
234+
ref_groups = [
235+
Group.objects.create(name=f"Referred_Group_{suffix}_{i}", is_active=True) for i in range(2)
236+
]
237+
ref_roles = [
238+
Role.objects.create(name=f"Referred_Role_{suffix}_{i}", is_active=True) for i in range(2)
239+
]
177240

178241
with ThreadPoolExecutor() as executor:
179242
futures: list[Future] = []
@@ -185,7 +248,7 @@ def generate_testdata(num_entities: int, num_entries: int, suffix: str):
185248
entity,
186249
user,
187250
f"{i}_{j}_{suffix}",
188-
ref_entries,
251+
reference_levels[0].entries, # Use L1 entries as referrals
189252
ref_groups,
190253
ref_roles,
191254
)

0 commit comments

Comments
 (0)