Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
8812129
Initial plan
Copilot Feb 22, 2026
42395bc
Migrate SchemaDesignerAPI to JAX-RS V2 annotations
Copilot Feb 22, 2026
20f4431
Address code review feedback: fix copyFrom parameter shadowing and co…
Copilot Feb 22, 2026
de90529
Fix query() returning no results when sample docs not in memory (empt…
Copilot Feb 22, 2026
912c762
Fix schema designer download: correct URL, add Content-Disposition he…
Copilot Feb 23, 2026
7c16593
Fix query response structure: wrap SolrDocumentList in numFound/start…
Copilot Feb 23, 2026
b382a4c
Lint clean ups. "multivalued" is how we spell it ;-) Not "multi-val…
epugh Mar 6, 2026
233162e
code review and manual testing
epugh Mar 10, 2026
11f5209
track change
epugh Mar 10, 2026
6a46d40
Finally fix the visibility warning!
epugh Mar 10, 2026
bcb6a86
Restore surfacing indexing errors.
epugh Mar 10, 2026
115fccb
Fix error prone.
epugh Mar 10, 2026
6756865
Fix requireSchemaVersion to also reject negative values (restores -1 …
Copilot Mar 19, 2026
c7e0099
Merge remote-tracking branch 'upstream/main' into copilot/migrate-sch…
epugh Mar 19, 2026
810cb96
Merge branch 'copilot/migrate-schemadesignerapi-to-v2-annotations' of…
epugh Mar 19, 2026
c04147f
Move configSet from query parameter to path parameter in Schema Desig…
Copilot Mar 30, 2026
7f6274c
Use correct HTTP verbs in Schema Designer API (DELETE and PUT)
Copilot Mar 30, 2026
d05be2f
Move downloadConfig to reusable ConfigsetsApi.Download / DownloadConf…
Copilot Apr 2, 2026
0881dba
Move schema-designer download to generic configsets endpoint; add dis…
Copilot Apr 2, 2026
b021f15
Use our standard naming pattern that the Api is in the endpoint package
epugh Apr 2, 2026
9667896
Rework changelog
epugh Apr 2, 2026
91be03c
Use same style for all class intro javadocs.
epugh Apr 2, 2026
a3befe4
Update TestSchemaDesigner to use typed POJO return types
Copilot Apr 2, 2026
0520952
Add clarifying comment to setSchemaObjectField switch
Copilot Apr 2, 2026
9e3f38d
Replace FlexibleSolrJerseyResponse with typed POJOs in Schema Designe…
Copilot Apr 2, 2026
b52c891
Merge remote-tracking branch 'origin/copilot/migrate-schemadesignerap…
Copilot Apr 2, 2026
f53de8f
Add BATS integration test for Schema Designer API endpoints
Copilot Apr 2, 2026
13a2abf
Move getFileContents to ConfigsetsApi/GetConfigSetFile; add Configset…
Copilot Apr 2, 2026
b6a69de
Reduce mocking: use real FileSystemConfigSetService in configsets API…
Copilot Apr 2, 2026
42db2a3
Mention new capablities in solrj in changelog
epugh Apr 3, 2026
ac0a661
code review
epugh Apr 3, 2026
96efd9d
More test coverage
epugh Apr 3, 2026
46d3042
Prevent warning
epugh Apr 3, 2026
61f0689
Merge remote-tracking branch 'origin/main' into copilot/migrate-schem…
Copilot Apr 24, 2026
fa6fcad
Merge origin/main: pick up ConfigSets revamp (validation, isFileForbi…
Copilot Apr 24, 2026
c725d97
Keep only schema designer changes; remove configset additions; restor…
Copilot Apr 24, 2026
909988b
Merge remote-tracking branch 'upstream/main' into copilot/migrate-sch…
epugh Apr 24, 2026
c4c1e0e
Remove duplicate zipConfigSet from SchemaDesignerConfigSetHelper; use…
Copilot Apr 24, 2026
c0169a2
Remove downloadConfig from SchemaDesignerApi; JS uses ConfigsetsApi d…
Copilot Apr 24, 2026
8832e91
Be able to reuse download configset without magic property
epugh Apr 24, 2026
fa0f2c0
Typo fix! Lets be explicit
epugh Apr 24, 2026
ddba94e
Fix "inprog" error, mostly seen on Schema Designer.
epugh Apr 24, 2026
2216156
Be user facing!
epugh Apr 24, 2026
7b99a0d
Lets reuse a configset api for getting a single file
epugh Apr 24, 2026
0574d0f
tidy
epugh Apr 24, 2026
41d35ed
wordsmeith
epugh Apr 24, 2026
073d82d
SOLR-17951: satiate errorprone's ImmutableEnumChecker
hossman May 1, 2026
8692086
SOLR-18198 Add support for "missing" stats in rollup for streaming ex…
KhushJain May 2, 2026
74b098e
Fix HTTP 500 in filestore getMetadata racing with concurrent delete (…
epugh May 2, 2026
f254d00
Rename CoreAdmin UPGRADECOREINDEX action to UPGRADEINDEX (#4387)
rahulgoswami May 2, 2026
a317f73
Remove 4 unused fields from CachingDirectoryFactory (#4393)
gus-asf May 3, 2026
b4cb0e0
SOLR-17924: Introduce Configset create and import flows (#4166)
malliaridis May 3, 2026
60cab92
SOLR-18210: Fix for GPU accelerated vector indexing silently falling …
rahulgoswami May 5, 2026
a2370b5
SOLR-18077: Fix incorrect request reuse, fix unit tests. (#4396)
sigram May 6, 2026
76da361
Merge remote-tracking branch 'upstream/main' into copilot/migrate-sch…
epugh May 6, 2026
ebb31ea
I hate that I added that super detailed unit test on inputs because t…
epugh May 6, 2026
a89880f
remove duplication of tests from bats and junit, follow our bats style
epugh May 8, 2026
9f1ca91
More User oriented title
epugh May 8, 2026
414d6a3
Move to seperate PR
epugh May 8, 2026
fdcfc5c
unclear the true value!
epugh May 8, 2026
b51d7c8
Refactor duplicates, found a fourth method that wasn't actually used,…
epugh May 8, 2026
ee50f7d
Some deeper docs on addErrorToResponse. This is definitly a unique …
epugh May 8, 2026
9c86ee8
Cleaning up old code, and comparign schema-designer.js to our java code.
epugh May 9, 2026
690dd9b
Actually support this in solrj (not jsut when js calsl the endpoint)
epugh May 9, 2026
bd30314
Revamp API with an eye to proper OpenAPI support.
epugh May 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ This file lists Solr's raw release notes with details of every change to Solr. M
- Added new ConcurrentUpdateJdkSolrClient that works with HttpJdkSolrClient [SOLR-18065](https://issues.apache.org/jira/browse/SOLR-18065) (James Dyer)
- Support including stored fields in Export Writer output. [SOLR-18071](https://issues.apache.org/jira/browse/SOLR-18071) (Luke Kot-Zaniewski)
- Introducing support for multi valued dense vector representation in documents through nested vectors [SOLR-18074](https://issues.apache.org/jira/browse/SOLR-18074) (Alessandro Benedetti)
- CoreAdmin API (/admin/cores?action=UPGRADECOREINDEX) to upgrade an index in-place [SOLR-18096](https://issues.apache.org/jira/browse/SOLR-18096) (Rahul Goswami)
- CoreAdmin API (/admin/cores?action=UPGRADEINDEX) to upgrade an index in-place [SOLR-18096](https://issues.apache.org/jira/browse/SOLR-18096) (Rahul Goswami)
- CrossDC Consumer - add Prometheus metrics [SOLR-18060](https://issues.apache.org/jira/browse/SOLR-18060) (Andrzej Bialecki @ab)
- CrossDC - support arbitrary Kafka properties [SOLR-18062](https://issues.apache.org/jira/browse/SOLR-18062) (Andrzej Bialecki @ab)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# See https://github.com/apache/solr/blob/main/dev-docs/changelog.adoc
title: Filestore metadata API no longer returns HTTP 500 when a file is deleted concurrently with a metadata read; the response now matches the not-found case (null entry).
type: fixed # added, changed, fixed, deprecated, removed, dependency_update, security, other
authors:
- name: Eric Pugh
links:
- https://github.com/apache/solr/pull/4367
10 changes: 10 additions & 0 deletions changelog/unreleased/SOLR-17924-configset-creation-new-ui.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
title: SOLR 17845 - Implement Configset Creation and Importing in New UI
type: added
authors:
- name: Christos Malliaridis
nick: malliaridis
links:
- name: SOLR-17924
url: https://issues.apache.org/jira/browse/SOLR-17924
- name: PR#4166
url: https://github.com/apache/solr/pull/4166
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# See https://github.com/apache/solr/blob/main/dev-docs/changelog.adoc
title: Schema Designer sample-doc analysis now works correctly when analyze sample documents.
type: fixed # added, changed, fixed, deprecated, removed, dependency_update, security, other
authors:
- name: Eric Pugh
links:
- name: SOLR-18152
url: https://issues.apache.org/jira/browse/SOLR-18152
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# See https://github.com/apache/solr/blob/main/dev-docs/changelog.adoc
title: "Support 'missing' stats count in rollup function for streaming expressions"
type: added
authors:
- name: khushjain
links:
- name: SOLR-18198
url: https://issues.apache.org/jira/browse/SOLR-18198
7 changes: 7 additions & 0 deletions changelog/unreleased/SOLR-18210-fix-GPU-vector-indexing.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
title: Fix for GPU vector indexing silently falling back to using CPU instead
type: fixed
authors:
- name: Rahul Goswami
links:
- name: SOLR-18210
url: https://issues.apache.org/jira/browse/SOLR-18210
9 changes: 9 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
[versions]
adobe-testing-s3mock = "3.12.0"
amazon-awssdk = "2.42.34"
androidx-adaptive = "1.3.0-alpha07"
androidx-lifecycle = "2.10.0"
androidx-navigation3 = "1.1.0"
# @keep Antora version used in ref-guide
antora = "3.1.12"
# @keep Most recent commit as of 2025-08-03, this repo does not have tags
Expand Down Expand Up @@ -236,6 +239,12 @@ amazon-awssdk-retries-spi = { module = "software.amazon.awssdk:retries-spi", ver
amazon-awssdk-s3 = { module = "software.amazon.awssdk:s3", version.ref = "amazon-awssdk" }
amazon-awssdk-sdkcore = { module = "software.amazon.awssdk:sdk-core", version.ref = "amazon-awssdk" }
amazon-awssdk-sts = { module = "software.amazon.awssdk:sts", version.ref = "amazon-awssdk" }
androidx-lifecycle-runtimeCompose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidx-lifecycle" }
androidx-lifecycle-viewmodelCompose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" }
androidx-lifecycle-viewModelNav3 = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-navigation3", version.ref = "androidx-lifecycle" }
androidx-material3-adaptive = { module = "org.jetbrains.compose.material3.adaptive:adaptive", version.ref = "androidx-adaptive" }
androidx-material3-adaptive-nav3 = { module = "org.jetbrains.compose.material3.adaptive:adaptive-navigation3", version.ref = "androidx-adaptive" }
androidx-navigation3-ui = { module = "org.jetbrains.androidx.navigation3:navigation3-ui", version.ref = "androidx-navigation3" }
apache-calcite-avatica-core = { module = "org.apache.calcite.avatica:avatica-core", version.ref = "apache-calcite-avatica" }
apache-calcite-core = { module = "org.apache.calcite:calcite-core", version.ref = "apache-calcite" }
apache-calcite-linq4j = { module = "org.apache.calcite:calcite-linq4j", version.ref = "apache-calcite" }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.client.api.endpoint;

import static org.apache.solr.client.api.util.Constants.GENERIC_ENTITY_PROPERTY;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.extensions.Extension;
import io.swagger.v3.oas.annotations.extensions.ExtensionProperty;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.DefaultValue;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.QueryParam;
import java.io.InputStream;
import java.util.List;
import org.apache.solr.client.api.model.FlexibleSolrJerseyResponse;
import org.apache.solr.client.api.model.SchemaDesignerAddRequestBody;
import org.apache.solr.client.api.model.SchemaDesignerCollectionsResponse;
import org.apache.solr.client.api.model.SchemaDesignerConfigsResponse;
import org.apache.solr.client.api.model.SchemaDesignerInfoResponse;
import org.apache.solr.client.api.model.SchemaDesignerPublishResponse;
import org.apache.solr.client.api.model.SchemaDesignerResponse;
import org.apache.solr.client.api.model.SchemaDesignerSchemaDiffResponse;
import org.apache.solr.client.api.model.SchemaDesignerUpdateRequestBody;
import org.apache.solr.client.api.model.SolrJerseyResponse;

/** V2 API definitions for the Solr Schema Designer. */
@Path("/schema-designer")
public interface SchemaDesignerApi {

@GET
@Path("/{configSet}/info")
@Operation(
summary = "Get info about a configSet being designed.",
tags = {"schema-designer"})
SchemaDesignerInfoResponse getInfo(@PathParam("configSet") String configSet) throws Exception;

@POST
@Path("/{configSet}/prep")
@Operation(
summary = "Prepare a mutable configSet copy for schema design.",
tags = {"schema-designer"})
SchemaDesignerResponse prepNewSchema(
@PathParam("configSet") String configSet, @QueryParam("copyFrom") String copyFrom)
throws Exception;

@DELETE
@Path("/{configSet}")
@Operation(
summary = "Clean up temporary resources for a schema being designed.",
tags = {"schema-designer"})
SolrJerseyResponse cleanupTempSchema(@PathParam("configSet") String configSet) throws Exception;

@PUT
@Path("/{configSet}/file")
@Operation(
summary = "Update the contents of a file in a configSet being designed.",
tags = {"schema-designer"})
SchemaDesignerResponse updateFileContents(
@PathParam("configSet") String configSet,
@QueryParam("file") String file,
@RequestBody(
required = true,
extensions = {
@Extension(
properties = {
@ExtensionProperty(name = GENERIC_ENTITY_PROPERTY, value = "true")
})
})
InputStream fileContents)
throws Exception;

@GET
@Path("/{configSet}/sample")
@Operation(
summary = "Get a sample value and analysis for a field.",
tags = {"schema-designer"})
FlexibleSolrJerseyResponse getSampleValue(
@PathParam("configSet") String configSet,
@QueryParam("field") String fieldName,
@QueryParam("uniqueKeyField") String idField,
@QueryParam("docId") String docId)
throws Exception;

@GET
@Path("/{configSet}/collectionsForConfig")
@Operation(
summary = "List collections that use a given configSet.",
tags = {"schema-designer"})
SchemaDesignerCollectionsResponse listCollectionsForConfig(
@PathParam("configSet") String configSet) throws Exception;

@GET
@Path("/configs")
@Operation(
summary = "List all configSets available for schema design.",
tags = {"schema-designer"})
SchemaDesignerConfigsResponse listConfigs() throws Exception;

@POST
@Path("/{configSet}/add")
@Operation(
summary = "Add a new field, field type, or dynamic field to the schema being designed.",
tags = {"schema-designer"})
SchemaDesignerResponse addSchemaObject(
@PathParam("configSet") String configSet,
@QueryParam("schemaVersion") Integer schemaVersion,
SchemaDesignerAddRequestBody requestBody)
throws Exception;

@PUT
@Path("/{configSet}/update")
@Operation(
summary = "Update an existing field or field type in the schema being designed.",
tags = {"schema-designer"})
SchemaDesignerResponse updateSchemaObject(
@PathParam("configSet") String configSet,
@QueryParam("schemaVersion") Integer schemaVersion,
SchemaDesignerUpdateRequestBody requestBody)
throws Exception;

@PUT
@Path("/{configSet}/publish")
@Operation(
summary = "Publish the designed schema to a live configSet.",
tags = {"schema-designer"})
SchemaDesignerPublishResponse publish(
@PathParam("configSet") String configSet,
@QueryParam("schemaVersion") Integer schemaVersion,
@QueryParam("newCollection") String newCollection,
@QueryParam("reloadCollections") @DefaultValue("false") Boolean reloadCollections,
@QueryParam("numShards") @DefaultValue("1") Integer numShards,
@QueryParam("replicationFactor") @DefaultValue("1") Integer replicationFactor,
@QueryParam("indexToCollection") @DefaultValue("false") Boolean indexToCollection,
@QueryParam("cleanupTemp") @DefaultValue("true") Boolean cleanupTempParam,
@QueryParam("disableDesigner") @DefaultValue("false") Boolean disableDesigner)
throws Exception;

/**
* Analyzes sample documents to suggest a schema.
*
* <p>Sample documents are read from the HTTP request body (not declared as a parameter on this
* interface — see {@code SchemaDesigner#loadSampleDocuments}) and dispatched to a parser based on
* the {@code Content-Type} header.
*/
@POST
@Path("/{configSet}/analyze")
@Operation(
summary = "Analyze sample documents and suggest a schema.",
description =
"Sample documents are supplied in the request body. The Content-Type header selects the"
+ " parser: application/json, text/xml or application/xml, text/csv or"
+ " application/csv, or text/plain or application/octet-stream (treated as JSON"
+ " lines). Capped at 5MB and 1000 documents.",
tags = {"schema-designer"})
SchemaDesignerResponse analyze(
@PathParam("configSet") String configSet,
@QueryParam("schemaVersion") Integer schemaVersion,
@QueryParam("copyFrom") String copyFrom,
@QueryParam("uniqueKeyField") String uniqueKeyField,
@QueryParam("languages") List<String> languages,
@QueryParam("enableDynamicFields") Boolean enableDynamicFields,
@QueryParam("enableFieldGuessing") Boolean enableFieldGuessing,
@QueryParam("enableNestedDocs") Boolean enableNestedDocs)
throws Exception;

@GET
@Path("/{configSet}/query")
@Operation(
summary = "Query the temporary collection used during schema design.",
tags = {"schema-designer"})
FlexibleSolrJerseyResponse query(@PathParam("configSet") String configSet) throws Exception;

@GET
@Path("/{configSet}/diff")
@Operation(
summary = "Get the diff between the designed schema and the published schema.",
tags = {"schema-designer"})
SchemaDesignerSchemaDiffResponse getSchemaDiff(@PathParam("configSet") String configSet)
throws Exception;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.client.api.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.Map;

/**
* Request body for the Schema Designer add endpoint. Exactly one of the four fields should be
* populated; the populated field's name is the action and its value carries the schema-object
* attributes (e.g. for {@code addField}: {@code name}, {@code type}, {@code stored}, etc.).
*/
public class SchemaDesignerAddRequestBody {

@Schema(name = "addField")
@JsonProperty("add-field")
public Map<String, Object> addField;

@Schema(name = "addDynamicField")
@JsonProperty("add-dynamic-field")
public Map<String, Object> addDynamicField;

@Schema(name = "addCopyField")
@JsonProperty("add-copy-field")
public Map<String, Object> addCopyField;

@Schema(name = "addFieldType")
@JsonProperty("add-field-type")
public Map<String, Object> addFieldType;
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.ui.components.configsets.overview.integration
package org.apache.solr.client.api.model;

import com.arkivanov.mvikotlin.core.store.StoreFactory
import io.ktor.client.HttpClient
import org.apache.solr.ui.components.configsets.overview.ConfigsetsOverviewComponent
import org.apache.solr.ui.utils.AppComponentContext
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;

class DefaultConfigsetsOverviewComponent(
componentContext: AppComponentContext,
storeFactory: StoreFactory,
httpClient: HttpClient,
) : ConfigsetsOverviewComponent,
AppComponentContext by componentContext
/** Response body for the Schema Designer list-collections-for-config endpoint. */
public class SchemaDesignerCollectionsResponse extends SolrJerseyResponse {

@JsonProperty("collections")
public List<String> collections;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.client.api.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Map;

/** Response body for the Schema Designer list-configs endpoint. */
public class SchemaDesignerConfigsResponse extends SolrJerseyResponse {

/**
* Map of configSet name to status: 0 = in-progress (temp only), 1 = disabled, 2 = enabled and
* published.
*/
@JsonProperty("configSets")
public Map<String, Integer> configSets;
}
Loading
Loading