private void sendRequest(long objectId, long requestId, Request r) throws IOException { DataOutputStream out = newFlusher(); out.writeByte(REQUEST); out.writeLong(objectId); out.writeLong(requestId); r.serialize(out); out.writeBoolean(false); out.flush(); }
// Saves traffic from file private synchronized void save() throws IOException, RecordStoreException { // Open record store Storage traffic = new Storage("traffic"); traffic.open(true); // Add empty records if necessary traffic.initRecords(2); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); // Add traffic amount and savedSince to record store dos.writeInt(allInTraffic + sessionInTraffic); dos.writeInt(allOutTraffic + sessionOutTraffic); dos.writeLong(savedSince.getTime()); dos.writeLong(lastTimeUsed.getTime()); generateCostSum(0, 0, false); dos.writeInt(savedCost); traffic.setRecord(2, baos.toByteArray()); traffic.close(); }
/** * Connect to searchd server and update given attributes on given documents in given indexes. * Sample code that will set group_id=123 where id=1 and group_id=456 where id=3: * * <pre> * String[] attrs = new String[1]; * * attrs[0] = "group_id"; * long[][] values = new long[2][2]; * * values[0] = new long[2]; values[0][0] = 1; values[0][1] = 123; * values[1] = new long[2]; values[1][0] = 3; values[1][1] = 456; * * int res = cl.UpdateAttributes ( "test1", attrs, values ); * </pre> * * @param index index name(s) to update; might be distributed * @param attrs array with the names of the attributes to update * @param values array of updates; each long[] entry must contains document ID in the first * element, and all new attribute values in the following ones * @param ignorenonexistent the flag whether to silently ignore non existent columns up update * request * @return -1 on failure, amount of actually found and updated documents (might be 0) on success * @throws SphinxException on invalid parameters */ public int UpdateAttributes( String index, String[] attrs, long[][] values, boolean ignorenonexistent) throws SphinxException { /* check args */ myAssert(index != null && index.length() > 0, "no index name provided"); myAssert(attrs != null && attrs.length > 0, "no attribute names provided"); myAssert(values != null && values.length > 0, "no update entries provided"); for (int i = 0; i < values.length; i++) { myAssert(values[i] != null, "update entry #" + i + " is null"); myAssert(values[i].length == 1 + attrs.length, "update entry #" + i + " has wrong length"); } /* build and send request */ ByteArrayOutputStream reqBuf = new ByteArrayOutputStream(); DataOutputStream req = new DataOutputStream(reqBuf); try { writeNetUTF8(req, index); req.writeInt(attrs.length); req.writeInt(ignorenonexistent ? 1 : 0); for (int i = 0; i < attrs.length; i++) { writeNetUTF8(req, attrs[i]); req.writeInt(0); // not MVA attr } req.writeInt(values.length); for (int i = 0; i < values.length; i++) { req.writeLong(values[i][0]); /* send docid as 64bit value */ for (int j = 1; j < values[i].length; j++) req.writeInt( (int) values[i][ j]); /* send values as 32bit values; FIXME! what happens when they are over 2^31? */ } req.flush(); } catch (Exception e) { _error = "internal error: failed to build request: " + e; return -1; } /* get and parse response */ DataInputStream in = _DoRequest(SEARCHD_COMMAND_UPDATE, VER_COMMAND_UPDATE, reqBuf); if (in == null) return -1; try { return in.readInt(); } catch (Exception e) { _error = "incomplete reply"; return -1; } }
/** * Set integer range filter. Only match records if attribute value is beetwen min and max * (inclusive). */ public void SetFilterRange(String attribute, long min, long max, boolean exclude) throws SphinxException { myAssert(min <= max, "min must be less or equal to max"); try { writeNetUTF8(_filters, attribute); _filters.writeInt(SPH_FILTER_RANGE); _filters.writeLong(min); _filters.writeLong(max); _filters.writeInt(exclude ? 1 : 0); } catch (Exception e) { myAssert(false, "IOException: " + e.getMessage()); } _filterCount++; }
/** Set values filter. Only match records where attribute value is in given set. */ public void SetFilter(String attribute, long[] values, boolean exclude) throws SphinxException { myAssert(values != null && values.length > 0, "values array must not be null or empty"); myAssert( attribute != null && attribute.length() > 0, "attribute name must not be null or empty"); try { writeNetUTF8(_filters, attribute); _filters.writeInt(SPH_FILTER_VALUES); _filters.writeInt(values.length); for (int i = 0; i < values.length; i++) _filters.writeLong(values[i]); _filters.writeInt(exclude ? 1 : 0); } catch (Exception e) { myAssert(false, "IOException: " + e.getMessage()); } _filterCount++; }
private void sendResponse(long requestId, Object value, Class<?> declaredType) throws IOException { DataOutputStream out = newFlusher(); out.writeByte(RESPONSE); out.writeLong(requestId); if (value == null) { out.writeBoolean(false); } else { out.writeBoolean(true); Class<?> clazz = value.getClass(); out.writeUTF(clazz.getName()); Serializer<Object> s = serializerFor(clazz, declaredType); s.serialize(out, value); } out.writeBoolean(false); out.flush(); }
@SuppressWarnings("rawtypes") private static void writeObjectToStream(Object obj, DataOutputStream data) throws IOException { Class objClass = obj.getClass(); if (objClass.equals(Boolean.class)) { data.writeBoolean((Boolean) obj); } else if (objClass.equals(Byte.class)) { data.writeByte((Byte) obj); } else if (objClass.equals(Integer.class)) { data.writeInt((Integer) obj); } else if (objClass.equals(String.class)) { data.writeUTF((String) obj); } else if (objClass.equals(Double.class)) { data.writeDouble((Double) obj); } else if (objClass.equals(Float.class)) { data.writeFloat((Float) obj); } else if (objClass.equals(Long.class)) { data.writeLong((Long) obj); } else if (objClass.equals(Short.class)) { data.writeShort((Short) obj); } }
/** Add new query with current settings to current search request. */ public int AddQuery(String query, String index, String comment) throws SphinxException { ByteArrayOutputStream req = new ByteArrayOutputStream(); /* build request */ try { DataOutputStream out = new DataOutputStream(req); out.writeInt(_offset); out.writeInt(_limit); out.writeInt(_mode); out.writeInt(_ranker); if (_ranker == SPH_RANK_EXPR) { writeNetUTF8(out, _rankexpr); } out.writeInt(_sort); writeNetUTF8(out, _sortby); writeNetUTF8(out, query); int weightLen = _weights != null ? _weights.length : 0; out.writeInt(weightLen); if (_weights != null) { for (int i = 0; i < _weights.length; i++) out.writeInt(_weights[i]); } writeNetUTF8(out, index); out.writeInt(0); out.writeInt(_minId); out.writeInt(_maxId); /* filters */ out.writeInt(_filterCount); out.write(_rawFilters.toByteArray()); /* group-by, max matches, sort-by-group flag */ out.writeInt(_groupFunc); writeNetUTF8(out, _groupBy); out.writeInt(_maxMatches); writeNetUTF8(out, _groupSort); out.writeInt(_cutoff); out.writeInt(_retrycount); out.writeInt(_retrydelay); writeNetUTF8(out, _groupDistinct); /* anchor point */ if (_latitudeAttr == null || _latitudeAttr.length() == 0 || _longitudeAttr == null || _longitudeAttr.length() == 0) { out.writeInt(0); } else { out.writeInt(1); writeNetUTF8(out, _latitudeAttr); writeNetUTF8(out, _longitudeAttr); out.writeFloat(_latitude); out.writeFloat(_longitude); } /* per-index weights */ out.writeInt(_indexWeights.size()); for (Iterator e = _indexWeights.keySet().iterator(); e.hasNext(); ) { String indexName = (String) e.next(); Integer weight = (Integer) _indexWeights.get(indexName); writeNetUTF8(out, indexName); out.writeInt(weight.intValue()); } /* max query time */ out.writeInt(_maxQueryTime); /* per-field weights */ out.writeInt(_fieldWeights.size()); for (Iterator e = _fieldWeights.keySet().iterator(); e.hasNext(); ) { String field = (String) e.next(); Integer weight = (Integer) _fieldWeights.get(field); writeNetUTF8(out, field); out.writeInt(weight.intValue()); } /* comment */ writeNetUTF8(out, comment); /* overrides */ out.writeInt(_overrideTypes.size()); for (Iterator e = _overrideTypes.keySet().iterator(); e.hasNext(); ) { String attr = (String) e.next(); Integer type = (Integer) _overrideTypes.get(attr); Map values = (Map) _overrideValues.get(attr); writeNetUTF8(out, attr); out.writeInt(type.intValue()); out.writeInt(values.size()); for (Iterator e2 = values.keySet().iterator(); e2.hasNext(); ) { Long id = (Long) e2.next(); out.writeLong(id.longValue()); switch (type.intValue()) { case SPH_ATTR_FLOAT: out.writeFloat(((Float) values.get(id)).floatValue()); break; case SPH_ATTR_BIGINT: out.writeLong(((Long) values.get(id)).longValue()); break; default: out.writeInt(((Integer) values.get(id)).intValue()); break; } } } /* select-list */ writeNetUTF8(out, _select); /* done! */ out.flush(); int qIndex = _reqs.size(); _reqs.add(qIndex, req.toByteArray()); return qIndex; } catch (Exception e) { myAssert(false, "error in AddQuery(): " + e + ": " + e.getMessage()); } finally { try { _filters.close(); _rawFilters.close(); } catch (IOException e) { myAssert(false, "error in AddQuery(): " + e + ": " + e.getMessage()); } } return -1; }
public void writeBytes(OutputStream os) throws IOException { // Map between any modified UTF-8 and it's constant pool index. Map utf8ToIndex = new HashMap(); DataOutputStream dos = new DataOutputStream(os); TypeArray tags = getTags(); int len = (int) getLength(); int ci = 0; // constant pool index // collect all modified UTF-8 Strings from Constant Pool for (ci = 1; ci < len; ci++) { byte cpConstType = tags.getByteAt(ci); if (cpConstType == JVM_CONSTANT_Utf8) { Symbol sym = getSymbolAt(ci); utf8ToIndex.put(sym.asString(), new Short((short) ci)); } else if (cpConstType == JVM_CONSTANT_Long || cpConstType == JVM_CONSTANT_Double) { ci++; } } for (ci = 1; ci < len; ci++) { int cpConstType = (int) tags.getByteAt(ci); // write cp_info // write constant type switch (cpConstType) { case JVM_CONSTANT_Utf8: { dos.writeByte(cpConstType); Symbol sym = getSymbolAt(ci); dos.writeShort((short) sym.getLength()); dos.write(sym.asByteArray()); if (DEBUG) debugMessage("CP[" + ci + "] = modified UTF-8 " + sym.asString()); break; } case JVM_CONSTANT_Unicode: throw new IllegalArgumentException("Unicode constant!"); case JVM_CONSTANT_Integer: dos.writeByte(cpConstType); dos.writeInt(getIntAt(ci)); if (DEBUG) debugMessage("CP[" + ci + "] = int " + getIntAt(ci)); break; case JVM_CONSTANT_Float: dos.writeByte(cpConstType); dos.writeFloat(getFloatAt(ci)); if (DEBUG) debugMessage("CP[" + ci + "] = float " + getFloatAt(ci)); break; case JVM_CONSTANT_Long: { dos.writeByte(cpConstType); long l = getLongAt(ci); // long entries occupy two pool entries ci++; dos.writeLong(l); break; } case JVM_CONSTANT_Double: dos.writeByte(cpConstType); dos.writeDouble(getDoubleAt(ci)); // double entries occupy two pool entries ci++; break; case JVM_CONSTANT_Class: { dos.writeByte(cpConstType); // Klass already resolved. ConstantPool constains klassOop. Klass refKls = (Klass) getObjAt(ci); String klassName = refKls.getName().asString(); Short s = (Short) utf8ToIndex.get(klassName); dos.writeShort(s.shortValue()); if (DEBUG) debugMessage("CP[" + ci + "] = class " + s); break; } // case JVM_CONSTANT_ClassIndex: case JVM_CONSTANT_UnresolvedClass: { dos.writeByte(JVM_CONSTANT_Class); String klassName = getSymbolAt(ci).asString(); Short s = (Short) utf8ToIndex.get(klassName); dos.writeShort(s.shortValue()); if (DEBUG) debugMessage("CP[" + ci + "] = class " + s); break; } case JVM_CONSTANT_String: { dos.writeByte(cpConstType); String str = OopUtilities.stringOopToString(getObjAt(ci)); Short s = (Short) utf8ToIndex.get(str); dos.writeShort(s.shortValue()); if (DEBUG) debugMessage("CP[" + ci + "] = string " + s); break; } // case JVM_CONSTANT_StringIndex: case JVM_CONSTANT_UnresolvedString: { dos.writeByte(JVM_CONSTANT_String); String val = getSymbolAt(ci).asString(); Short s = (Short) utf8ToIndex.get(val); dos.writeShort(s.shortValue()); if (DEBUG) debugMessage("CP[" + ci + "] = string " + s); break; } // all external, internal method/field references case JVM_CONSTANT_Fieldref: case JVM_CONSTANT_Methodref: case JVM_CONSTANT_InterfaceMethodref: { dos.writeByte(cpConstType); int value = getIntAt(ci); short klassIndex = (short) extractLowShortFromInt(value); short nameAndTypeIndex = (short) extractHighShortFromInt(value); dos.writeShort(klassIndex); dos.writeShort(nameAndTypeIndex); if (DEBUG) debugMessage( "CP[" + ci + "] = ref klass = " + klassIndex + ", N&T = " + nameAndTypeIndex); break; } case JVM_CONSTANT_NameAndType: { dos.writeByte(cpConstType); int value = getIntAt(ci); short nameIndex = (short) extractLowShortFromInt(value); short signatureIndex = (short) extractHighShortFromInt(value); dos.writeShort(nameIndex); dos.writeShort(signatureIndex); if (DEBUG) debugMessage( "CP[" + ci + "] = N&T name = " + nameIndex + ", type = " + signatureIndex); break; } } // switch } dos.flush(); return; }