It will be right if according to the following process:
step 1: create 'testTable',{NAME => 'log' , VERSIONS => 5 }
step 2: excute my code below
I will be wrong if uncomment the code :table.delete(new Delete(rowKey));
I will be run right agin If I comment the code and change the rowKey.
My code below :
public class GetRowVersionsTest extends TestCase
{
private final byte[] family = Bytes.toBytes("log");
private final byte[] qualifier = Bytes.toBytes("siteUrl");
private final byte[] rowKey = Bytes.toBytes(1000);
private final HTable table =
IDMHBaseConfiguration.getTable("testTable");
private final long ts1 = 1298529542218L;
private final long ts2 = ts1 + 100;
private final long ts3 = ts1 + 1000;
private final byte[] value1 = Bytes.toBytes("value1");
private final byte[] value2 = Bytes.toBytes("value2");
private final byte[] value3 = Bytes.toBytes("value3");
private void insert(final long ts, final byte[] value) throws
IOException
{
// table.setAutoFlush(false);
final Put put = new Put(rowKey);
put.add(family, qualifier, ts, value);
table.put(put);
}
private void sleep()
{
try
{
Thread.sleep(1000);
}
catch (final InterruptedException e)
{
e.printStackTrace();
}
}
@Test
public void testGetRowMultipleVersions() throws Exception
{
insert(ts1, value1);
sleep();
insert(ts2, value2);
sleep();
insert(ts3, value3);
sleep();
// check getRow with multiple versions
final Get get = new Get(rowKey);
get.setMaxVersions();
final Result r = table.get(get);
final List<KeyValue> list = r.list();
for (final KeyValue kv : list)
{
System.err.println(kv.getKey());
System.err.println(Bytes.toString(kv.getValue()));
}
final NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long,
byte[]>>> map = r.getMap();
final NavigableMap<byte[], NavigableMap<Long, byte[]>> familyMap =
map.get(family);
final NavigableMap<Long, byte[]> versionMap =
familyMap.get(qualifier);
for (final Map.Entry<Long, byte[]> entry : versionMap.entrySet())
{
System.err.println(entry.getKey());
System.err.println(Bytes.toString(entry.getValue()));
}
// assertTrue(versionMap.size() == 3);
// assertTrue(value1 == versionMap.get(ts1));
// assertTrue(value2 == versionMap.get(ts2));
// assertTrue(value3 == versionMap.get(ts3));
// table.delete(new Delete(rowKey));
// assertTrue(table.get(get).size() == 0);
// table.close();
}
On Thu, Feb 24, 2011 at 3:41 PM, Lars George <[email protected]> wrote:
> What error are you getting? The NPE?
>
> As Tatsuya pointed out, you are using the same time stamps:
>
> private final long ts2 = ts1 + 100;
>
> private final long ts3 = ts1 + 100;
>
> That cannot work, you are overriding cells.
>
> Lars
>
> On Thu, Feb 24, 2011 at 8:34 AM, 陈加俊 <[email protected]> wrote:
> > HTable object has not setAutoFlush. It's default value is true at my
> > cluster.So I set it true as follows ,but error is still the same.
> >
> > public class GetRowVersionsTest extends TestCase
> > {
> > private final byte[] family = Bytes.toBytes("log");
> >
> > private final byte[] qualifier = Bytes.toBytes("siteUrl");
> >
> > private final byte[] rowKey = Bytes.toBytes(1);
> >
> > private final long ts1 = 1298529542218L;
> >
> > private final long ts2 = ts1 + 100;
> >
> > private final long ts3 = ts1 + 100;
> >
> > private final byte[] value1 = Bytes.toBytes("value1");
> >
> > private final byte[] value2 = Bytes.toBytes("value2");
> >
> > private final byte[] value3 = Bytes.toBytes("value3");
> >
> > private void insert(final long ts, final byte[] value) throws
> > IOException
> > {
> > final HTable table =
> > IDMHBaseConfiguration.getTable(BigTableName.getSite());
> > table.setAutoFlush(false);
> > final Put put = new Put(rowKey);
> > put.add(family, qualifier, ts, value);
> > table.put(put);
> > }
> >
> > private void sleep()
> > {
> > try
> > {
> > Thread.sleep(1000);
> > }
> > catch (final InterruptedException e)
> > {
> > e.printStackTrace();
> > }
> > }
> >
> > @Test
> > public void testGetRowMultipleVersions() throws Exception
> > {
> > insert(ts1, value1);
> > sleep();
> > insert(ts2, value2);
> > sleep();
> > insert(ts3, value3);
> > sleep();
> >
> > // check getRow with multiple versions
> > final HTable table =
> > IDMHBaseConfiguration.getTable(BigTableName.getSite());
> > final Get get = new Get(rowKey);
> > get.setMaxVersions();
> > final Result r = table.get(get);
> >
> > final List<KeyValue> list = r.list();
> > for (final KeyValue kv : list)
> > {
> > System.err.println(kv.getKey());
> > System.err.println(Bytes.toString(kv.getValue()));
> > }
> >
> > final NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long,
> > byte[]>>> map = r.getMap();
> > final NavigableMap<byte[], NavigableMap<Long, byte[]>> familyMap =
> > map.get(family);
> > final NavigableMap<Long, byte[]> versionMap =
> > familyMap.get(qualifier);
> > for (final Map.Entry<Long, byte[]> entry : versionMap.entrySet())
> > {
> > System.err.println(entry.getKey());
> > System.err.println(Bytes.toString(entry.getValue()));
> > }
> > // assertTrue(versionMap.size() == 3);
> >
> > // assertTrue(value1 == versionMap.get(ts1));
> > // assertTrue(value2 == versionMap.get(ts2));
> > // assertTrue(value3 == versionMap.get(ts3));
> >
> > // table.delete(new Delete(rowKey));
> > // assertTrue(table.get(get).size() == 0);
> > // table.close();
> > }
> >
> > On Thu, Feb 24, 2011 at 3:26 PM, Ryan Rawson <[email protected]> wrote:
> >
> >> Does the HTable object have setAutoFlush(false) turned on by any chance?
> >>
> >> On Wed, Feb 23, 2011 at 11:22 PM, 陈加俊 <[email protected]> wrote:
> >> > line 89: final NavigableMap<byte[], NavigableMap<Long, byte[]>>
> >> > familyMap = map.get(family);
> >> > map is null ,
> >> > and strangely I use r.list() instead,
> >> > final List<KeyValue> list = r.list();
> >> > r is null !
> >> >
> >> >
> >> > 2011/2/24 Ryan Rawson <[email protected]>
> >> >>
> >> >> Which line is line 89?
> >> >>
> >> >> Also it's preferable to do:
> >> >> assertEquals(3, versionMap.size());
> >> >> vs:
> >> >> assertTrue(versionMap.size() == 3);
> >> >>
> >> >> since the error messages from the former are more descriptive
> >> >> "expected 3 was 2".
> >> >>
> >> >> looking at the code it looks like it should work...
> >> >>
> >> >> On Wed, Feb 23, 2011 at 11:07 PM, 陈加俊 <[email protected]> wrote:
> >> >> > This is my test case ,but I get NPE some times .
> >> >> >
> >> >> > java.lang.NullPointerException
> >> >> > at
> >> >> >
> >> >> >
> >>
> com.uuwatch.idm.hbase.GetRowVersionsTest.testGetRowMultipleVersions(GetRowVersionsTest.java:89)
> >> >> > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >> >> > at
> >> >> >
> >> >> >
> >>
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> >> >> > at
> >> >> >
> >> >> >
> >>
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> >> >> > at java.lang.reflect.Method.invoke(Method.java:597)
> >> >> > at
> >> >> >
> >> >> >
> >>
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
> >> >> > at
> >> >> >
> >> >> >
> >>
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
> >> >> > at
> >> >> >
> >> >> >
> >>
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
> >> >> > at
> >> >> >
> >> >> >
> >>
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
> >> >> > at
> >> >> >
> >> >> >
> >>
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
> >> >> > at
> >> >> >
> >> >> >
> >>
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
> >> >> > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
> >> >> > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
> >> >> > at
> org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
> >> >> > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
> >> >> > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
> >> >> > at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
> >> >> > at
> >> >> >
> >> >> >
> >>
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
> >> >> > at
> >> >> >
> >> >> >
> >>
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> >> >> > at
> >> >> >
> >> >> >
> >>
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
> >> >> > at
> >> >> >
> >> >> >
> >>
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
> >> >> > at
> >> >> >
> >> >> >
> >>
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
> >> >> > at
> >> >> >
> >> >> >
> >>
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> >> >> >
> >> >> > public class GetRowVersionsTest extends TestCase
> >> >> > {
> >> >> > private final byte[] family = Bytes.toBytes("log");
> >> >> >
> >> >> > private final byte[] qualifier = Bytes.toBytes("siteUrl");
> >> >> >
> >> >> > private final byte[] rowKey = Bytes.toBytes(1);
> >> >> >
> >> >> > private final HTable table =
> >> >> > IDMHBaseConfiguration.getTable(BigTableName.getSite());
> >> >> >
> >> >> > private final long ts1 = 1298529542218L;
> >> >> >
> >> >> > private final long ts2 = ts1 + 100;
> >> >> >
> >> >> > private final long ts3 = ts1 + 100;
> >> >> >
> >> >> > private final byte[] value1 = Bytes.toBytes("value1");
> >> >> >
> >> >> > private final byte[] value2 = Bytes.toBytes("value2");
> >> >> >
> >> >> > private final byte[] value3 = Bytes.toBytes("value3");
> >> >> >
> >> >> > private void insert(final long ts, final byte[] value) throws
> >> >> > IOException
> >> >> > {
> >> >> > final Put put = new Put(rowKey);
> >> >> > put.add(family, qualifier, ts, value);
> >> >> > table.put(put);
> >> >> > }
> >> >> >
> >> >> > private void sleep()
> >> >> > {
> >> >> > try
> >> >> > {
> >> >> > Thread.sleep(1000);
> >> >> > }
> >> >> > catch (final InterruptedException e)
> >> >> > {
> >> >> > e.printStackTrace();
> >> >> > }
> >> >> > }
> >> >> >
> >> >> > @Test
> >> >> > public void testGetRowMultipleVersions() throws Exception
> >> >> > {
> >> >> > insert(ts1, value1);
> >> >> > sleep();
> >> >> > insert(ts2, value2);
> >> >> > sleep();
> >> >> > insert(ts3, value3);
> >> >> > sleep();
> >> >> >
> >> >> > // check getRow with multiple versions
> >> >> > final Get get = new Get(rowKey);
> >> >> > get.setMaxVersions();
> >> >> > final Result r = table.get(get);
> >> >> > final NavigableMap<byte[], NavigableMap<byte[],
> >> >> > NavigableMap<Long,
> >> >> > byte[]>>> map = r.getMap();
> >> >> > final NavigableMap<byte[], NavigableMap<Long, byte[]>>
> >> familyMap
> >> >> > =
> >> >> > map.get(family);
> >> >> > final NavigableMap<Long, byte[]> versionMap =
> >> >> > familyMap.get(qualifier);
> >> >> > for (final Map.Entry<Long, byte[]> entry :
> >> versionMap.entrySet())
> >> >> > {
> >> >> > System.err.println(entry.getKey());
> >> >> > System.err.println(Bytes.toString(entry.getValue()));
> >> >> > }
> >> >> > // assertTrue(versionMap.size() == 3);
> >> >> >
> >> >> > // assertTrue(value1 == versionMap.get(ts1));
> >> >> > // assertTrue(value2 == versionMap.get(ts2));
> >> >> > // assertTrue(value3 == versionMap.get(ts3));
> >> >> >
> >> >> > // table.delete(new Delete(rowKey));
> >> >> > // assertTrue(table.get(get).size() == 0);
> >> >> > // table.close();
> >> >> > }
> >> >> > }
> >> >> >
> >> >> >
> >> >> > On Thu, Feb 24, 2011 at 11:07 AM, Tatsuya Kawano
> >> >> > <[email protected]>wrote:
> >> >> >
> >> >> >> Hi Jiajun,
> >> >> >>
> >> >> >> Make sure you don't have the same timestamp on every versions of
> >> puts;
> >> >> >> try
> >> >> >> to put Thread.sleep() in your test(?) codes when necessary.
> >> >> >>
> >> >> >> You might not want to specify the timestamp by yourself but want
> to
> >> let
> >> >> >> HBase to store appropriate ones.
> >> >> >>
> >> >> >> --
> >> >> >> Tatsuya Kawano (Mr.)
> >> >> >> Tokyo, Japan
> >> >> >>
> >> >> >>
> >> >> >> On Feb 24, 2011, at 11:30 AM, Ryan Rawson <[email protected]>
> >> wrote:
> >> >> >>
> >> >> >> > There are test cases for this, the functionality DOES work,
> >> something
> >> >> >> > is
> >> >> >> up...
> >> >> >> >
> >> >> >> > Without full code and full descriptions of your tables,
> debugging
> >> is
> >> >> >> > harder than it needs to be. It's probably a simple typo or
> >> >> >> > something,
> >> >> >> > check your code and table descriptions again. Many people rely
> on
> >> the
> >> >> >> > multi version query capabilities and it is very unlikely to be
> >> broken
> >> >> >> > in a released version of hbase.
> >> >> >> >
> >> >> >> > On Wed, Feb 23, 2011 at 6:27 PM, 陈加俊 <[email protected]>
> wrote:
> >> >> >> >> final List<KeyValue> list = result.list();
> >> >> >> >> for (final KeyValue it : list)
> >> >> >> >> {
> >> >> >> >> System.out.println(Bytes.toString(it.getKey()));
> >> >> >> >>
> System.out.println(Bytes.toString(it.getValue()));
> >> >> >> >> }
> >> >> >> >> I can only get the last version! why ? Is there any testcase
> in
> >> >> >> >> Hbase?
> >> >> >> >>
> >> >> >> >> On Thu, Feb 24, 2011 at 9:56 AM, 陈加俊 <[email protected]>
> >> wrote:
> >> >> >> >>
> >> >> >> >>> /**
> >> >> >> >>> * Create a sorted list of the KeyValue's in this result.
> >> >> >> >>> *
> >> >> >> >>> * @return The sorted list of KeyValue's.
> >> >> >> >>> */
> >> >> >> >>> public List<KeyValue> list() {
> >> >> >> >>> if(this.kvs == null) {
> >> >> >> >>> readFields();
> >> >> >> >>> }
> >> >> >> >>> return isEmpty()? null: Arrays.asList(sorted());
> >> >> >> >>> }
> >> >> >> >>>
> >> >> >> >>> I will try it . Thank you very much!
> >> >> >> >>>
> >> >> >> >>> On Thu, Feb 24, 2011 at 9:45 AM, Buttler, David <
> >> [email protected]>
> >> >> >> wrote:
> >> >> >> >>>
> >> >> >> >>>> Result.list() ?
> >> >> >> >>>> Putting the hbase source into your IDE of choice (yay
> Eclipse!)
> >> is
> >> >> >> really
> >> >> >> >>>> helpful
> >> >> >> >>>>
> >> >> >> >>>> Dave
> >> >> >> >>>>
> >> >> >> >>>>
> >> >> >> >>>> -----Original Message-----
> >> >> >> >>>> From: 陈加俊 [mailto:[email protected]]
> >> >> >> >>>> Sent: Wednesday, February 23, 2011 5:42 PM
> >> >> >> >>>> To: [email protected]
> >> >> >> >>>> Cc: Buttler, David
> >> >> >> >>>> Subject: Re: I can't get many versions of the specified
> >> column,but
> >> >> >> only
> >> >> >> >>>> get the latest version of the specified column
> >> >> >> >>>>
> >> >> >> >>>> Thank you David !
> >> >> >> >>>>
> >> >> >> >>>> I alter the table schema as follow:
> >> >> >> >>>>
> >> >> >> >>>>> alter 'cjjIndexPageModify', {NAME => 'log' , VERSIONS => 5 ,
> >> >> >> >>>>> METHOD
> >> >> >> =>
> >> >> >> >>>> 'add'}
> >> >> >> >>>>
> >> >> >> >>>> How to iterate over KeyValues? which method in Result?
> >> >> >> >>>>
> >> >> >> >>>> On Thu, Feb 24, 2011 at 9:27 AM, Buttler, David
> >> >> >> >>>> <[email protected]>
> >> >> >> >>>> wrote:
> >> >> >> >>>>
> >> >> >> >>>>> What is your table schema set to? By default it holds 3
> >> >> >> >>>>> versions.
> >> >> >> >>>>> Also, you might iterating over KeyValues instead of using
> the
> >> Map
> >> >> >> since
> >> >> >> >>>> you
> >> >> >> >>>>> don't really care about the organization, just the time.
> >> >> >> >>>>>
> >> >> >> >>>>> Dave
> >> >> >> >>>>>
> >> >> >> >>>>> -----Original Message-----
> >> >> >> >>>>> From: 陈加俊 [mailto:[email protected]]
> >> >> >> >>>>> Sent: Wednesday, February 23, 2011 5:22 PM
> >> >> >> >>>>> To: [email protected]
> >> >> >> >>>>> Cc: Stack
> >> >> >> >>>>> Subject: Re: I can't get many versions of the specified
> >> >> >> >>>>> column,but
> >> >> >> only
> >> >> >> >>>> get
> >> >> >> >>>>> the latest version of the specified column
> >> >> >> >>>>>
> >> >> >> >>>>> I execute it five times at diffrent time.
> >> >> >> >>>>>
> >> >> >> >>>>> //put data by version
> >> >> >> >>>>>
> >> >> >> >>>>> final Put p = new Put(key); // key
> >> >> >> >>>>> final long ts = System.currentTimeMillis();
> >> >> >> >>>>> p.add(FAMILY, q1, ts,v1);
> >> >> >> >>>>> p.add(FAMILY, q2, ts,v2);
> >> >> >> >>>>> p.add(FAMILY, q3, ts,v3);
> >> >> >> >>>>> table.put(p);
> >> >> >> >>>>>
> >> >> >> >>>>> So I can get five versions ,right?
> >> >> >> >>>>>
> >> >> >> >>>>> On Thu, Feb 24, 2011 at 2:06 AM, Stack <[email protected]>
> >> wrote:
> >> >> >> >>>>>
> >> >> >> >>>>>> What do you get for a result?
> >> >> >> >>>>>>
> >> >> >> >>>>>> You are only entering a single version of each column, a
> >> single
> >> >> >> >>>>>> version of FAMILY:q1, a single version FAMILY:q2, and a
> >> >> >> >>>>>> FAMILY:q3.
> >> >> >> >>>>>>
> >> >> >> >>>>>> St.Ack
> >> >> >> >>>>>>
> >> >> >> >>>>>> On Wed, Feb 23, 2011 at 2:54 AM, 陈加俊 <[email protected]
> >
> >> >> >> >>>>>> wrote:
> >> >> >> >>>>>>> I can't get many versions of the specified column,but only
> >> get
> >> >> >> >>>>>>> the
> >> >> >> >>>>> latest
> >> >> >> >>>>>>> version of the specified column. Is there anyone help me?
> >> >> >> >>>>>>>
> >> >> >> >>>>>>> //put data by version
> >> >> >> >>>>>>>
> >> >> >> >>>>>>> final Put p = new Put(key); // key
> >> >> >> >>>>>>> final long ts = System.currentTimeMillis();
> >> >> >> >>>>>>> p.add(FAMILY, q1, ts,v1);
> >> >> >> >>>>>>> p.add(FAMILY, q2, ts,v2);
> >> >> >> >>>>>>> p.add(FAMILY, q3, ts,v3);
> >> >> >> >>>>>>>
> >> >> >> >>>>>>> table.put(p);
> >> >> >> >>>>>>>
> >> >> >> >>>>>>>
> >> >> >> >>>>>>> //get all versions of data
> >> >> >> >>>>>>>
> >> >> >> >>>>>>> final Get get = new Get(key);
> >> >> >> >>>>>>> get.addFamily(FAMILY);
> >> >> >> >>>>>>> get.setMaxVersions(10);
> >> >> >> >>>>>>> final Result result = htable.get(get);
> >> >> >> >>>>>>>
> >> >> >> >>>>>>> final NavigableMap<byte[], NavigableMap<byte[],
> >> >> >> >>>>>>> NavigableMap<Long, byte[]>>> map = result.getMap();
> >> >> >> >>>>>>> final Set<Entry<byte[], NavigableMap<byte[],
> >> >> >> >>>>>>> NavigableMap<Long, byte[]>>>> entrySet = map.entrySet();
> >> >> >> >>>>>>> final Iterator<Entry<byte[], NavigableMap<byte[],
> >> >> >> >>>>>>> NavigableMap<Long, byte[]>>>> iterator = entrySet
> >> >> >> >>>>>>> .iterator();
> >> >> >> >>>>>>> while (iterator.hasNext())
> >> >> >> >>>>>>> {
> >> >> >> >>>>>>> final Entry<byte[], NavigableMap<byte[],
> >> >> >> >>>>>>> NavigableMap<Long, byte[]>>> next = iterator.next();
> >> >> >> >>>>>>>
> >> System.out.println(Bytes.toString(next.getKey()));
> >> >> >> >>>>> //family
> >> >> >> >>>>>>> for (final Entry<byte[], NavigableMap<Long,
> >> >> >> >>>>>>> byte[]>>
> >> >> >> >>>>>>> item : next.getValue().entrySet())
> >> >> >> >>>>>>> {
> >> >> >> >>>>>>>
> >> >> >> >>>>>>> System.out.println(Bytes.toString(item.getKey()));
> >> >> >> >>>>>>> for (final Entry<Long, byte[]> _item :
> >> >> >> >>>>>>> item.getValue().entrySet())
> >> >> >> >>>>>>> {
> >> >> >> >>>>>>> System.out.println(_item.getKey());
> //q
> >> >> >> >>>>>>>
> >> >> >> >>>>>> System.out.println(Bytes.toString(_item.getValue()));
> >> >> >> >>>>>>> //value
> >> >> >> >>>>>>> }
> >> >> >> >>>>>>> }
> >> >> >> >>>>>>>
> >> >> >> >>>>>>> }
> >> >> >> >>>>>>>
> >> >> >> >>>>>>> --
> >> >> >> >>>>>>> Thanks & Best regards
> >> >> >> >>>>>>> jiajun
> >> >> >> >>>>>>>
> >> >> >> >>>>>>
> >> >> >> >>>>>
> >> >> >> >>>>>
> >> >> >> >>>>>
> >> >> >> >>>>> --
> >> >> >> >>>>> Thanks & Best regards
> >> >> >> >>>>> jiajun
> >> >> >> >>>>>
> >> >> >> >>>>
> >> >> >> >>>>
> >> >> >> >>>>
> >> >> >> >>>> --
> >> >> >> >>>> Thanks & Best regards
> >> >> >> >>>> jiajun
> >> >> >> >>>>
> >> >> >> >>>
> >> >> >> >>>
> >> >> >> >>>
> >> >> >> >>> --
> >> >> >> >>> Thanks & Best regards
> >> >> >> >>> jiajun
> >> >> >> >>>
> >> >> >> >>>
> >> >> >> >>
> >> >> >> >>
> >> >> >> >> --
> >> >> >> >> Thanks & Best regards
> >> >> >> >> jiajun
> >> >> >> >>
> >> >> >>
> >> >> >
> >> >> >
> >> >> >
> >> >> > --
> >> >> > Thanks & Best regards
> >> >> > jiajun
> >> >> >
> >> >
> >> >
> >> >
> >> > --
> >> > Thanks & Best regards
> >> > jiajun
> >> >
> >> >
> >>
> >
> >
> >
> > --
> > Thanks & Best regards
> > jiajun
> >
>
--
Thanks & Best regards
jiajun