MCPcopy Create free account
hub / github.com/DeusData/codebase-memory-mcp / search_where_basic

Function search_where_basic

src/store/store.c:4302–4361  ·  view source on GitHub ↗

Build basic WHERE clauses: project, label, name, file, qn patterns. */

Source from the content-addressed store, hash-verified

4300
4301/* Build basic WHERE clauses: project, label, name, file, qn patterns. */
4302static int search_where_basic(const cbm_search_params_t *params, char *where, int where_sz,
4303 int *wlen, int *nparams, search_bind_t *binds, int *bind_idx,
4304 search_like_pool_t *pool) {
4305 char bind_buf[CBM_SZ_64];
4306
4307 if (params->project) {
4308 snprintf(bind_buf, sizeof(bind_buf), "n.project = ?%d", *bind_idx + SKIP_ONE);
4309 *wlen = where_append(where, where_sz, *wlen, nparams, bind_buf);
4310 where_bind_text(binds, bind_idx, params->project);
4311 }
4312 /* Ignore an empty-string label: it is non-NULL but should behave like an
4313 * omitted label (no filter), matching the BM25 query path. Without the
4314 * params->label[0] guard, name_pattern/qn_pattern searches that pass
4315 * label="" append `n.label = ''`, which matches no node and silently
4316 * returns zero results (issue #481). */
4317 if (params->label && params->label[0]) {
4318 snprintf(bind_buf, sizeof(bind_buf), "n.label = ?%d", *bind_idx + SKIP_ONE);
4319 *wlen = where_append(where, where_sz, *wlen, nparams, bind_buf);
4320 where_bind_text(binds, bind_idx, params->label);
4321 }
4322 if (params->name_pattern) {
4323 where_add_like_hints("n.name", params->name_pattern, where, where_sz, wlen, nparams, binds,
4324 bind_idx, pool);
4325 where_add_regex(where, where_sz, wlen, nparams, binds, bind_idx, "n.name",
4326 params->name_pattern, params->case_sensitive);
4327 }
4328 if (params->qn_pattern) {
4329 where_add_like_hints("n.qualified_name", params->qn_pattern, where, where_sz, wlen, nparams,
4330 binds, bind_idx, pool);
4331 where_add_regex(where, where_sz, wlen, nparams, binds, bind_idx, "n.qualified_name",
4332 params->qn_pattern, params->case_sensitive);
4333 }
4334 if (params->file_pattern) {
4335 char *lp = cbm_glob_to_like(params->file_pattern);
4336 /* A file_pattern with no glob wildcards is treated as a path-substring
4337 * match (issue #200): file_pattern="offer-server" should match
4338 * "src/offer-server/x.js", not only a path equal to "offer-server".
4339 * Patterns that DO contain * / ? keep their explicit glob semantics. */
4340 if (lp && !strchr(params->file_pattern, '*') && !strchr(params->file_pattern, '?')) {
4341 size_t lplen = strlen(lp);
4342 char *contains = malloc(lplen + 3);
4343 if (contains) {
4344 contains[0] = '%';
4345 memcpy(contains + 1, lp, lplen);
4346 contains[lplen + 1] = '%';
4347 contains[lplen + 2] = '\0';
4348 free(lp);
4349 lp = contains;
4350 }
4351 }
4352 int pool_was_full = (pool->count >= ST_LIKE_POOL_MAX);
4353 like_pool_add(pool, lp);
4354 if (!pool_was_full && lp) {
4355 snprintf(bind_buf, sizeof(bind_buf), "n.file_path LIKE ?%d", *bind_idx + SKIP_ONE);
4356 *wlen = where_append(where, where_sz, *wlen, nparams, bind_buf);
4357 where_bind_text(binds, bind_idx, lp);
4358 }
4359 }

Callers 1

search_build_whereFunction · 0.85

Calls 6

where_appendFunction · 0.85
where_bind_textFunction · 0.85
where_add_like_hintsFunction · 0.85
where_add_regexFunction · 0.85
cbm_glob_to_likeFunction · 0.85
like_pool_addFunction · 0.85

Tested by

no test coverage detected