1 /*
2  * Copyright 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package androidx.appsearch.localstorage.stats;
18 
19 import androidx.annotation.IntDef;
20 import androidx.annotation.RestrictTo;
21 import androidx.annotation.VisibleForTesting;
22 import androidx.appsearch.annotation.CanIgnoreReturnValue;
23 import androidx.appsearch.app.AppSearchResult;
24 import androidx.appsearch.stats.BaseStats;
25 import androidx.collection.ArraySet;
26 
27 import org.jspecify.annotations.NonNull;
28 import org.jspecify.annotations.Nullable;
29 
30 import java.lang.annotation.Retention;
31 import java.lang.annotation.RetentionPolicy;
32 import java.util.Arrays;
33 import java.util.Set;
34 
35 /**
36  * A class for setting basic information to log for all function calls.
37  *
38  * <p>This class can set which stats to log for both batch and non-batch
39  * {@link androidx.appsearch.app.AppSearchSession} calls.
40  *
41  * <p>Some function calls may have their own detailed stats class like {@link PutDocumentStats}.
42  * However, {@link CallStats} can still be used along with the detailed stats class for easy
43  * aggregation/analysis with other function calls.
44  *
45  * <!--@exportToFramework:hide-->
46  */
47 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
48 public class CallStats extends BaseStats {
49     /** Call types. */
50     @IntDef(value = {
51             CALL_TYPE_UNKNOWN,
52             CALL_TYPE_INITIALIZE,
53             CALL_TYPE_SET_SCHEMA,
54             CALL_TYPE_PUT_DOCUMENTS,
55             CALL_TYPE_GET_DOCUMENTS,
56             CALL_TYPE_REMOVE_DOCUMENTS_BY_ID,
57             CALL_TYPE_PUT_DOCUMENT,
58             CALL_TYPE_GET_DOCUMENT,
59             CALL_TYPE_REMOVE_DOCUMENT_BY_ID,
60             CALL_TYPE_SEARCH,
61             CALL_TYPE_OPTIMIZE,
62             CALL_TYPE_FLUSH,
63             CALL_TYPE_GLOBAL_SEARCH,
64             CALL_TYPE_REMOVE_DOCUMENTS_BY_SEARCH,
65             CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH,
66             CALL_TYPE_GLOBAL_GET_DOCUMENT_BY_ID,
67             CALL_TYPE_SCHEMA_MIGRATION,
68             CALL_TYPE_GLOBAL_GET_SCHEMA,
69             CALL_TYPE_GET_SCHEMA,
70             CALL_TYPE_GET_NAMESPACES,
71             CALL_TYPE_GET_NEXT_PAGE,
72             CALL_TYPE_INVALIDATE_NEXT_PAGE_TOKEN,
73             CALL_TYPE_WRITE_SEARCH_RESULTS_TO_FILE,
74             CALL_TYPE_PUT_DOCUMENTS_FROM_FILE,
75             CALL_TYPE_SEARCH_SUGGESTION,
76             CALL_TYPE_REPORT_SYSTEM_USAGE,
77             CALL_TYPE_REPORT_USAGE,
78             CALL_TYPE_GET_STORAGE_INFO,
79             CALL_TYPE_REGISTER_OBSERVER_CALLBACK,
80             CALL_TYPE_UNREGISTER_OBSERVER_CALLBACK,
81             CALL_TYPE_GLOBAL_GET_NEXT_PAGE,
82             CALL_TYPE_EXECUTE_APP_FUNCTION,
83             CALL_TYPE_OPEN_WRITE_BLOB,
84             CALL_TYPE_COMMIT_BLOB,
85             CALL_TYPE_OPEN_READ_BLOB,
86             CALL_TYPE_GLOBAL_OPEN_READ_BLOB,
87             CALL_TYPE_REMOVE_BLOB,
88             CALL_TYPE_SET_BLOB_VISIBILITY
89     })
90     @Retention(RetentionPolicy.SOURCE)
91     public @interface CallType {
92     }
93 
94     public static final int CALL_TYPE_UNKNOWN = 0;
95     public static final int CALL_TYPE_INITIALIZE = 1;
96     public static final int CALL_TYPE_SET_SCHEMA = 2;
97     public static final int CALL_TYPE_PUT_DOCUMENTS = 3;
98     public static final int CALL_TYPE_GET_DOCUMENTS = 4;
99     public static final int CALL_TYPE_REMOVE_DOCUMENTS_BY_ID = 5;
100     public static final int CALL_TYPE_PUT_DOCUMENT = 6;
101     public static final int CALL_TYPE_GET_DOCUMENT = 7;
102     public static final int CALL_TYPE_REMOVE_DOCUMENT_BY_ID = 8;
103     public static final int CALL_TYPE_SEARCH = 9;
104     public static final int CALL_TYPE_OPTIMIZE = 10;
105     public static final int CALL_TYPE_FLUSH = 11;
106     public static final int CALL_TYPE_GLOBAL_SEARCH = 12;
107     public static final int CALL_TYPE_REMOVE_DOCUMENTS_BY_SEARCH = 13;
108     public static final int CALL_TYPE_REMOVE_DOCUMENT_BY_SEARCH = 14;
109     public static final int CALL_TYPE_GLOBAL_GET_DOCUMENT_BY_ID = 15;
110     public static final int CALL_TYPE_SCHEMA_MIGRATION = 16;
111     public static final int CALL_TYPE_GLOBAL_GET_SCHEMA = 17;
112     public static final int CALL_TYPE_GET_SCHEMA = 18;
113     public static final int CALL_TYPE_GET_NAMESPACES = 19;
114     public static final int CALL_TYPE_GET_NEXT_PAGE = 20;
115     public static final int CALL_TYPE_INVALIDATE_NEXT_PAGE_TOKEN = 21;
116     public static final int CALL_TYPE_WRITE_SEARCH_RESULTS_TO_FILE = 22;
117     public static final int CALL_TYPE_PUT_DOCUMENTS_FROM_FILE = 23;
118     public static final int CALL_TYPE_SEARCH_SUGGESTION = 24;
119     public static final int CALL_TYPE_REPORT_SYSTEM_USAGE = 25;
120     public static final int CALL_TYPE_REPORT_USAGE = 26;
121     public static final int CALL_TYPE_GET_STORAGE_INFO = 27;
122     public static final int CALL_TYPE_REGISTER_OBSERVER_CALLBACK = 28;
123     public static final int CALL_TYPE_UNREGISTER_OBSERVER_CALLBACK = 29;
124     public static final int CALL_TYPE_GLOBAL_GET_NEXT_PAGE = 30;
125     public static final int CALL_TYPE_EXECUTE_APP_FUNCTION = 31;
126     public static final int CALL_TYPE_OPEN_WRITE_BLOB = 32;
127     public static final int CALL_TYPE_COMMIT_BLOB = 33;
128     public static final int CALL_TYPE_OPEN_READ_BLOB = 34;
129     public static final int CALL_TYPE_GLOBAL_OPEN_READ_BLOB = 35;
130     public static final int CALL_TYPE_REMOVE_BLOB = 36;
131     public static final int CALL_TYPE_SET_BLOB_VISIBILITY = 37;
132 
133     // These strings are for the subset of call types that correspond to an AppSearchManager API
134     private static final String CALL_TYPE_STRING_INITIALIZE = "initialize";
135     private static final String CALL_TYPE_STRING_SET_SCHEMA = "localSetSchema";
136     private static final String CALL_TYPE_STRING_PUT_DOCUMENTS = "localPutDocuments";
137     private static final String CALL_TYPE_STRING_GET_DOCUMENTS = "localGetDocuments";
138     private static final String CALL_TYPE_STRING_REMOVE_DOCUMENTS_BY_ID = "localRemoveByDocumentId";
139     private static final String CALL_TYPE_STRING_SEARCH = "localSearch";
140     private static final String CALL_TYPE_STRING_FLUSH = "flush";
141     private static final String CALL_TYPE_STRING_GLOBAL_SEARCH = "globalSearch";
142     private static final String CALL_TYPE_STRING_REMOVE_DOCUMENTS_BY_SEARCH = "localRemoveBySearch";
143     private static final String CALL_TYPE_STRING_GLOBAL_GET_DOCUMENT_BY_ID = "globalGetDocuments";
144     private static final String CALL_TYPE_STRING_GLOBAL_GET_SCHEMA = "globalGetSchema";
145     private static final String CALL_TYPE_STRING_GET_SCHEMA = "localGetSchema";
146     private static final String CALL_TYPE_STRING_GET_NAMESPACES = "localGetNamespaces";
147     private static final String CALL_TYPE_STRING_GET_NEXT_PAGE = "localGetNextPage";
148     private static final String CALL_TYPE_STRING_INVALIDATE_NEXT_PAGE_TOKEN =
149             "invalidateNextPageToken";
150     private static final String CALL_TYPE_STRING_WRITE_SEARCH_RESULTS_TO_FILE =
151             "localWriteSearchResultsToFile";
152     private static final String CALL_TYPE_STRING_PUT_DOCUMENTS_FROM_FILE =
153             "localPutDocumentsFromFile";
154     private static final String CALL_TYPE_STRING_SEARCH_SUGGESTION = "localSearchSuggestion";
155     private static final String CALL_TYPE_STRING_REPORT_SYSTEM_USAGE = "globalReportUsage";
156     private static final String CALL_TYPE_STRING_REPORT_USAGE = "localReportUsage";
157     private static final String CALL_TYPE_STRING_GET_STORAGE_INFO = "localGetStorageInfo";
158     private static final String CALL_TYPE_STRING_REGISTER_OBSERVER_CALLBACK =
159             "globalRegisterObserverCallback";
160     private static final String CALL_TYPE_STRING_UNREGISTER_OBSERVER_CALLBACK =
161             "globalUnregisterObserverCallback";
162     private static final String CALL_TYPE_STRING_GLOBAL_GET_NEXT_PAGE = "globalGetNextPage";
163     private static final String CALL_TYPE_STRING_EXECUTE_APP_FUNCTION = "executeAppFunction";
164     private static final String CALL_TYPE_STRING_OPEN_WRITE_BLOB = "openWriteBlob";
165     private static final String CALL_TYPE_STRING_COMMIT_BLOB = "commitBlob";
166     private static final String CALL_TYPE_STRING_OPEN_READ_BLOB = "openReadBlob";
167     private static final String CALL_TYPE_STRING_GLOBAL_OPEN_READ_BLOB = "globalOpenReadBlob";
168     private static final String CALL_TYPE_STRING_REMOVE_BLOB = "removeBlob";
169     private static final String CALL_TYPE_STRING_SET_BLOB_VISIBILITY = "setBlobVisibility";
170 
171     private final @Nullable String mPackageName;
172     private final @Nullable String mDatabase;
173     /**
174      * The status code returned by {@link AppSearchResult#getResultCode()} for the call or
175      * internal state.
176      */
177     @AppSearchResult.ResultCode
178     private final int mStatusCode;
179     private final int mTotalLatencyMillis;
180 
181     @CallType
182     private final int mCallType;
183     private final int mEstimatedBinderLatencyMillis;
184     private final int mNumOperationsSucceeded;
185     private final int mNumOperationsFailed;
186 
CallStats(@onNull Builder builder)187     CallStats(@NonNull Builder builder) {
188         super(builder);
189         mPackageName = builder.mPackageName;
190         mDatabase = builder.mDatabase;
191         mStatusCode = builder.mStatusCode;
192         mTotalLatencyMillis = builder.mTotalLatencyMillis;
193         mCallType = builder.mCallType;
194         mEstimatedBinderLatencyMillis = builder.mEstimatedBinderLatencyMillis;
195         mNumOperationsSucceeded = builder.mNumOperationsSucceeded;
196         mNumOperationsFailed = builder.mNumOperationsFailed;
197     }
198 
199     /** Returns calling package name. */
getPackageName()200     public @Nullable String getPackageName() {
201         return mPackageName;
202     }
203 
204     /** Returns calling database name. */
getDatabase()205     public @Nullable String getDatabase() {
206         return mDatabase;
207     }
208 
209     /** Returns status code for this api call. */
210     @AppSearchResult.ResultCode
getStatusCode()211     public int getStatusCode() {
212         return mStatusCode;
213     }
214 
215     /** Returns total latency of this api call in millis. */
getTotalLatencyMillis()216     public int getTotalLatencyMillis() {
217         return mTotalLatencyMillis;
218     }
219 
220     /** Returns type of the call. */
221     @CallType
getCallType()222     public int getCallType() {
223         return mCallType;
224     }
225 
226     /** Returns estimated binder latency, in milliseconds */
getEstimatedBinderLatencyMillis()227     public int getEstimatedBinderLatencyMillis() {
228         return mEstimatedBinderLatencyMillis;
229     }
230 
231     /**
232      * Returns number of operations succeeded.
233      *
234      * <p>For example, for
235      * {@link androidx.appsearch.app.AppSearchSession#putAsync}, it is the total number of
236      * individual successful put operations. In this case, how many documents are successfully
237      * indexed.
238      *
239      * <p>For non-batch calls such as
240      * {@link androidx.appsearch.app.AppSearchSession#setSchemaAsync}, the sum of
241      * {@link CallStats#getNumOperationsSucceeded()} and
242      * {@link CallStats#getNumOperationsFailed()} is always 1 since there is only one
243      * operation.
244      */
getNumOperationsSucceeded()245     public int getNumOperationsSucceeded() {
246         return mNumOperationsSucceeded;
247     }
248 
249     /**
250      * Returns number of operations failed.
251      *
252      * <p>For example, for
253      * {@link androidx.appsearch.app.AppSearchSession#putAsync}, it is the total number of
254      * individual failed put operations. In this case, how many documents are failed to be indexed.
255      *
256      * <p>For non-batch calls such as
257      * {@link androidx.appsearch.app.AppSearchSession#setSchemaAsync}, the sum of
258      * {@link CallStats#getNumOperationsSucceeded()} and
259      * {@link CallStats#getNumOperationsFailed()} is always 1 since there is only one
260      * operation.
261      */
getNumOperationsFailed()262     public int getNumOperationsFailed() {
263         return mNumOperationsFailed;
264     }
265 
266     /** Builder for {@link CallStats}. */
267     public static class Builder extends BaseStats.Builder<CallStats.Builder> {
268         @Nullable String mPackageName;
269         @Nullable String mDatabase;
270         @AppSearchResult.ResultCode
271         int mStatusCode;
272         int mTotalLatencyMillis;
273         @CallType
274         int mCallType;
275         int mEstimatedBinderLatencyMillis;
276         int mNumOperationsSucceeded;
277         int mNumOperationsFailed;
278 
279         /** Sets the PackageName used by the session. */
280         @CanIgnoreReturnValue
setPackageName(@ullable String packageName)281         public @NonNull Builder setPackageName(@Nullable String packageName) {
282             mPackageName = packageName;
283             return this;
284         }
285 
286         /** Sets the database used by the session. */
287         @CanIgnoreReturnValue
setDatabase(@ullable String database)288         public @NonNull Builder setDatabase(@Nullable String database) {
289             mDatabase = database;
290             return this;
291         }
292 
293         /** Sets the status code. */
294         @CanIgnoreReturnValue
setStatusCode(@ppSearchResult.ResultCode int statusCode)295         public @NonNull Builder setStatusCode(@AppSearchResult.ResultCode int statusCode) {
296             mStatusCode = statusCode;
297             return this;
298         }
299 
300         /** Sets total latency in millis. */
301         @CanIgnoreReturnValue
setTotalLatencyMillis(int totalLatencyMillis)302         public @NonNull Builder setTotalLatencyMillis(int totalLatencyMillis) {
303             mTotalLatencyMillis = totalLatencyMillis;
304             return this;
305         }
306 
307         /** Sets type of the call. */
308         @CanIgnoreReturnValue
setCallType(@allType int callType)309         public @NonNull Builder setCallType(@CallType int callType) {
310             mCallType = callType;
311             return this;
312         }
313 
314         /** Sets estimated binder latency, in milliseconds. */
315         @CanIgnoreReturnValue
setEstimatedBinderLatencyMillis(int estimatedBinderLatencyMillis)316         public @NonNull Builder setEstimatedBinderLatencyMillis(int estimatedBinderLatencyMillis) {
317             mEstimatedBinderLatencyMillis = estimatedBinderLatencyMillis;
318             return this;
319         }
320 
321         /**
322          * Sets number of operations succeeded.
323          *
324          * <p>For example, for
325          * {@link androidx.appsearch.app.AppSearchSession#putAsync}, it is the total number of
326          * individual successful put operations. In this case, how many documents are
327          * successfully indexed.
328          *
329          * <p>For non-batch calls such as
330          * {@link androidx.appsearch.app.AppSearchSession#setSchemaAsync}, the sum of
331          * {@link CallStats#getNumOperationsSucceeded()} and
332          * {@link CallStats#getNumOperationsFailed()} is always 1 since there is only one
333          * operation.
334          */
335         @CanIgnoreReturnValue
setNumOperationsSucceeded(int numOperationsSucceeded)336         public @NonNull Builder setNumOperationsSucceeded(int numOperationsSucceeded) {
337             mNumOperationsSucceeded = numOperationsSucceeded;
338             return this;
339         }
340 
341         /**
342          * Sets number of operations failed.
343          *
344          * <p>For example, for {@link androidx.appsearch.app.AppSearchSession#putAsync}, it is the
345          * total number of individual failed put operations. In this case, how many documents
346          * are failed to be indexed.
347          *
348          * <p>For non-batch calls such as
349          * {@link androidx.appsearch.app.AppSearchSession#setSchemaAsync}, the sum of
350          * {@link CallStats#getNumOperationsSucceeded()} and
351          * {@link CallStats#getNumOperationsFailed()} is always 1 since there is only one
352          * operation.
353          */
354         @CanIgnoreReturnValue
setNumOperationsFailed(int numOperationsFailed)355         public @NonNull Builder setNumOperationsFailed(int numOperationsFailed) {
356             mNumOperationsFailed = numOperationsFailed;
357             return this;
358         }
359 
360         /** Creates {@link CallStats} object from {@link Builder} instance. */
361         @Override
build()362         public @NonNull CallStats build() {
363             return new CallStats(/* builder= */ this);
364         }
365     }
366 
367     /**
368      * Returns the {@link CallStats.CallType} represented by the given AppSearchManager API name. If
369      * an unknown name is provided, {@link CallStats.CallType#CALL_TYPE_UNKNOWN} is returned.
370      */
371     @CallType
getApiCallTypeFromName(@onNull String name)372     public static int getApiCallTypeFromName(@NonNull String name) {
373         switch (name) {
374             case CALL_TYPE_STRING_INITIALIZE:
375                 return CALL_TYPE_INITIALIZE;
376             case CALL_TYPE_STRING_SET_SCHEMA:
377                 return CALL_TYPE_SET_SCHEMA;
378             case CALL_TYPE_STRING_PUT_DOCUMENTS:
379                 return CALL_TYPE_PUT_DOCUMENTS;
380             case CALL_TYPE_STRING_GET_DOCUMENTS:
381                 return CALL_TYPE_GET_DOCUMENTS;
382             case CALL_TYPE_STRING_REMOVE_DOCUMENTS_BY_ID:
383                 return CALL_TYPE_REMOVE_DOCUMENTS_BY_ID;
384             case CALL_TYPE_STRING_SEARCH:
385                 return CALL_TYPE_SEARCH;
386             case CALL_TYPE_STRING_FLUSH:
387                 return CALL_TYPE_FLUSH;
388             case CALL_TYPE_STRING_GLOBAL_SEARCH:
389                 return CALL_TYPE_GLOBAL_SEARCH;
390             case CALL_TYPE_STRING_REMOVE_DOCUMENTS_BY_SEARCH:
391                 return CALL_TYPE_REMOVE_DOCUMENTS_BY_SEARCH;
392             case CALL_TYPE_STRING_GLOBAL_GET_DOCUMENT_BY_ID:
393                 return CALL_TYPE_GLOBAL_GET_DOCUMENT_BY_ID;
394             case CALL_TYPE_STRING_GLOBAL_GET_SCHEMA:
395                 return CALL_TYPE_GLOBAL_GET_SCHEMA;
396             case CALL_TYPE_STRING_GET_SCHEMA:
397                 return CALL_TYPE_GET_SCHEMA;
398             case CALL_TYPE_STRING_GET_NAMESPACES:
399                 return CALL_TYPE_GET_NAMESPACES;
400             case CALL_TYPE_STRING_GET_NEXT_PAGE:
401                 return CALL_TYPE_GET_NEXT_PAGE;
402             case CALL_TYPE_STRING_INVALIDATE_NEXT_PAGE_TOKEN:
403                 return CALL_TYPE_INVALIDATE_NEXT_PAGE_TOKEN;
404             case CALL_TYPE_STRING_WRITE_SEARCH_RESULTS_TO_FILE:
405                 return CALL_TYPE_WRITE_SEARCH_RESULTS_TO_FILE;
406             case CALL_TYPE_STRING_PUT_DOCUMENTS_FROM_FILE:
407                 return CALL_TYPE_PUT_DOCUMENTS_FROM_FILE;
408             case CALL_TYPE_STRING_SEARCH_SUGGESTION:
409                 return CALL_TYPE_SEARCH_SUGGESTION;
410             case CALL_TYPE_STRING_REPORT_SYSTEM_USAGE:
411                 return CALL_TYPE_REPORT_SYSTEM_USAGE;
412             case CALL_TYPE_STRING_REPORT_USAGE:
413                 return CALL_TYPE_REPORT_USAGE;
414             case CALL_TYPE_STRING_GET_STORAGE_INFO:
415                 return CALL_TYPE_GET_STORAGE_INFO;
416             case CALL_TYPE_STRING_REGISTER_OBSERVER_CALLBACK:
417                 return CALL_TYPE_REGISTER_OBSERVER_CALLBACK;
418             case CALL_TYPE_STRING_UNREGISTER_OBSERVER_CALLBACK:
419                 return CALL_TYPE_UNREGISTER_OBSERVER_CALLBACK;
420             case CALL_TYPE_STRING_GLOBAL_GET_NEXT_PAGE:
421                 return CALL_TYPE_GLOBAL_GET_NEXT_PAGE;
422             case CALL_TYPE_STRING_EXECUTE_APP_FUNCTION:
423                 return CALL_TYPE_EXECUTE_APP_FUNCTION;
424             case CALL_TYPE_STRING_OPEN_WRITE_BLOB:
425                 return CALL_TYPE_OPEN_WRITE_BLOB;
426             case CALL_TYPE_STRING_COMMIT_BLOB:
427                 return CALL_TYPE_COMMIT_BLOB;
428             case CALL_TYPE_STRING_OPEN_READ_BLOB:
429                 return CALL_TYPE_OPEN_READ_BLOB;
430             case CALL_TYPE_STRING_GLOBAL_OPEN_READ_BLOB:
431                 return CALL_TYPE_GLOBAL_OPEN_READ_BLOB;
432             case CALL_TYPE_STRING_REMOVE_BLOB:
433                 return CALL_TYPE_REMOVE_BLOB;
434             case CALL_TYPE_STRING_SET_BLOB_VISIBILITY:
435                 return CALL_TYPE_SET_BLOB_VISIBILITY;
436             default:
437                 return CALL_TYPE_UNKNOWN;
438         }
439     }
440 
441     /**
442      * Returns the set of all {@link CallStats.CallType} that map to an AppSearchManager API.
443      */
444     @VisibleForTesting
getAllApiCallTypes()445     public static @NonNull Set<Integer> getAllApiCallTypes() {
446         return new ArraySet<>(Arrays.asList(
447                 CALL_TYPE_INITIALIZE,
448                 CALL_TYPE_SET_SCHEMA,
449                 CALL_TYPE_PUT_DOCUMENTS,
450                 CALL_TYPE_GET_DOCUMENTS,
451                 CALL_TYPE_REMOVE_DOCUMENTS_BY_ID,
452                 CALL_TYPE_SEARCH,
453                 CALL_TYPE_FLUSH,
454                 CALL_TYPE_GLOBAL_SEARCH,
455                 CALL_TYPE_REMOVE_DOCUMENTS_BY_SEARCH,
456                 CALL_TYPE_GLOBAL_GET_DOCUMENT_BY_ID,
457                 CALL_TYPE_GLOBAL_GET_SCHEMA,
458                 CALL_TYPE_GET_SCHEMA,
459                 CALL_TYPE_GET_NAMESPACES,
460                 CALL_TYPE_GET_NEXT_PAGE,
461                 CALL_TYPE_INVALIDATE_NEXT_PAGE_TOKEN,
462                 CALL_TYPE_WRITE_SEARCH_RESULTS_TO_FILE,
463                 CALL_TYPE_PUT_DOCUMENTS_FROM_FILE,
464                 CALL_TYPE_SEARCH_SUGGESTION,
465                 CALL_TYPE_REPORT_SYSTEM_USAGE,
466                 CALL_TYPE_REPORT_USAGE,
467                 CALL_TYPE_GET_STORAGE_INFO,
468                 CALL_TYPE_REGISTER_OBSERVER_CALLBACK,
469                 CALL_TYPE_UNREGISTER_OBSERVER_CALLBACK,
470                 CALL_TYPE_GLOBAL_GET_NEXT_PAGE,
471                 CALL_TYPE_EXECUTE_APP_FUNCTION,
472                 CALL_TYPE_OPEN_WRITE_BLOB,
473                 CALL_TYPE_COMMIT_BLOB,
474                 CALL_TYPE_OPEN_READ_BLOB,
475                 CALL_TYPE_GLOBAL_OPEN_READ_BLOB,
476                 CALL_TYPE_REMOVE_BLOB,
477                 CALL_TYPE_SET_BLOB_VISIBILITY));
478     }
479 }
480