algoliasearch/src/offline/java/com/algolia/search/saas/MirroredIndex.java
private void _sync()
    {
        if (!mirrored)
            throw new IllegalArgumentException("Mirroring not activated on this index");

        // Reset statistics.
        stats = new SyncStats();
        long startTime = System.currentTimeMillis();

        // Notify listeners.
        getClient().completionExecutor.execute(new Runnable()
        {
            @Override
            public void run()
            {
                fireSyncDidStart();
            }
        });

        try {
            // Create temporary directory.
            tmpDir = new File(getClient().getTempDir(), UUID.randomUUID().toString());
            tmpDir.mkdirs();

            // NOTE: We are doing everything sequentially, because this is a background job: we care more about
            // resource consumption than about how long it will take.

            // Fetch settings.
            {
                JSONObject settingsJSON = this.getSettings(1, /* requestOptions: */ null);
                settingsFile = new File(tmpDir, "settings.json");
                String data = settingsJSON.toString();
                Writer writer = new OutputStreamWriter(new FileOutputStream(settingsFile), "UTF-8");
                writer.write(data);
                writer.close();
            }

            // Perform data selection queries.
            objectFiles = new ArrayList<>();
            final DataSelectionQuery[] queries = mirrorSettings.getQueries();
            for (DataSelectionQuery query : queries) {
                String cursor = null;
                int retrievedObjects = 0;
                do {
                    // Make next request.
                    JSONObject objectsJSON = cursor == null ? this.browse(query.query, /* requestOptions: */ null) : this.browseFrom(cursor, /* requestOptions: */ null);

                    // Write result to file.
                    int objectFileNo = objectFiles.size();
                    File file = new File(tmpDir, String.format("%d.json", objectFileNo));
                    objectFiles.add(file);
                    String data = objectsJSON.toString();
                    Writer writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
                    writer.write(data);
                    writer.close();

                    cursor = objectsJSON.optString("cursor", null);
                    JSONArray hits = objectsJSON.optJSONArray("hits");
                    if (hits == null) {
                        // Something went wrong:
                        // Report the error, and just abort this batch and proceed with the next query.
                        Log.e(this.getClass().getName(), "No hits in result for query: " + query.query);
                        break;
                    }
                    retrievedObjects += hits.length();
                }
                while (retrievedObjects < query.maxObjects && cursor != null);

                stats.objectCount += retrievedObjects;
            }

            // Update statistics.
            long afterFetchTime = System.currentTimeMillis();
            stats.fetchTime = afterFetchTime - startTime;
            stats.fileCount = objectFiles.size();

            // Build the index.
            _buildOffline(settingsFile, objectFiles.toArray(new File[objectFiles.size()]));

            // Update statistics.
            long afterBuildTime = System.currentTimeMillis();
            stats.buildTime = afterBuildTime - afterFetchTime;
            stats.totalTime = afterBuildTime - startTime;

            // Remember the last sync date.
            mirrorSettings.setLastSyncDate(new Date());
            saveMirrorSettings();

            // Log statistics.
            Log.d(this.getClass().getName(), "Sync stats: " + stats);
        }
        catch (Exception e) {
            Log.e(this.getClass().getName(), "Sync failed", e);
            error = e;
        }
        finally {
            // Clean up.
            if (tmpDir != null) {
                FileUtils.deleteRecursive(tmpDir);
                tmpDir = null;
            }
            settingsFile = null;
            objectFiles = null;

            // Mark sync as finished.
            synchronized (this) {
                syncing = false;
            }

            // Notify listeners.
            getClient().completionExecutor.execute(new Runnable()
            {
                @Override
                public void run()
                {
                    fireSyncDidFinish();
                }
            });
        }
    }
private void _sync()
    {
        if (!mirrored)
            throw new IllegalArgumentException("Mirroring not activated on this index");

        // Reset statistics.
        stats = new SyncStats();
        long startTime = System.currentTimeMillis();

        // Notify listeners.
        getClient().completionExecutor.execute(new Runnable()
        {
            @Override
            public void run()
            {
                fireSyncDidStart();
            }
        });

        try {
            // Create temporary directory.
            tmpDir = new File(getClient().getTempDir(), UUID.randomUUID().toString());
            tmpDir.mkdirs();

            // NOTE: We are doing everything sequentially, because this is a background job: we care more about
            // resource consumption than about how long it will take.

            // Fetch settings.
            {
                JSONObject settingsJSON = this.getSettings(1, /* requestOptions: */ null);
                settingsFile = new File(tmpDir, "settings.json");
                String data = settingsJSON.toString();
                Writer writer = new OutputStreamWriter(new FileOutputStream(settingsFile), "UTF-8");
                writer.write(data);
                writer.close();
            }

            // Perform data selection queries.
            objectFiles = new ArrayList<>();
            final DataSelectionQuery[] queries = mirrorSettings.getQueries();
            for (DataSelectionQuery query : queries) {
                String cursor = null;
                int retrievedObjects = 0;
                do {
                    // Make next request.
                    JSONObject objectsJSON = cursor == null ? this.browse(query.query, /* requestOptions: */ null) : this.browseFrom(cursor, /* requestOptions: */ null);

                    // Write result to file.
                    int objectFileNo = objectFiles.size();
                    File file = new File(tmpDir, String.format("%d.json", objectFileNo));
                    objectFiles.add(file);
                    String data = objectsJSON.toString();
                    Writer writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
                    writer.write(data);
                    writer.close();

                    cursor = objectsJSON.optString("cursor", null);
                    JSONArray hits = objectsJSON.optJSONArray("hits");
                    if (hits == null) {
                        // Something went wrong:
                        // Report the error, and just abort this batch and proceed with the next query.
                        Log.e(this.getClass().getName(), "No hits in result for query: " + query.query);
                        break;
                    }
                    retrievedObjects += hits.length();
                }
                while (retrievedObjects < query.maxObjects && cursor != null);

                stats.objectCount += retrievedObjects;
            }

            // Update statistics.
            long afterFetchTime = System.currentTimeMillis();
            stats.fetchTime = afterFetchTime - startTime;
            stats.fileCount = objectFiles.size();

            // Build the index.
            _buildOffline(settingsFile, objectFiles.toArray(new File[objectFiles.size()]));

            // Update statistics.
            long afterBuildTime = System.currentTimeMillis();
            stats.buildTime = afterBuildTime - afterFetchTime;
            stats.totalTime = afterBuildTime - startTime;

            // Remember the last sync date.
            mirrorSettings.setLastSyncDate(new Date());
            saveMirrorSettings();

            // Log statistics.
            Log.d(this.getClass().getName(), "Sync stats: " + stats);
        }
        catch (Exception e) {
            Log.e(this.getClass().getName(), "Sync failed", e);
            error = e;
        }
        finally {
            // Clean up.
            if (tmpDir != null) {
                FileUtils.deleteRecursive(tmpDir);
                tmpDir = null;
            }
            settingsFile = null;
            objectFiles = null;

            // Mark sync as finished.
            synchronized (this) {
                syncing = false;
            }

            // Notify listeners.
            getClient().completionExecutor.execute(new Runnable()
            {
                @Override
                public void run()
                {
                    fireSyncDidFinish();
                }
            });
        }
    }
