diff --git a/docs/src/js/functions/makeJsonField.md b/docs/src/js/functions/makeJsonField.md new file mode 100644 index 000000000..bfa6fd6d7 --- /dev/null +++ b/docs/src/js/functions/makeJsonField.md @@ -0,0 +1,36 @@ +[**@lancedb/lancedb**](../README.md) • **Docs** + +*** + +[@lancedb/lancedb](../globals.md) / makeJsonField + +# Function: makeJsonField() + +```ts +function makeJsonField(name, nullable): Field +``` + +Create an Arrow field backed by LanceDB's JSON extension type. + +## Parameters + +* **name**: `string` + The field name. + +* **nullable**: `boolean` = `true` + Whether the field accepts null values. + +## Returns + +`Field` + +## Example + +```ts +import { connect, makeJsonField } from "@lancedb/lancedb"; +import { Schema } from "apache-arrow"; + +const schema = new Schema([makeJsonField("metadata")]); +const db = await connect("/path/to/database"); +await db.createTable("items", [{ metadata: '{"source":"api"}' }], { schema }); +``` diff --git a/docs/src/js/globals.md b/docs/src/js/globals.md index 422c6c428..7e8344054 100644 --- a/docs/src/js/globals.md +++ b/docs/src/js/globals.md @@ -170,6 +170,7 @@ - [instrumentLanceDbMetrics](functions/instrumentLanceDbMetrics.md) - [isBlobField](functions/isBlobField.md) - [makeArrowTable](functions/makeArrowTable.md) +- [makeJsonField](functions/makeJsonField.md) - [packBits](functions/packBits.md) - [permutationBuilder](functions/permutationBuilder.md) - [tokenize](functions/tokenize.md) diff --git a/nodejs/__test__/arrow.test.ts b/nodejs/__test__/arrow.test.ts index 83b4fae46..6c1d5ecba 100644 --- a/nodejs/__test__/arrow.test.ts +++ b/nodejs/__test__/arrow.test.ts @@ -20,6 +20,7 @@ import { fromTableToBuffer, makeArrowTable, makeEmptyTable, + makeJsonField, } from "../lancedb/arrow"; import { EmbeddingFunction, @@ -28,6 +29,21 @@ import { import { EmbeddingFunctionConfig } from "../lancedb/embedding/registry"; import { sanitizeTable } from "../lancedb/sanitize"; +it("creates a nullable JSON field with the Arrow extension metadata", () => { + const field = makeJsonField("metadata"); + + expect(field.name).toBe("metadata"); + expect(field.type).toEqual(new arrow15.Utf8()); + expect(field.nullable).toBe(true); + expect(field.metadata).toEqual( + new Map([["ARROW:extension:name", "arrow.json"]]), + ); +}); + +it("allows JSON fields to be non-nullable", () => { + expect(makeJsonField("metadata", false).nullable).toBe(false); +}); + // biome-ignore lint/suspicious/noExplicitAny: skip function sampleRecords(): Array> { return [ diff --git a/nodejs/lancedb/arrow.ts b/nodejs/lancedb/arrow.ts index 81b140da7..df875a808 100644 --- a/nodejs/lancedb/arrow.ts +++ b/nodejs/lancedb/arrow.ts @@ -72,6 +72,30 @@ export type FieldLike = metadata?: Map; }; +/** + * Create an Arrow field backed by LanceDB's JSON extension type. + * + * @param name - The field name. + * @param nullable - Whether the field accepts null values. + * @example + * ```ts + * import { connect, makeJsonField } from "@lancedb/lancedb"; + * import { Schema } from "apache-arrow"; + * + * const schema = new Schema([makeJsonField("metadata")]); + * const db = await connect("/path/to/database"); + * await db.createTable("items", [{ metadata: '{"source":"api"}' }], { schema }); + * ``` + */ +export function makeJsonField(name: string, nullable = true): Field { + return new Field( + name, + new Utf8(), + nullable, + new Map([["ARROW:extension:name", "arrow.json"]]), + ); +} + export type DataLike = | import("apache-arrow").Data | { diff --git a/nodejs/lancedb/index.ts b/nodejs/lancedb/index.ts index a58cb182e..c30c5c5ba 100644 --- a/nodejs/lancedb/index.ts +++ b/nodejs/lancedb/index.ts @@ -72,6 +72,7 @@ export { export { makeArrowTable, + makeJsonField, MakeArrowTableOptions, Data, VectorColumnOptions,