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