private void _sync ( ) { if ( ! mirrored ) throw new IllegalArgumentException ( "Mirroring not activated on this index" ) ; // Reset statistics. stats = new SyncStats ( ) ; long startTime = System . currentTimeMillis ( ) ; // Notify listeners. getClient ( ) . completionExecutor . execute ( new Runnable ( ) { @ Override public void run ( ) { fireSyncDidStart ( ) ; } } ) ; try { // Create temporary directory. tmpDir = new File ( getClient ( ) . getTempDir ( ) , UUID . randomUUID ( ) . toString ( ) ) ; tmpDir . mkdirs ( ) ; // NOTE: We are doing everything sequentially, because this is a background job: we care more about // resource consumption than about how long it will take. // Fetch settings. { JSONObject settingsJSON = this . getSettings ( 1 , /* requestOptions: */ null ) ; settingsFile = new File ( tmpDir , "settings.json" ) ; String data = settingsJSON . toString ( ) ; Writer writer = new OutputStreamWriter ( new FileOutputStream ( settingsFile ) , "UTF-8" ) ; writer . write ( data ) ; writer . close ( ) ; } // Perform data selection queries. objectFiles = new ArrayList <> ( ) ; final DataSelectionQuery [ ] queries = mirrorSettings . getQueries ( ) ; for ( DataSelectionQuery query : queries ) { String cursor = null ; int retrievedObjects = 0 ; do { // Make next request. JSONObject objectsJSON = cursor == null ? this . browse ( query . query , /* requestOptions: */ null ) : this . browseFrom ( cursor , /* requestOptions: */ null ) ; // Write result to file. int objectFileNo = objectFiles . size ( ) ; File file = new File ( tmpDir , String . format ( "%d.json" , objectFileNo ) ) ; objectFiles . add ( file ) ; String data = objectsJSON . toString ( ) ; Writer writer = new OutputStreamWriter ( new FileOutputStream ( file ) , "UTF-8" ) ; writer . write ( data ) ; writer . close ( ) ; cursor = objectsJSON . optString ( "cursor" , null ) ; JSONArray hits = objectsJSON . optJSONArray ( "hits" ) ; if ( hits == null ) { // Something went wrong: // Report the error, and just abort this batch and proceed with the next query. Log . e ( this . getClass ( ) . getName ( ) , "No hits in result for query: " + query . query ) ; break ; } retrievedObjects += hits . length ( ) ; } while ( retrievedObjects < query . maxObjects && cursor != null ) ; stats . objectCount += retrievedObjects ; } // Update statistics. long afterFetchTime = System . currentTimeMillis ( ) ; stats . fetchTime = afterFetchTime - startTime ; stats . fileCount = objectFiles . size ( ) ; // Build the index. _buildOffline ( settingsFile , objectFiles . toArray ( new File [ objectFiles . size ( ) ] ) ) ; // Update statistics. long afterBuildTime = System . currentTimeMillis ( ) ; stats . buildTime = afterBuildTime - afterFetchTime ; stats . totalTime = afterBuildTime - startTime ; // Remember the last sync date. mirrorSettings . setLastSyncDate ( new Date ( ) ) ; saveMirrorSettings ( ) ; // Log statistics. Log . d ( this . getClass ( ) . getName ( ) , "Sync stats: " + stats ) ; } catch ( Exception e ) { Log . e ( this . getClass ( ) . getName ( ) , "Sync failed" , e ) ; error = e ; } finally { // Clean up. if ( tmpDir != null ) { FileUtils . deleteRecursive ( tmpDir ) ; tmpDir = null ; } settingsFile = null ; objectFiles = null ; // Mark sync as finished. synchronized ( this ) { syncing = false ; } // Notify listeners. getClient ( ) . completionExecutor . execute ( new Runnable ( ) { @ Override public void run ( ) { fireSyncDidFinish ( ) ; } } ) ; } }
Refresh the local mirror.
WARNING: Should be called from a background thread.
Refresh the local mirror . WARNING : Should be called from a background thread .