install
source · Clone the upstream repo
git clone https://github.com/Cantara/lib-electronic-components
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/Cantara/lib-electronic-components "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/parametric-search" ~/.claude/skills/cantara-lib-electronic-components-parametric-search && rm -rf "$T"
manifest:
.claude/skills/parametric-search/SKILL.mdsource content
Parametric Search Skill
This skill provides guidance for using the ParametricSearch utility to filter electronic components by their specifications.
Overview
ParametricSearch enables filtering collections of ElectronicPart objects using unit-aware parametric queries. It supports:
- Comparison operators (>=, <=, >, <, =, !=)
- Range queries (min..max)
- Set membership (IN)
- Automatic unit parsing (nF, uF, kΩ, etc.)
Quick Reference
Query Syntax
| Syntax | Example | Matches |
|---|---|---|
| | Capacitors 10nF and above |
| | Voltage 50V and below |
| | Resistance above 1kΩ |
| | Capacitance below 1µF |
| | Exact string match |
| | Not equal to string |
| | Range (inclusive) |
| | Any of listed values |
Unit Prefixes
| Prefix | Multiplier | Example |
|---|---|---|
| p | 10⁻¹² | 100pF |
| n | 10⁻⁹ | 100nF |
| u/µ | 10⁻⁶ | 10uF, 10µF |
| m | 10⁻³ | 100mV |
| k/K | 10³ | 10k, 10K |
| M | 10⁶ | 1M |
| G | 10⁹ | 1GHz |
Usage Patterns
Static Filter Method
Map<String, String> requirements = Map.of( "capacitance", ">= 10nF", "voltage", ">= 25V", "dielectric", "IN(X7R, X5R)" ); List<ElectronicPart> results = ParametricSearch.filter(capacitors, requirements);
Fluent Builder
List<ElectronicPart> results = ParametricSearch.search(capacitors) .min("capacitance", "10nF") .max("voltage", "50V") .in("dielectric", "X7R", "X5R", "C0G") .find();
Range Queries
// Find resistors between 1kΩ and 100kΩ List<ElectronicPart> results = ParametricSearch.search(resistors) .range("resistance", "1k", "100k") .find(); // Equivalent using where() List<ElectronicPart> results = ParametricSearch.search(resistors) .where("resistance", "1k..100k") .find();
Single Part Check
ElectronicPart capacitor = ...; if (ParametricSearch.meets(capacitor, "capacitance", ">= 10nF")) { // Part meets requirement }
Utility Methods
// Count matching parts long count = ParametricSearch.search(parts) .min("voltage", "25V") .count(); // Check if any match boolean hasHighVoltage = ParametricSearch.search(parts) .min("voltage", "100V") .anyMatch(); // Get first match Optional<ElectronicPart> first = ParametricSearch.search(parts) .equals("dielectric", "C0G") .findFirst();
Builder Methods
| Method | Description |
|---|---|
| Add any requirement string |
| Add requirement |
| Add requirement |
| Add requirement |
| Add requirement |
| Add requirement |
| Add requirement |
| Execute and return List |
| Execute and return Optional |
| Execute and return count |
| Execute and return boolean |
Searchable Fields
From specs Map
Any key in
ElectronicPart.getSpecs():
,capacitance
,resistanceinductance
,voltage
,currentpower
,tolerancetempco
,dielectricmaterial- Custom spec keys
Built-in Fields
| Key | Field |
|---|---|
| |
, | |
, | |
, | |
| |
Common Use Cases
Find High-Voltage X7R Capacitors
List<ElectronicPart> results = ParametricSearch.search(capacitors) .min("voltage", "50V") .equals("dielectric", "X7R") .find();
Find Precision Resistors
List<ElectronicPart> results = ParametricSearch.search(resistors) .where("tolerance", "<= 0.1%") .in("package", "0402", "0603", "0805") .find();
Filter BOM by Manufacturer
List<ElectronicPart> murataOnly = ParametricSearch.search(bomEntries) .equals("manufacturer", "Murata") .find();
Find Capacitors in Value Range
List<ElectronicPart> decouplingCaps = ParametricSearch.search(capacitors) .range("capacitance", "100nF", "10uF") .min("voltage", "16V") .in("dielectric", "X7R", "X5R") .find();
Integration with BOM
public List<BOMEntry> findObsoleteHighValueParts(BOM bom) { return ParametricSearch.search(bom.getBomEntries()) .min("capacitance", "10uF") // High value .find() .stream() .filter(ElectronicPart::isLifecycleAtRisk) // Obsolete .map(p -> (BOMEntry) p) .toList(); }
Gotchas
1. Case Sensitivity
- Unit prefixes:
= milli,m
= mega (case matters!)M - k/K: Both work for kilo
- String values: Case-insensitive (
matchesX7R
)x7r
2. Missing Specs
Parts without the requested spec are excluded from results:
// Part without "voltage" spec will NOT be in results ParametricSearch.filter(parts, Map.of("voltage", ">= 25V"));
3. Null Handling
// Empty/null collection returns empty list ParametricSearch.filter(null, requirements); // [] ParametricSearch.filter(List.of(), requirements); // [] // Null/empty requirements returns all parts ParametricSearch.filter(parts, null); // all parts ParametricSearch.filter(parts, Map.of()); // all parts
4. Unit Stripping
Units are stripped for comparison:
and"50V"
compare as equal"50"
and"10kΩ"
compare as equal"10k"
5. Works with Subclasses
BOMEntry extends ElectronicPart, so filtering works:
List<BOMEntry> entries = ...; List<ElectronicPart> results = ParametricSearch.filter(entries, requirements); // Results can be cast back to BOMEntry if needed
Performance Notes
- Predicates are built once per filter() call
- Each part is evaluated against all predicates
- For large collections, consider pre-filtering by type first
- No indexing - O(n) per filter operation
Related Classes
- Value parsing (used internally)ComponentValueStandardizer
/SpecValue
- Typed spec systemSpecUnit
- Similar pattern for typed specsBaseComponentSpecs.meetsRequirements()
Learnings & Quirks
January 2026
- BigDecimal comparison: Use
, notcompareTo()
-equals()
equals1E+3
by value1000 - Micro symbol: Both
andu
are supported for micro prefixµ - Percentage handling:
parses to1%
, not1
(matches how tolerances are typically specified)0.01 - Existing typed spec infrastructure: The library has
,SpecValue
,SpecUnit
, andBaseComponentSpecs.meetsRequirements()
- a comprehensive typed spec system.ComponentValueStandardizer
bridges the gap betweenParametricSearch
(Map<String, String>) and these typed systems.ElectronicPart.specs - Two spec systems exist:
uses strings, whileElectronicPart.specs
uses typedComponentSpecification
. ParametricSearch works with the string-based system which is more commonly used.SpecValue<?>