@@ -1504,6 +1504,99 @@ private JSONObject _getObjectsOffline(@NonNull final List<String> objectIDs, fin
1504
1504
}
1505
1505
}
1506
1506
1507
+ // ----------------------------------------------------------------------
1508
+ // Search for facet values
1509
+ // ----------------------------------------------------------------------
1510
+
1511
+ @ Override
1512
+ public Request searchForFacetValues (@ NonNull String facetName , @ NonNull String text , @ Nullable Query query , @ NonNull final CompletionHandler completionHandler ) {
1513
+ // A non-mirrored index behaves exactly as an online index.
1514
+ if (!mirrored ) {
1515
+ return super .searchForFacetValues (facetName , text , query , completionHandler );
1516
+ }
1517
+ // A mirrored index launches a mixed offline/online request.
1518
+ else {
1519
+ final Query queryCopy = query != null ? new Query (query ) : null ;
1520
+ return new MixedFacetSearchRequest (facetName , text , queryCopy , completionHandler ).start ();
1521
+ }
1522
+ }
1523
+
1524
+ /**
1525
+ * Search for facet values, explicitly targeting the online API, not the offline mirror.
1526
+ * Same parameters as {@link Index#searchForFacetValues(String, String, Query, CompletionHandler)}.
1527
+ */
1528
+ public Request searchForFacetValuesOnline (@ NonNull String facetName , @ NonNull String text , @ Nullable Query query , @ NonNull final CompletionHandler completionHandler ) {
1529
+ return super .searchForFacetValues (facetName , text , query , new CompletionHandler () {
1530
+ @ Override
1531
+ public void requestCompleted (JSONObject content , AlgoliaException error ) {
1532
+ try {
1533
+ if (content != null )
1534
+ content .put (JSON_KEY_ORIGIN , JSON_VALUE_ORIGIN_REMOTE );
1535
+ }
1536
+ catch (JSONException e ) {
1537
+ throw new RuntimeException (e ); // should never happen
1538
+ }
1539
+ completionHandler .requestCompleted (content , error );
1540
+ }
1541
+ });
1542
+ }
1543
+
1544
+ /**
1545
+ * Search for facet values, explicitly targeting the offline mirror, not the online API.
1546
+ */
1547
+ public Request searchForFacetValuesOffline (final @ NonNull String facetName , final @ NonNull String text , @ Nullable Query query , @ NonNull final CompletionHandler completionHandler ) {
1548
+ if (!mirrored ) {
1549
+ throw new IllegalStateException ("Offline requests are only available when the index is mirrored" );
1550
+ }
1551
+ final Query queryCopy = query != null ? new Query (query ) : null ;
1552
+ return getClient ().new AsyncTaskRequest (completionHandler , getClient ().localSearchExecutorService ) {
1553
+ @ NonNull
1554
+ @ Override
1555
+ protected JSONObject run () throws AlgoliaException {
1556
+ return _searchForFacetValuesOffline (facetName , text , queryCopy );
1557
+ }
1558
+ }.start ();
1559
+ }
1560
+
1561
+ private class MixedFacetSearchRequest extends OnlineOfflineRequest {
1562
+ private final @ NonNull String facetName ;
1563
+ private final @ NonNull String facetQuery ;
1564
+ private final Query query ;
1565
+
1566
+ public MixedFacetSearchRequest (@ NonNull String facetName , @ NonNull String facetQuery , @ Nullable Query query , @ NonNull CompletionHandler completionHandler ) {
1567
+ super (completionHandler );
1568
+ this .facetName = facetName ;
1569
+ this .facetQuery = facetQuery ;
1570
+ this .query = query ;
1571
+ }
1572
+
1573
+ @ Override
1574
+ protected Request startOnlineRequest (CompletionHandler completionHandler ) {
1575
+ return searchForFacetValuesOnline (facetName , facetQuery , query , completionHandler );
1576
+ }
1577
+
1578
+ @ Override
1579
+ protected Request startOfflineRequest (CompletionHandler completionHandler ) {
1580
+ return searchForFacetValuesOffline (facetName , facetQuery , query , completionHandler );
1581
+ }
1582
+ }
1583
+
1584
+ private JSONObject _searchForFacetValuesOffline (@ NonNull String facetName , @ NonNull String text , @ Nullable Query query ) throws AlgoliaException {
1585
+ try {
1586
+ Response searchResults = getLocalIndex ().searchForFacetValues (facetName , text , query != null ? query .build () : null );
1587
+ if (searchResults .getStatusCode () == 200 ) {
1588
+ String jsonString = new String (searchResults .getData (), "UTF-8" );
1589
+ return new JSONObject (jsonString ); // NOTE: Origin tagging performed by the SDK
1590
+ }
1591
+ else {
1592
+ throw new AlgoliaException (searchResults .getErrorMessage (), searchResults .getStatusCode ());
1593
+ }
1594
+ }
1595
+ catch (JSONException | UnsupportedEncodingException e ) {
1596
+ throw new AlgoliaException ("Search failed" , e );
1597
+ }
1598
+ }
1599
+
1507
1600
// ----------------------------------------------------------------------
1508
1601
// Listeners
1509
1602
// ----------------------------------------------------------------------
0 commit comments