Skip to content

updated dictionary index call#483

Merged
AthulyaMS merged 1 commit into
devfrom
dictindex
May 11, 2026
Merged

updated dictionary index call#483
AthulyaMS merged 1 commit into
devfrom
dictindex

Conversation

@tejaswini143
Copy link
Copy Markdown

@tejaswini143 tejaswini143 commented May 11, 2026

User description


CodeAnt-AI Description

Show dictionary index entries for each word form instead of only the main keyword

What Changed

  • Dictionary index now lists every word form stored for a word, not just a single keyword.
  • Words are split into separate entries, sorted alphabetically, and grouped by the first letter of each form.
  • Empty word-form values are skipped, so the index no longer shows blank entries.

Impact

✅ More complete dictionary index
✅ Easier lookup for alternate word forms
✅ Fewer missing or blank index entries

🔄 Retrigger CodeAnt AI Review

Details

💡 Usage Guide

Checking Your Pull Request

Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.

Talking to CodeAnt AI

Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

Preserve Org Learnings with CodeAnt

You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

Check Your Repository Health

To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.

@codeant-ai
Copy link
Copy Markdown

codeant-ai Bot commented May 11, 2026

CodeAnt AI is reviewing your PR.


Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@vercel
Copy link
Copy Markdown

vercel Bot commented May 11, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
vachan-admin-v2 Ready Ready Preview, Comment May 11, 2026 10:21am

Request Review

@codeant-ai codeant-ai Bot added the size:M This PR changes 30-99 lines, ignoring generated files label May 11, 2026
Comment on lines +297 to +301
words = (
db_.query(db_models.Dictionary.word_id, db_models.Dictionary.word_forms)
.filter(db_models.Dictionary.resource_id == resource_id)
.all()
)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: The index is now built from word_forms instead of the dictionary keyword, which changes the API behavior from what the endpoint contract currently describes (indexing by keyword). This can break existing clients that expect one index entry per dictionary word/keyword. Build index terms from keyword (or update all consumers/contracts together if this is an intentional breaking change). [api mismatch]

Severity Level: Critical 🚨
- ❌ Dictionary index endpoint returns forms instead of keywords.
- ⚠️ Clients expecting keyword-based index receive incompatible responses.
Steps of Reproduction ✅
1. Create a dictionary word using the existing POST endpoint `POST /dictionary`
implemented in `backend/app/router/content.py:39-68`, with a payload matching
`schema.DictionaryCreate` (`backend/app/schema.py:60-82`), for example `keyword: "love"`
and `wordForms: "loves, loved, loving"`. This is stored via `upload_dictionary_words()`
(`backend/app/crud/content_crud.py:31-107`) into `db_models.Dictionary.keyword` and
`db_models.Dictionary.word_forms`.

2. Observe the documented contract for the index endpoint in
`backend/app/router/content.py:144-153`, where `get_dictionary_index()` is documented as
"Fetches index of a dictionary grouped by first letter. Returns wordId and keyword
organized by starting letter."

3. Call the index endpoint `GET /dictionary/{resource_id}/index` (same file
`content.py:144-168`), which delegates to `content_crud.get_dictionary_index()` in
`backend/app/crud/content_crud.py:278-333`.

4. In `get_dictionary_index()`, lines `296-301` build `words` from
`db_models.Dictionary.word_id` and `db_models.Dictionary.word_forms` (not `keyword`), and
lines `303-325` set the response field `'word'` to each word form. The returned JSON index
therefore contains inflected `wordForms` values instead of the `keyword` the router
docstring and existing schema examples describe, changing the API behavior for all callers
of `/dictionary/{resource_id}/index`.

Fix in Cursor | Fix in VSCode Claude

(Use Cmd/Ctrl + Click for best experience)

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** backend/app/crud/content_crud.py
**Line:** 297:301
**Comment:**
	*Api Mismatch: The index is now built from `word_forms` instead of the dictionary `keyword`, which changes the API behavior from what the endpoint contract currently describes (indexing by keyword). This can break existing clients that expect one index entry per dictionary word/keyword. Build index terms from `keyword` (or update all consumers/contracts together if this is an intentional breaking change).

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎

Comment on lines 305 to +307
for word in words:
if word.keyword:
first_letter = word.keyword[0].upper()
if first_letter not in index_dict:
index_dict[first_letter] = []
index_dict[first_letter].append({
'wordId': word.word_id,
'word': word.keyword
})
if not word.word_forms:
continue
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Entries are skipped entirely when word_forms is empty, so valid dictionary records can disappear from the index even though they still exist and are retrievable by ID. Add a fallback term (for example the keyword) or enforce non-empty word_forms before indexing so words are not silently omitted. [logic error]

