File size: 2,359 Bytes
0269f70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

import type { Dataset, DataItem, FullComparisonResult, Modality, SingleComparisonResult } from '../types';

/**
 * NOTE: The logic for live backend queries is in `apiService.ts`.
 * This file's functions are for interacting with pre-computed data stored on the client.
 */

// This helper creates a map of all items for efficient lookups by name.
const createItemsMap = (dataset: Dataset): Map<string, { item: DataItem, modality: Modality }> => {
  const map = new Map<string, { item: DataItem, modality: Modality }>();
  (Object.keys(dataset.data) as (keyof Dataset['data'])[]).forEach(pluralKey => {
    const modality: Modality = pluralKey === 'meshes' ? 'mesh' : pluralKey.slice(0, -1) as Modality;
    dataset.data[pluralKey].forEach(item => {
      map.set(item.name, { item, modality });
    });
  });
  return map;
};

/**
 * Retrieves pre-computed matches for a source item from the dataset's full comparison results.
 */
export const findTopMatchesFromLocal = (
  sourceItem: DataItem,
  sourceModality: Modality,
  dataset: Dataset
): SingleComparisonResult => {
  const results: SingleComparisonResult['results'] = { images: [], texts: [], meshes: [] };

  if (!dataset.fullComparison) {
    console.error("Full comparison data is missing from the dataset.");
    return { sourceItem, sourceModality, results };
  }
  
  const itemsMap = createItemsMap(dataset);
  const pluralKey = sourceModality === 'mesh' ? 'meshes' : `${sourceModality}s`;
  const sourceEntry = dataset.fullComparison[pluralKey as keyof FullComparisonResult].find(
      e => e.source === sourceItem.name
  );

  if (sourceEntry) {
      for (const key in sourceEntry.matches) {
          const modality = key as Modality;
          const resultPluralKey = modality === 'mesh' ? 'meshes' : `${modality}s`;
          if (sourceEntry.matches[modality]) {
              results[resultPluralKey as keyof typeof results] = sourceEntry.matches[modality]!.map(match => {
                  const found = itemsMap.get(match.item);
                  return {
                      item: found ? found.item : { id: `missing_${match.item}`, name: match.item, content: '' },
                      confidence: match.confidence,
                  };
              }).sort((a, b) => b.confidence - a.confidence);
          }
      }
  }

  return { sourceItem, sourceModality, results };
};