diff --git a/markov/management/commands/fix_chains_with_nicks_via_bridge.py b/markov/management/commands/fix_chains_with_nicks_via_bridge.py index 453cb48..7f602b7 100644 --- a/markov/management/commands/fix_chains_with_nicks_via_bridge.py +++ b/markov/management/commands/fix_chains_with_nicks_via_bridge.py @@ -15,55 +15,63 @@ class Command(BaseCommand): for context in markov_contexts: self.stdout.write(self.style.NOTICE(f"scanning context {context}...")) # get starting states that look like they came over the bridge - start_states = context.states.filter(k1=MarkovState._start1, k2=MarkovState._start2, - v__regex=r'<.*>') - for start_state in start_states: - self.stdout.write(self.style.NOTICE(f" diving into {start_state}...")) - # find the states that build off of the start - second_states = context.states.filter(k1=start_state.k2, k2=start_state.v) + bridge_states = context.states.filter(k1=MarkovState._start1, k2=MarkovState._start2, + v__regex=r'<.*>') + self._chain_remover(context, bridge_states) - for second_state in second_states: - self.stdout.write(self.style.NOTICE(f" diving into {second_state}...")) - # find the third states - leaf_states = context.states.filter(k1=second_state.k2, k2=second_state.v) + def _chain_remover(self, context, start_states): + """Remove a given k from markov states, deleting the found states after rebuilding subsequent states. - for leaf_state in leaf_states: - self.stdout.write(self.style.NOTICE(f" upserting state based on {leaf_state}")) - # get/update state without the nick from the bridge - try: - updated_leaf = MarkovState.objects.get(k1=second_state.k1, k2=leaf_state.k2, v=leaf_state.v) - updated_leaf.count += leaf_state.count - updated_leaf.save() - self.stdout.write(self.style.SUCCESS(f" updated count for {updated_leaf}")) - except MarkovState.DoesNotExist: - new_leaf = MarkovState.objects.create(k1=second_state.k1, k2=leaf_state.k2, v=leaf_state.v, - context=context) - new_leaf.count = leaf_state.count - new_leaf.save() - self.stdout.write(self.style.SUCCESS(f" created {new_leaf}")) + As in, if trying to remove A,B -> X, then B,X -> C and X,C -> D must be rebuilt (A,B -> C / B,C -> D) + then the three states with X deleted. + """ + for start_state in start_states: + self.stdout.write(self.style.NOTICE(f" diving into {start_state}...")) + # find the states that build off of the start + second_states = context.states.filter(k1=start_state.k2, k2=start_state.v) - # remove the migrated leaf state - self.stdout.write(self.style.SUCCESS(f" deleting {leaf_state}")) - leaf_state.delete() + for second_state in second_states: + self.stdout.write(self.style.NOTICE(f" diving into {second_state}...")) + # find the third states + leaf_states = context.states.filter(k1=second_state.k2, k2=second_state.v) - # take care of the new middle state - self.stdout.write(self.style.NOTICE(f" upserting state based on {second_state}")) + for leaf_state in leaf_states: + self.stdout.write(self.style.NOTICE(f" upserting state based on {leaf_state}")) + # get/update state without the nick from the bridge try: - updated_second = MarkovState.objects.get(k1=start_state.k1, k2=start_state.k2, v=second_state.v) - updated_second.count += second_state.count - updated_second.save() - self.stdout.write(self.style.SUCCESS(f" updated count for {updated_second}")) + updated_leaf = MarkovState.objects.get(k1=second_state.k1, k2=leaf_state.k2, v=leaf_state.v) + updated_leaf.count += leaf_state.count + updated_leaf.save() + self.stdout.write(self.style.SUCCESS(f" updated count for {updated_leaf}")) except MarkovState.DoesNotExist: - new_second = MarkovState.objects.create(k1=start_state.k1, k2=start_state.k2, v=second_state.v, - context=context) - new_second.count = second_state.count - new_second.save() - self.stdout.write(self.style.SUCCESS(f" created {new_second}")) + new_leaf = MarkovState.objects.create(k1=second_state.k1, k2=leaf_state.k2, v=leaf_state.v, + context=context) + new_leaf.count = leaf_state.count + new_leaf.save() + self.stdout.write(self.style.SUCCESS(f" created {new_leaf}")) - # remove the migrated second state - self.stdout.write(self.style.SUCCESS(f" deleting {second_state}")) - second_state.delete() + # remove the migrated leaf state + self.stdout.write(self.style.SUCCESS(f" deleting {leaf_state}")) + leaf_state.delete() - # remove the dead end original start - self.stdout.write(self.style.SUCCESS(f" deleting {start_state}")) - start_state.delete() + # take care of the new middle state + self.stdout.write(self.style.NOTICE(f" upserting state based on {second_state}")) + try: + updated_second = MarkovState.objects.get(k1=start_state.k1, k2=start_state.k2, v=second_state.v) + updated_second.count += second_state.count + updated_second.save() + self.stdout.write(self.style.SUCCESS(f" updated count for {updated_second}")) + except MarkovState.DoesNotExist: + new_second = MarkovState.objects.create(k1=start_state.k1, k2=start_state.k2, v=second_state.v, + context=context) + new_second.count = second_state.count + new_second.save() + self.stdout.write(self.style.SUCCESS(f" created {new_second}")) + + # remove the migrated second state + self.stdout.write(self.style.SUCCESS(f" deleting {second_state}")) + second_state.delete() + + # remove the dead end original start + self.stdout.write(self.style.SUCCESS(f" deleting {start_state}")) + start_state.delete()