Spaces:
Sleeping
Sleeping
Update src/streamlit_app.py
Browse files- src/streamlit_app.py +23 -14
src/streamlit_app.py
CHANGED
|
@@ -562,7 +562,6 @@ def get_top_k_polarized_comments_for_users(user_ids, k=5):
|
|
| 562 |
local_con.close()
|
| 563 |
|
| 564 |
|
| 565 |
-
@lru_cache()
|
| 566 |
def estimate_group_voting_diversity(user_ids, topic_id):
|
| 567 |
"""
|
| 568 |
Estimates the diversity of voting within a group of users for a specific topic.
|
|
@@ -580,7 +579,10 @@ def estimate_group_voting_diversity(user_ids, topic_id):
|
|
| 580 |
Returns 0.0 if the group has less than 2 users or if no comments
|
| 581 |
were voted on by at least two users in the group.
|
| 582 |
"""
|
| 583 |
-
|
|
|
|
|
|
|
|
|
|
| 584 |
return 0.0
|
| 585 |
|
| 586 |
local_con = None
|
|
@@ -598,8 +600,8 @@ def estimate_group_voting_diversity(user_ids, topic_id):
|
|
| 598 |
JOIN comments c ON v.comment_id = c.id
|
| 599 |
WHERE c.topic_id = ? AND v.user_id IN (?)
|
| 600 |
"""
|
| 601 |
-
# DuckDB's Python API handles lists for IN clauses
|
| 602 |
-
results = local_con.execute(query, [topic_id,
|
| 603 |
|
| 604 |
if not results:
|
| 605 |
return 0.0 # No votes found for this group on this topic
|
|
@@ -635,7 +637,7 @@ def estimate_group_voting_diversity(user_ids, topic_id):
|
|
| 635 |
|
| 636 |
except Exception as e:
|
| 637 |
# st.error is not available here, just print or log
|
| 638 |
-
print(f"Error estimating group voting diversity for topic {topic_id} and users {
|
| 639 |
return 0.0 # Return 0.0 on error
|
| 640 |
finally:
|
| 641 |
if local_con:
|
|
@@ -669,8 +671,9 @@ def name_user_group(user_ids, topic_id):
|
|
| 669 |
local_con = duckdb.connect(database=DB_PATH, read_only=True)
|
| 670 |
|
| 671 |
# 1. Get total unique users who voted in the topic
|
|
|
|
| 672 |
total_voters_result = local_con.execute("""
|
| 673 |
-
SELECT COUNT(DISTINCT user_id)
|
| 674 |
FROM votes v
|
| 675 |
JOIN comments c ON v.comment_id = c.id
|
| 676 |
WHERE c.topic_id = ?
|
|
@@ -679,13 +682,17 @@ def name_user_group(user_ids, topic_id):
|
|
| 679 |
|
| 680 |
# 2. Get unique users from the input list who voted in the topic
|
| 681 |
# Filter user_ids to only those present in the votes table for this topic
|
| 682 |
-
#
|
| 683 |
-
|
| 684 |
-
|
|
|
|
|
|
|
| 685 |
FROM votes v
|
| 686 |
JOIN comments c ON v.comment_id = c.id
|
| 687 |
-
WHERE c.topic_id = ? AND v.user_id IN (
|
| 688 |
-
"""
|
|
|
|
|
|
|
| 689 |
group_voters_count = group_voters_result[0] if group_voters_result else 0
|
| 690 |
|
| 691 |
# Handle case where no one in the group has voted on this topic
|
|
@@ -747,7 +754,7 @@ def name_user_group(user_ids, topic_id):
|
|
| 747 |
return "Whispering Gallery", "A small group where many different ideas are quietly shared."
|
| 748 |
|
| 749 |
except Exception as e:
|
| 750 |
-
|
| 751 |
return "Mysterious Gathering", "An error occurred while trying to name this group." # Default name and description on error
|
| 752 |
finally:
|
| 753 |
if local_con:
|
|
@@ -1082,6 +1089,7 @@ def view_topic_page():
|
|
| 1082 |
if current_comment_id: # Only show voting if there's a comment to vote on
|
| 1083 |
# Display comment history and the current comment with the random intro
|
| 1084 |
if st.session_state.get('_show_new_area_message', True):
|
|
|
|
| 1085 |
_, user_ids = get_user_cluster_label(user_id, get_ttl_hash(10))
|
| 1086 |
new_area_name, desc = name_user_group(user_ids, topic_id)
|
| 1087 |
for statm in [
|
|
@@ -1089,7 +1097,6 @@ def view_topic_page():
|
|
| 1089 |
f"🗺️ And yet, your journey leads you to a new place: **{new_area_name}**! {desc}"]:
|
| 1090 |
st.markdown(statm)
|
| 1091 |
st.session_state.comment_history += f"\n\n{statm}"
|
| 1092 |
-
st.session_state._show_new_area_message = False
|
| 1093 |
st.markdown(f"[Collected new insight, {random_phrase}]:\n* {current_comment_content}")
|
| 1094 |
|
| 1095 |
# Handle vote logic
|
|
@@ -1291,7 +1298,9 @@ if 'processed_url_params' not in st.session_state:
|
|
| 1291 |
|
| 1292 |
# Initialize the database on first run
|
| 1293 |
initialize_database()
|
| 1294 |
-
|
|
|
|
|
|
|
| 1295 |
|
| 1296 |
# Handle initial load from URL query parameters
|
| 1297 |
# Process only once per session load using the flag
|
|
|
|
| 562 |
local_con.close()
|
| 563 |
|
| 564 |
|
|
|
|
| 565 |
def estimate_group_voting_diversity(user_ids, topic_id):
|
| 566 |
"""
|
| 567 |
Estimates the diversity of voting within a group of users for a specific topic.
|
|
|
|
| 579 |
Returns 0.0 if the group has less than 2 users or if no comments
|
| 580 |
were voted on by at least two users in the group.
|
| 581 |
"""
|
| 582 |
+
# Convert list to tuple for caching purposes (tuples are hashable)
|
| 583 |
+
user_ids_tuple = tuple(user_ids)
|
| 584 |
+
|
| 585 |
+
if not user_ids_tuple or len(user_ids_tuple) < 2:
|
| 586 |
return 0.0
|
| 587 |
|
| 588 |
local_con = None
|
|
|
|
| 600 |
JOIN comments c ON v.comment_id = c.id
|
| 601 |
WHERE c.topic_id = ? AND v.user_id IN (?)
|
| 602 |
"""
|
| 603 |
+
# DuckDB's Python API handles lists/tuples for IN clauses
|
| 604 |
+
results = local_con.execute(query, [topic_id, user_ids_tuple]).fetchall()
|
| 605 |
|
| 606 |
if not results:
|
| 607 |
return 0.0 # No votes found for this group on this topic
|
|
|
|
| 637 |
|
| 638 |
except Exception as e:
|
| 639 |
# st.error is not available here, just print or log
|
| 640 |
+
print(f"Error estimating group voting diversity for topic {topic_id} and users {user_ids_tuple}: {e}")
|
| 641 |
return 0.0 # Return 0.0 on error
|
| 642 |
finally:
|
| 643 |
if local_con:
|
|
|
|
| 671 |
local_con = duckdb.connect(database=DB_PATH, read_only=True)
|
| 672 |
|
| 673 |
# 1. Get total unique users who voted in the topic
|
| 674 |
+
# Specify v.user_id to avoid ambiguity
|
| 675 |
total_voters_result = local_con.execute("""
|
| 676 |
+
SELECT COUNT(DISTINCT v.user_id)
|
| 677 |
FROM votes v
|
| 678 |
JOIN comments c ON v.comment_id = c.id
|
| 679 |
WHERE c.topic_id = ?
|
|
|
|
| 682 |
|
| 683 |
# 2. Get unique users from the input list who voted in the topic
|
| 684 |
# Filter user_ids to only those present in the votes table for this topic
|
| 685 |
+
# Construct the IN clause dynamically to avoid casting issues
|
| 686 |
+
# This part correctly uses the list by expanding placeholders
|
| 687 |
+
placeholders = ', '.join(['?'] * len(user_ids))
|
| 688 |
+
group_voters_query = f"""
|
| 689 |
+
SELECT COUNT(DISTINCT v.user_id)
|
| 690 |
FROM votes v
|
| 691 |
JOIN comments c ON v.comment_id = c.id
|
| 692 |
+
WHERE c.topic_id = ? AND v.user_id IN ({placeholders})
|
| 693 |
+
"""
|
| 694 |
+
# Pass topic_id and then all user_ids as separate parameters
|
| 695 |
+
group_voters_result = local_con.execute(group_voters_query, [topic_id] + user_ids).fetchone()
|
| 696 |
group_voters_count = group_voters_result[0] if group_voters_result else 0
|
| 697 |
|
| 698 |
# Handle case where no one in the group has voted on this topic
|
|
|
|
| 754 |
return "Whispering Gallery", "A small group where many different ideas are quietly shared."
|
| 755 |
|
| 756 |
except Exception as e:
|
| 757 |
+
st.error(f"Error naming user group for topic {topic_id} and users {user_ids}: {e}")
|
| 758 |
return "Mysterious Gathering", "An error occurred while trying to name this group." # Default name and description on error
|
| 759 |
finally:
|
| 760 |
if local_con:
|
|
|
|
| 1089 |
if current_comment_id: # Only show voting if there's a comment to vote on
|
| 1090 |
# Display comment history and the current comment with the random intro
|
| 1091 |
if st.session_state.get('_show_new_area_message', True):
|
| 1092 |
+
st.session_state._show_new_area_message = False
|
| 1093 |
_, user_ids = get_user_cluster_label(user_id, get_ttl_hash(10))
|
| 1094 |
new_area_name, desc = name_user_group(user_ids, topic_id)
|
| 1095 |
for statm in [
|
|
|
|
| 1097 |
f"🗺️ And yet, your journey leads you to a new place: **{new_area_name}**! {desc}"]:
|
| 1098 |
st.markdown(statm)
|
| 1099 |
st.session_state.comment_history += f"\n\n{statm}"
|
|
|
|
| 1100 |
st.markdown(f"[Collected new insight, {random_phrase}]:\n* {current_comment_content}")
|
| 1101 |
|
| 1102 |
# Handle vote logic
|
|
|
|
| 1298 |
|
| 1299 |
# Initialize the database on first run
|
| 1300 |
initialize_database()
|
| 1301 |
+
if st.session_state.get('_add_dummy', True):
|
| 1302 |
+
add_dummy_topic()
|
| 1303 |
+
st.session_state._add_dummy = False
|
| 1304 |
|
| 1305 |
# Handle initial load from URL query parameters
|
| 1306 |
# Process only once per session load using the flag
|