Severity Level: Major ⚠️
- ❌ Some dictionary words missing from index browse endpoint results.
- ⚠️ Users can't discover words with empty wordForms via index.
Steps of Reproduction ✅
1. Create a dictionary entry via `POST /dictionary`
(`backend/app/router/content.py:39-68`) using schema `DictionaryCreate`
(`backend/app/schema.py:60-82`), providing a non-empty `keyword` and `definition` but
leaving `wordForms` empty or as an empty string (allowed by `DictionaryWordCreate` at
`schema.py:16-27`, which does not validate `wordForms`).

2. The create handler calls `upload_dictionary_words()` in
`backend/app/crud/content_crud.py:31-107`, which persists the row with `row.word_forms =
item.wordForms` at line `78`; when `wordForms` is empty, `row.word_forms` becomes an empty
string in `db_models.Dictionary.word_forms`.

3. Verify the word exists via `GET /dictionary/{resource_id}/word/{word_id}`
(`backend/app/router/content.py:171-210`), which reads from `db_models.Dictionary` in
`get_dictionary_word_by_id()` (`backend/app/crud/content_crud.py:338-364`) and returns the
word successfully, confirming the record is valid and retrievable by ID.

4. Call the index endpoint `GET /dictionary/{resource_id}/index`
(`backend/app/router/content.py:144-168`), which invokes `get_dictionary_index()` in
`backend/app/crud/content_crud.py:278-333`. In the loop at lines `305-307`, the condition
`if not word.word_forms: continue` evaluates true for the empty-string `word_forms`, so
that record is skipped entirely and never added to `entries` or `index_list`, meaning a
valid dictionary word disappears from the index while remaining accessible via its ID.

Fix in Cursor | Fix in VSCode Claude

(Use Cmd/Ctrl + Click for best experience)

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** backend/app/crud/content_crud.py
**Line:** 305:307
**Comment:**
	*Logic Error: Entries are skipped entirely when `word_forms` is empty, so valid dictionary records can disappear from the index even though they still exist and are retrievable by ID. Add a fallback term (for example the keyword) or enforce non-empty `word_forms` before indexing so words are not silently omitted.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎

Comment on lines +308 to +311
for form in word.word_forms.split(","):
form = form.strip()
if form:
entries.append((word.word_id, form))
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Splitting and appending every form under the same word_id creates multiple index entries with identical IDs, which can violate caller assumptions that each ID appears once in index results and cause duplicate-item behavior in clients. Deduplicate by word_id (or return a separate stable entry identifier per form) before building the final payload. [logic error]

Severity Level: Major ⚠️
- ⚠️ Index payload contains duplicate wordId entries per resource.
- ⚠️ Clients using wordId as unique key may misbehave.
Steps of Reproduction ✅
1. Create a dictionary word with multiple inflected forms using `POST /dictionary`
(`backend/app/router/content.py:39-68`) and `DictionaryCreate` example
(`backend/app/schema.py:60-82`), e.g. `keyword: "love"` and `wordForms: "loves, loved,
loving"`. This is saved by `upload_dictionary_words()` in
`backend/app/crud/content_crud.py:31-107` as a single `db_models.Dictionary` row with one
`word_id` and `word_forms` containing all forms.

2. Call the index endpoint `GET /dictionary/{resource_id}/index`
(`backend/app/router/content.py:144-168`), which invokes `get_dictionary_index()` in
`backend/app/crud/content_crud.py:278-333`.

3. In `get_dictionary_index()`, lines `303-311` iterate `for form in
word.word_forms.split(",")`, strip each `form`, and append `(word.word_id, form)` to
`entries` for every non-empty form. For a three-form string, this produces three tuples in
`entries` all sharing the same `word_id` but different `form` values.

4. The grouping loop at lines `317-325` builds `index_dict[first_letter].append({'wordId':
word_id, 'word': form})`, so the final `index_list` returned to clients contains multiple
`DictionaryIndexWord` objects with identical `wordId` values under possibly different
letters. Any caller of `/dictionary/{resource_id}/index` that assumes `wordId` is unique
within the index will observe duplicate IDs for a single dictionary record.

Fix in Cursor | Fix in VSCode Claude

(Use Cmd/Ctrl + Click for best experience)

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** backend/app/crud/content_crud.py
**Line:** 308:311
**Comment:**
	*Logic Error: Splitting and appending every form under the same `word_id` creates multiple index entries with identical IDs, which can violate caller assumptions that each ID appears once in index results and cause duplicate-item behavior in clients. Deduplicate by `word_id` (or return a separate stable entry identifier per form) before building the final payload.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎

@codeant-ai
Copy link
Copy Markdown

codeant-ai Bot commented May 11, 2026

CodeAnt AI finished reviewing your PR.

@tejaswini143 tejaswini143 self-assigned this May 11, 2026
@AthulyaMS AthulyaMS merged commit 00ef859 into dev May 11, 2026
2 of 4 checks passed
@RevantCI RevantCI deleted the dictindex branch May 11, 2026 12:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M This PR changes 30-99 lines, ignoring generated files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants